程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> MASM的反反匯編技術

MASM的反反匯編技術

編輯:匯編語言

由於匯編語言是與機器語言機器碼一一對應的,所以程序的代碼非常簡潔,編譯、鏈接程序不會在其中加入任何其它代碼,所以,用Win32DASM等把匯編工具反匯編匯編語言寫的程序,其列出的匯編代碼幾乎與編寫的順序、過程、代碼一模一樣,這也是匯編語言簡潔的證據。
  但是這種過於簡潔的代碼卻給了破解者提供了方便,破解者只需要有一定的Windows SDK編程與匯編的經驗,破解就非常簡單,根本不需要用SoftICE這些動態工具就可以破解。於是,相應的防止跟蹤的技術就出來了,比如花指令、不按規則調用API等等,今天就花指令和大家研究研究。
  花指令,其實就是在程序中加入一些字節來干擾靜態工具反匯編,畢竟匯編工具沒有人的思維,所以這招非常好騙。
  打開EditPlus,新建一個ASM - Sample文件,輸入以下代碼:
.386
.Model Flat, StdCall
  Option Casemap :None

  Include windows.inc
  Include user32.inc
  Include kernel32.inc

  IncludeLib user32.lib
  IncludeLib kernel32.lib
.data
  Welcome db "歡迎來到匯編的世界",0
.CODE
  START:
  invoke MessageBox,0,offset Welcome,0,0
  invoke ExitProcess,0
  END START
  保存,Ctrl + 1編譯。
  用Win32DASM打開編譯後的文件,可以在其菜單命令[函數]->[輸入]中看到我們使用了的MessageBox與ExitProcess名字,在菜單命令[參考]->[字符串]中看到我們定義的字符串Welcome的值,假如您的程序這段代碼要做的是在用戶輸入錯誤的注冊碼後報錯,那麼,破解者只需要找到對話框顯示的字符串使用的地址,然後向上查找跳到此地址的跳轉指令,更改指令就能輕易破解,我們要做的,就是把字符串隱藏起來,不讓破解者輕易找到它的地址,如下:
  ;先關閉Win32DASM(以下同).
  ... ...
  lea eax,Welcome
  invoke MessageBox,0,eax,0,0
  ... ...
  也就是說,我們並沒有使用花指令,而是在使用字符串時先把字符串的地址傳給eax,然後再把eax做為參數傳給MessageBox,這樣做,Win23DASM這些反匯編工具就無法識別了,好,用Win32DASM重新打開編譯的文件,在[參考]菜單中,[字符串]這一項灰色顯示,提示這個程序沒有字符串,騙過它了!^_^
  還有就是使用花指令,花指令不但可以使反匯編工具無法識別出字符串,更會讓它們把匯編出錯誤的代碼,花指令一般都是使用一些無用的字節來進行干擾,但是干擾反匯編的字節仍是可以使用的,像這樣子:
  ... ...
  jz @F
  jnz @F
   www db "歡迎來到匯編世界",0
  @@:
  lea eax,www
  lea ebx,Welcome
  invoke MessageBox,0,eax,ebx,0
  invoke ExitProcess,0
  ... ...
  編譯後再用Win32DASM打開EXE,發現不但[字符串]這一項灰色顯示,反匯編出來的代碼變得面目全非,現在的程序只有很少的代碼,如果代碼一多,破解者不暈才怪,不過這樣只會把一些初級破解者難倒,有經驗的破解者根據jz與jnz的跳轉是否指向不存在的地址而知道使用了花指令,還可以根據MessageBox的使用地址來進行分析,我們現在要做的就是使用手工調用API加花指令來騙反匯編工具,如下:
  ... ...
  lea eax,Welcome
  push 0
  push 0
  push eax
  push 0
  jz @F
  jnz @F
   www db "歡迎來到匯編世界",0
  @@:
  call [MessageBox]
  invoke ExitProcess,0
  ... ...
  (上述代碼WinDASM32黃金版能正確識別)
  也就是說,在壓入參數後,不要馬上使用call來調用API,而是在調用前使用花指令,結果會怎樣?編譯後進行反匯編,看看吧,不但[字符串]這一項灰色顯示,[函數]->[輸入]一項也是灰色,哈,騙過了!再看看把匯編出來的代碼,天啦,亂七八糟的,如果這些代碼是在一個幾百K的程序中,我看那個破解者如何應付,哈,他不暈才怪!
  再來點狠的:
;=================
;完整API花指令示例:
;=================
.386
.Model Flat, StdCall
Option Casemap :None   ; 不區分大小寫(對API與API常數無效)
;_____________________________________________________________
Include windows.inc
Include user32.inc
Include kernel32.inc

IncludeLib user32.lib
IncludeLib kernel32.lib
.CODE
START:
  push 0
  push 0
  push offset Welcome
  push 0
  jz @F
  jnz @F
  Welcome db "Welcome",0   
@@:
  mov eax,[MessageBox+4]
  sub eax,4
  jnz @F
    Welcome1 db "Welcome",0   
@@:
  call eax
  invoke ExitProcess,0
  END START
  再看看反匯編的代碼,更加!@$$%#!@#$。
  順便說一句,上面的"完整API花指令示例"對付SoftICE一樣有效,雖然SoftICE能用MessageBoxA中斷上面的程序,但是,它反匯編出來的代碼一樣是慘不忍睹,

  不過,程序中也不要過份使用花指令啦,一般只有在關鍵的代碼才使用這些,如果您整個程序都使用花指令,不但會讓破解者惱火,也會讓你自己惱火的--這麼多$%@$!@##@#的代碼,您怎麼維護啊。哈...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved