第二課:
1、定位到是否註冊的代碼
1)運行程序
2)打開可執行模塊窗口,雙擊本程序的模塊,進入到反彙編窗口,如果代碼如下所示:
00401000 6A DB 6A ; CHAR 'j'
00401001 FF DB FF
00401002 68 DB 68 ; CHAR 'h'
00401003 57 DB 57 ; CHAR 'W'
00401004 BB DB BB
00401005 45 DB 45 ; CHAR 'E'
00401006 00 DB 00
則可以在該區域右鍵->分析->從模塊中刪除分析,就可以看到反彙編代碼,如下所示:
00401000 6A FF PUSH -0x1
00401002 68 57BB4500 PUSH LogSee.0045BB57
00401007 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040100D 50 PUSH EAX
3)查找所有字符串,找到含有“未註冊”字樣的字符串,發現在這些字符串前都有
00409460 833D 30BA4700 00 CMP DWORD PTR DS:[0x47BA30],0x0 這一句,由此可確定是否註冊的判斷值放在DWORD PTR DS:[0x47BA30]內存中
4)在反彙編窗口,右鍵->查找->所有常量,查找0X47BA30,查找結果如下:
參考位於 LogSee: 到常量 47BA30
地址 反彙編 註釋
00406354 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00408558 CMP DWORD PTR DS:[0x47BA30],EBX
00408768 MOV DWORD PTR DS:[0x47BA30],EBX
00409460 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00410B7E CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00410F3F CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00411186 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
004114BF CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
004117FE CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00411EDC CMP DWORD PTR DS:[0x47BA30],EBP
004123E7 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
004126F8 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
00412A6F MOV DWORD PTR DS:[0x47BA30],0x1 (初始 CPU 選擇)
00412CF6 MOV DWORD PTR DS:[0x47BA30],0x1 DS:[0047BA30]=00000000
00414278 CMP DWORD PTR DS:[0x47BA30],0x0 DS:[0047BA30]=00000000
重點關注紅色的三行結果, 大概就是我們想要找的地方了,結合上下文的代碼,或者下斷跟蹤調試,即可定位到判斷是否已註冊的地方。
第四課
1、定位到關鍵call
有些程序在搜索字符串的時候,會搜索到多個“註冊碼不正確”的字符串,在使用這些字符串的代碼前面基本都有類似如下的代碼:
0059D1EF |. 59 pop ecx ; recorder.0059D1F5
0059D1F0 |. E8 AFF8FFFF call recorder.0059CAA4
0059D1F5 |. 84C0 test al,al
0059D1F7 |. 74 04 je short recorder.0059D1FD
關注紅色的那一行,如果多次出現類似的代碼,則大概就可以判斷0059CAA4 是一個關鍵call。(方法與第二課中的類似)
2、retn和retn 0x4的問題
在找到關鍵call後,可以修改關鍵call的代碼,直接設置eax的值,然後返回。查看這個call的代碼,發現函數返回有retn 和retn 0x4兩種形式,如果不知具體該用哪一種形式,可以兩種都試試,也可以對該函數進行跟蹤,先跑一遍,看看是由哪一種形式返回的,即可確定了。
如果對關鍵跳轉進行了修改而程序仍舊提示未註冊的話,很有可能就是有多處判斷,這種情況下,就只能去找關鍵call並修改返回值了。