程序是如何检测调试器的呢?
首先,用OD载入没有断在入口点,是TlsCallback。所以,只需要在TlsCallback函数下断点。
其次,在疑似WinMain函数里,看到这样的代码:
004114D4 68 4B104100 PUSH crackme.0041104B
004114D9 64:FF35 0000000>PUSH DWORD PTR FS:[0]
004114E0 64:8925 0000000>MOV DWORD PTR FS:[0], ESP
004114E7 83EC 10 SUB ESP, 10
004114EA 64:A1 30000000 MOV EAX, DWORD PTR [COLOR="Red"]FS:[30][/COLOR]
004114F0 8B40 68 MOV EAX, DWORD PTR [COLOR="Red"]DS:[EAX+68][/COLOR]
004114F3 83E0 70 AND EAX, 70
004114F6 85C0 TEST EAX, EAX
004114F8 ^ 0F84 4DFBFFFF JE crackme.0041104B
再次,在按钮事件响应中,有这样的代码:
0041195B 64:A1 30000000 MOV EAX, DWORD PTR [COLOR="Red"]FS:[30][/COLOR]
00411961 8B40 18 MOV EAX, DWORD PTR [COLOR="Red"]DS:[EAX+18][/COLOR]
00411964 8B40 10 MOV EAX, DWORD PTR [COLOR="Red"]DS:[EAX+10][/COLOR]
00411967 85C0 TEST EAX, EAX
00411969 ^\0F85 B3F7FFFF JNZ crackme.00411122
以及这样的代码
00411A1F 64:A1 30000000 MOV EAX, DWORD PTR [COLOR="Red"]FS:[30][/COLOR]
00411A25 8A40 02 MOV AL, BYTE PTR[COLOR="Red"] DS:[EAX+2][/COLOR]
00411A28 84C0 TEST AL, AL
00411A2A ^ 0F85 F2F6FFFF JNZ crackme.00411122
而在计算注册码的过程中,有这样的代码:
00411A57 64:A1 30000000 MOV EAX, DWORD PTR [COLOR="Red"]FS:[30][/COLOR]
00411A5D 8B40 68 MOV EAX, DWORD PTR [COLOR="Red"]DS:[EAX+68[/COLOR]]
00411A60 8945 DC MOV DWORD PTR SS:[EBP-24], EAX
其中这个[ebp-24]是参与了注册码的运算的:
00411AE5 DA45 DC FIADD DWORD PTR SS:[EBP-24]
以上就是我所发现的所有检测点了。不知道有什么遗漏没有。
至于以上检测调试器的方法都是什么原理,可以参考《脱壳的艺术》(在论坛搜索下载),以及这篇文章
http://bbs.pediy.com/showthread.php?t=71113
与上一版有什么差别,没具体看,只看到把一常数100变成128了。
还是明码比较。最简单的方法,在msvcr90d.strcmp处下断点,就可以拦到真码了。
name:
Pain++
code:
e315447
图就不截了。
PS.那些不能运行的朋友们,我估计去装一个MS VC 2008 REDISTRIBUTE,应该就好了。