写在前面
文章仅供学习,切勿用于商业用途,出于版权原因,文章不提供资源下载。
论坛上较早之前已经有前辈对IDM的序列号算法进行过逆向分析
以及最近有师傅尝试对本篇文章对象相同的版本进行了逆向分析,但是比较遗憾的是该文章并没有完全对IDM过注册限制进行逆向分析,但是值得一题的是作者提供了较为详细的处理过注册限制一般方法,还是比较值得初学者学习的。
绕过注册验证
这里笔者不打算从注册表出发。
首先不妨禁用IDM的动态基址,方便我们IDA跟踪。修改如下
修改后程序正常运行,也可以验证这里没有完整性校验。
提示
可以看到提示IDM试用期已到,从这个对话框入手可能找到无限使用的逻辑,但是不一定有监视注册表读写方便,笔者不从这里下手。
点击确定后可以看到提示注册
不如就从这里入手,比较简单的想法是对获取编辑框文本的函数下断点。经过测试,这里获取内容的API是GetDlgTiemTextA
,下断后随意填写内容,确定后成功断下,进行两层栈回溯,来到0051FCC5
在IDA中
笔者对ShowErrorDlg
函数进行了简单的重命名,它的行为很容易确定,这里不多解释。
可以看到这里对输入的长度进行了判断,所以可以猜测注册逻辑在这附近,可以看到有很多全局变量例如dword_75CE00
充当着标志的作用,我们猜测有一个全局变量标志着是否注册。
简单绕过错误输入的提示框,patch点如下:
1 2 3 4 5 6 |
|
patch后再次运行,输入后发现程序直接退出,没有提示错误输入,我们重新跟踪函数0051FB70
,跟踪到如下位置时
发现像一个全局变量写入了0,并尝试Post一个消息,我们查看这个变量的一些引用。在004039E6
位置
可以猜测到这是与注册相关。我们尝试在程序启动时修改这个字段的值
默认为1,我们修改为0,尝试运行
绕过假序列号验证
经过上面测试,基本上可以确定这个标志的作用,但是还有其他的一些验证对注册码进行了校验,简单的跟踪方法是,在xdbg中搜索这个字符串,对其引用位置下断,筛选有效位置。笔者这里对静态字段750D2C
中的内容在PE中进行修改。
我们继续绕过假冒序列号验证,笔者这里通过字符串筛选的有效位置为:00451E97
向上回溯,简单的发现如下
尝试修改v112为0,放行程序
可以看到程序运行了起来。老手段,将返回值为3的地方patch为0即可(00450B87)。
但是过了一段时间之后,另一个验证接踵而至。
绕过定时结束程序
提示过后过一段时间程序自动退出,笔者尝试在一些退出函数中下断,没有收获什么有用的信息,根据这个对话框进行回溯也没有什么结果,因为退出的逻辑与显示对话框的逻辑是分开的。读者可以尝试线程相关的函数。笔者在分析中发现程序大量使用了SetTimer函数,猜测可能是检测到非法注册信息后使用定时器来结束程序,当然因为定时器太多,分析起来也比较麻烦。
这里从750D2C
字段下手,因为不管是使用定时器或者线程定时检测注册信息,还是使用定时器去结束进程,在调用这些逻辑之前大概率是会再次读取750D2C
这个字段的。尝试对这个字段下硬件访问断点。
重新跑起来,筛选敏感位置0046B4DF
,再其下方我们发现取了一些随机值,然后设置了一些定时器,如下:
这个函数中设置了很多定时器,我们在定时器位置下断,尝试直接让J_SetTimer返回绕过。绕过后程序果然没有退出,也没有提示假序列号,经过尝试关键的位置在0046BC0D
,如下,绕过两个Timer即可
如上,可以看到在下载东西时还会验证,简单的跳过这个MessageBox(0046C76A)即可
还有一个注册窗口,对CreateDialogIndirectParamA
下断栈回溯,找到patch点:004921F8,直接跳过窗口创建即可,如下
还有一个小检查,对MessageBoxW
下断跳过即可 patch:00472CCA
程序会启动进程IDMGrHlp.exe
经过测试命令行ch = 3
如下时表示检测到了注册码
1 |
|
笔者处理方法也非常粗暴,patch:0048F8F6
,可能去IDMGrHlp.exe里Patch比较好,但是在这里patch后暂时没发现什么异常。
总结
很少见到MFC图形界面程序了,但是开始定位定时结束的逻辑时因为方向出了一些问题导致花了一些时间。总的来说暴力破解肯定是不如注册机优雅,但确实是比较有效率。