GIF Movie Gear逆向分析注册算法之我见。
本帖最后由 zcl0317 于 2018-4-15 11:25 编辑鉴于前2天写了个小CM的算法分析,可能是太简单,基本没人看。这2天又着磨着弄个自认为比较难的。实现这个过程花了2天时间,不敢独享。写出过程跟大家探讨一下,有错的地方还请高手指点。
这次分析的软件是GIF Movie Gear Version 3.0.2。Microsoft Visual C++ 6.0编译,无壳!
软件安装后注册项在HELP进入。如图:
需要输入用户名密码进行验证。
退出程序有NAG窗口,提示试用时间。
OD载入。初步分析了下程序,决定下GetWindowsTextA断点来找验证CALL。
断下来后,Ctrl+F9执行到返回。堆栈窗口看到已经获取了我们输入的用户名。
继续执行,发现又获取了我们输入的假码,那大胆分析,是不是接下来就是要进行运算校验了吗?
往下浏览了一下程序发现了
CALL ******
比较******
跳转******
是不是很熟悉。这必须下个断进去研究一番。
果断下断,F7进去一看。柳暗花明。这显然就是我们要追的验证过程。
经下断多次测试,
段尾cmp esi,eax是关键判断。两个值相等,则跳向成功,否则跳向失败。
那我们就往上看,是哪里改变了这2个值吧。
段首下断,把程序断在段首。
下面斗胆对代码进行下分析,有不当的地方一定回贴告诉我。
分析到这里,可以确定序列号的前5位为固定的 mg379
继续往下。
004315F3|.E8 D0DD0000 call movgear.0043F3C8
有个CALL。跟进去看下。
果然,是计算序列号的。那就细细分析一下。
有发现,序列号前5位为固定的 mg379 运算序列是从第8位开始提起。那么,是不是可以理解为第6、7位是可以随机的吗?
暂且这么理解。到目前,序列号应该为 mg37900 继续往下分析看看。
下面斗胆对代码进行下分析,有不当的地方一定回贴告诉我。
总结下算法为:X+(0+0*4)*2-48=?
X为序列号,未知。是需要求的值
48为0x30的十进制数。这里暂且这么记录吧。
0043F3BD|.8BC3 mov eax,ebx
运算结果影响EAX,刚才说到EAX和ESI比较的值影响成功与否。
那在哪里是影响ESI的值呢?再往下跟跟看。
到这里,可以确定整个算法过程就是,用户名进行运算后所得的结果和序列号运算后所得的结果进行比较,如果相等,则注册成功。
用户名为用户输入,运算是值是可以确定的。
那,只需要让序列号运算的结果等于用户名运算后的结果。这样逆推,我们不就得到需要序列号了吗?
这样的话,先把用户名的运算结果算出来吧。
计算用户名的方式为:
提取用户名第一位的ASCII码,第几位乘以几。最后结果累加。
比如(以下演算均为16进制) xuepojie
第一位x的ASCII值是78,则78*1+BDF(ESI的初始值)=C57 结果给ESI
第二位u的ASCII值为75,则75*2+C57=D41结果给ESI
。
。
。
。
第八位e的ASCII值为65,则65*8+17B6=1ADE结果给ESI
00431617|.81FE BE170000|cmp esi,0x17BE
0043161D|.7E 06 |jle short movgear.00431625
0043161F|.81EE BE170000|sub esi,0x17BE
如果结果大于17BE,那么就减去17BE
所以ESI最后的结果为1ADE-17BE=320(十六进制)
经过刚才对序列号分析,第8位开始往后的值计算结果和用户名演算的结果320相等,我们试着演算一下序列为多少吧。
为啥是结果是800?因为ESI的值320是十六进制的,换算成十进制刚好800。为啥X是48-57之间?因为上面有分析,序列号第8位开始往后必须为数字0-9之间。0和9的ASCII码为48和57。
演算一下,演算一下。。。。。
48 48 56 48 ASCII对应的字符为 0 0 8 0
上面分析序列号前七位mg37900,那么后4位为0080
到此,演算出xuepojie对应的序列号就为: mg379000080
当说不练假把戏。试验一下吧。
成功了。。。
算法是分析出来了。那是不是可以写注册机了?
分析很详细,赞!精华走一个! 浅显完美,感谢原创作者 学习学习一下
学习中。。。。。。感谢楼主!!!
vc++
的教程??? 感谢楼主分享 果断学习一下。 分析很详细,学习了 感谢楼主分享