按鈕事件
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,執行到用戶代碼:
然後就到了按鍵事件處理的代碼了。
按鈕事件