前不久破解一个软件的时候遇到了各种反调试,折腾的自己各种难受,最终爆破了之后感觉心情大快就顺手写下了这篇文章
使用工具
十六进制分析工具:winhex
查壳工具:PEID
脱壳工具:ollydump插件或者LordPE
脱壳修复工具:ImportREC
逆向工具:OllyDbg
分析过程
PE修复
打开源程序所在文件夹,发现有一个crackme,双机运行程序发现有这个提示:
上述地址分别相对于50450000之后偏移04h(4C01),06h(0300),08h,0Ch,10h,14h,16h对比之后发现在运行平台上为1F0h。
而我们熟知运行平台如下图:
初步分析
看到程序的入口点应该想到程序使用了较为高级的花指令,伪装了一些API调用,然后通过call eax致使无法查到这些API的调用。
根据最开始的提示Error(标题栏)和“注册码错误”,使用字符串查找如下:
去除单步异常
退回到OEP一步步分析:运行到这一步时程序会自动终止:
上面主要是通过调用系统快照函数(红色字体标注部分),然后遍历这个系统当前的进程ID,直到找到当前dump的进程ID后跳走,数据窗口中跟踪[local.72]地址,发现确实在遍历进程名和ID。证实了上面我的想法。
而在以下代码中发现了第二层反调试的真面目:
改为jmp 00401117E,让它恒跳走,让程序误以为父进程校验正确。
保存文件之后想到刚开始注册时会有成功或者失败提示,那么是调用了MessageBox这个函数。根据这个信息,我们想到了查找函数。于是查找api调用如下
去除时间差校验
在调用的API中发现了GetDlgItem,这是一个破绽。直接下int 3断点,运行之后发现自己还没来得及输入用户名和注册码程序自动退出,这让我想到刚刚主窗口中的两个可疑的函数SetTimer
两个都是SetTimer,这个就能解释之前程序会自动退出的原因了,SetTmier函数即为每隔固定的一个时间向所在窗口发送消息。上面这段应该发送的是WM_CLOSE而销毁了窗口。,分析代码知道一个是1000ms一个是10000ms,而我们在反调试分析代码过程中所需要的时间远远大于这些时间,所以自然会退出。这也是利用调试时间差起到反调试的思路。
将timeout参数值改成FFFF,时间应该我们足够逆向分析用了。保存文件之后载入文件,进一步分析
逆向分析
在getdlgitem上下int 3断点,成功断下:
程序使用SendMessageA,将字符串的内容送至00403074和004030F4两处,避免使用GetDlgItemTextA函数直接能获取明文。
单步跟踪

发现算法在call eax之后来到如下代码。跟进之后算法分析见代码中注释:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!