Delphi & BC++
使用Detect it Easy工具確定軟件使用的編譯器為Delphi或者是BC++,這兩個編譯器的按鈕特征碼相同。
OD載入程序,反匯編窗口右鍵->查找->二進制字符串:
然后在HEX窗口輸入特征碼,注意Delphi和BC++的特征碼是相同的(“740E8BD38B83????????FF93????????”):
注意勾選整個塊。
特征碼中的問號代表任意數據。
在特征碼的下面都會傳下一個CALL,然后我們在每個特征碼的下面的CALL下斷點:
然后CTRL+L,在所有的特征碼下面的CALL下斷點。因為我們不知道是哪一個按鈕,所以需要在每個按鈕都下斷點,如果程序比較小,很快,如果程序比較大,按鈕事件比較多,可以使用腳本來下斷點。
斷點下完之后,F9運行程序,然后點擊關鍵的注冊之類的按鈕,程序會停當前按鈕的CALL處,然后F7進CALL,就可以找關鍵CALL和關鍵跳了。
VB
使用同樣的方法搜索VB的特征碼(“816C24”):
在每個jmp處下斷點,然后運行程序,來到斷點處,jmp跟過去之后就是按鈕事件的處理過程了。
MFC
注意,使用MFC和VC++編寫的程序,使用PEiD查殼時,都會顯示是Visual C++6.0的編譯器,兩者的區分方法是,使用OD載入程序,在E窗口中,MFC的程序會調用一個mfc42.dll的動態鏈接庫文件,而VC++的程序不會調用這個庫。
載入MFC程序,在E窗口中雙擊mfc42.dll,跟進去,然后反匯編窗口中右鍵->查找->命令:
“sub eax,0a”,找到之后,在特征碼的下面會有一個je跳轉,選中je命令行,然后按回車,程序會跟隨到跳轉處,來到目標地址,找下面的一個CALL,下斷點:
如果je跳轉之后,沒有CALL,那就不用管這個特征碼,繼續查找下一個特征碼,知道找到所有的CALL為止。然后全速運行程序,點擊按鈕之后,程序會在斷點處停止,然后在上下文找關鍵CALL和關鍵跳即可。
易語言
注意,易語言編寫的程序,使用PEiD查殼時,顯示的編譯器也是Visual C++6.0,使用OD載入程序,直接在反匯編窗口中右鍵->查找->二進制字符串,輸入易語言的特征碼:“FF 25”,如果能夠找到,就說明是易語言編寫的程序。
易語言體:
可以看到有一堆的jmp指令,以上就能判斷是易語言程序。
下一步查找易語言的按鈕事件:二進制字符串“FF 55 FC 5F 5E»ò(e-debug)”,找到之后,會來到CALL處,直接下斷:
查找剩下的,所有地方都下斷點,然后F9運行程序開始調試。
易語言程序還可以使用另一種方式來查找按鈕事件,使用E-debug工具:
使用OPEN載入易語言程序,然后點擊START,運行程序,點擊按鈕,會顯示事件發生的地址:
記下事件發生的地址,然后使用OD載入程序,跟蹤到這個地址下斷點:
Ctrl+G,輸入要跟隨的表達式,輸入剛才記錄的地址,下斷點:
F9運行程序,觸發斷點事件,即可斷在此處。
VC++
使用PEiD查殼,查找的編譯器為VC++6.0,如果找不到易語言和MFC的標志,那就可以判斷是vc++寫的程序,按鈕事件查找方法,直接OD載入程序,在反匯編窗口右鍵->查找->所有命令,輸入特征碼:“sub eax,0a”:
雙擊跟進去,在下面會有一個je:
選中之后,回車,跟過去,在下面的CALL下斷點:
按照上面的方式找到所有的CALL下斷點。
然后F9運行程序,點擊按鈕,程序來到斷點處,F7跟進去,注意,進去之后還不是核心按鍵處理程序,按兩次F8之后,才來到核心代碼處:
萬能斷點
不需要知道程序使用的編譯器和編譯語言,直接OD載入程序,直接運行程序,輸入假碼之后,不要點擊按鈕:
查看user32模塊:
來到user32模塊之后,搜索特征碼,右鍵->查找->二進制字符串:“F3A58BC883E103F3A4E8”
然后下斷點,找到所有的都要下斷點。然后回到程序,點擊按鈕,程序暫停,返回OD,alt+F9,執行到用戶代碼:
然后就到了按鍵事件處理的代碼了。