第二课:
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并修改返回值了。