視頻筆記(一)

第二課:

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並修改返回值了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章