-
-
[旧帖]
求教一段反调试代码!
0.00雪花
-
发表于:
2010-7-19 01:51
3838
-
004B4C88 E8 00000000 call 182.004B4C8D
004B4C8D 830424 2D add dword ptr ss:[esp],2D ; 设置int3中断的处理例程的内存地址,是4B4CBA。
004B4C91 64:FF35 00000000 push dword ptr fs:[0]
004B4C98 64:8925 00000000 mov dword ptr fs:[0],esp
004B4C9F 33C0 xor eax,eax
004B4CA1 CC int3 ; int3中断,正常执行时会跳到下面的4B4CBA(处理例程)
004B4CA2 64:8F05 00000000 pop dword ptr fs:[0]
004B4CA9 83C4 04 add esp,4
004B4CAC 85C0 test eax,eax
004B4CAE 74 04 je short 182.004B4CB4
004B4CB0 33C0 xor eax,eax ; 在正常执行时,返回值是0。
004B4CB2 EB 05 jmp short 182.004B4CB9
004B4CB4 B8 01000000 mov eax,1 ; 在调试器里,返回值是1。
004B4CB9 C3 retn
004B4CBA 8B4424 0C mov eax,dword ptr ss:[esp+C] ; int3的处理例程开始,以下四行代码是必要的。
004B4CBE C780 B0000000 FFFFFFFF mov dword ptr ds:[eax+B0],-1
004B4CC8 FF80 B8000000 inc dword ptr ds:[eax+B8]
004B4CCE 33C0 xor eax,eax
004B4CD0 90 nop ; 这里可以放入自己的代码,如对以后执行代码的解密,
004B4CD1 90 nop ; 或者预先设置以后执行的代码。在调试器里这些代码是不执行的。
004B4CD2 C3 retn
这里采用了INT3断点来区分调试器 还是真实执行!
问题:具体流程
如果是调试器运行到INT3后,会忽略掉断点,继续执行,一直执行到004B4CB9,然后返回
如果是真实程序是不是运行到INT3后,会跳到004B4CBA,去处理例程和后门的代码,那么004B4CA2---004B4CB9 中间的代码就不会被执行,对吗?如果是这样,那中间判断返回值是0 还是1 有意义吗?
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法