打开Ghost mp3,四处转转,看看有什么限制。看到如图一的时候,我着实吓了一跳。有时汉化过的软件会这样,提供一组注册码。
图一
不管它,我的目的不仅是注册码,而且还想要注册代码。
首先,peid扫壳,ASPack 2.12 -> Alexey Solodovnikov
可恶的是PEID自己的插件无法脱,手动esp定律然后用ImportREC很好的解决了。
再扫发现是Borland Delphi 6.0 - 7.0这个写的。
那好,DEDE出马,找到一个register的类,如图二,肯定就是这里了
图二
右边看看发现button_okclick最像是注册call。如图三
图三
双击button_okclick出现反汇编代码?找到如下字符串。
* Possible String Reference to: '⒉岢晒? 非常感谢您的注册, 欢迎您在
| 使用中提出宝贵意见和建议! 汉化作者:
| 周宝峰 向您祝贺! '
关键在前面。向前看看,看到这个好熟悉,我不多说了。关键啊!
004A94A1 E886CEFFFF call 004A632C
004A94A6 84C0 test al, al
004A94A8 0F84CE000000 jz 004A957C
看前面代码,知道al在这个call出来时需不为0,否则就跳向了注册错误的代码处了!
进入004A632C(在004A94A1行双击就可以了)。
004A6370 E893FCFFFF call 004A6008
004A6375 8B45F4 mov eax, [ebp-$0C]
004A6378 8B55F8 mov edx, [ebp-$08]
004A637B E8C0E2F5FF call 00404640
004A6380 0F94C3 setz bl
……
004A63A5 8BC3 mov eax, ebx
这些东西联系在一起我还有什么可说的呢!bl必须要不为0,即setz bl条件一定要满足,也就是说在执行这条语句的时候zero标志位需要为1。
当然我们得去00404640这个里面看看,哎,一大堆的比较和跳转,这时假如你对代码的感知程度强一点的话,你也许会猜到,这个东西的代码是以明码显示的,这里就是在进行比较的地方。因为在004A6375和004A6378两处,EAX和EDX寄存器作为参数传了进去。而且前面只有一个call我认为那个call只会处理一件事或处理用户名或处理注册码。所以现在我们来动态调戏一次,验证一下。
OD载入。F9(运行)。输入
用户名和注册码,如图四所示。
图四
直接CTRL+G(转到――>表达式)到004A94A1,F2下断。然后到返回到ghost mp3界面中点确定。
断下后F7(单步步入)进这个call。
004A635E 837DFC00 cmp dword ptr [ebp-$04], +$00;发现此处指针的指向为kflnig(用户名),在比较用户名长度是否为0,隐含地告诉我们接下去有戏!
004A6362 741F jz 004A6383;不跳,除非你的用户名长度是0
004A6364 837DF800 cmp dword ptr [ebp-$08], +$00;不用说这里就是注册码了的比较是否为0了。
004A6368 7419 jz 004A6383;同上,不跳
004A636A 8D55F4 lea edx, [ebp-$0C]
004A636D 8B45FC mov eax, [ebp-$04];eax中又指向了用户名,看来下面一句的这个call是在处理用户名然后得出序列号。
* Reference to : TThreadedTimer._PROC_004A6008()
|
004A6370 E893FCFFFF call 004A6008
004A6375 8B45F4 mov eax, [ebp-$0C]
004A6378 8B55F8 mov edx, [ebp-$08]
不管你乐意还是不乐意,假如你要分析算法004A6370这个call你是非进不可了。F7进入。很长,看着都像在生成注册码!^_^,通过动态调戏,发现本来就是吗,而且[ebp-$0C]是真码的地址了!有耐力的话,你去看看004A6370处的这个call吧!
/*4A6121*/ MOV EAX,ghost_mp.004A6318
/*4A6126*/ CALL ghost_mp.00409858
/*4A612B*/ MOV EDX,DWORD PTR SS:[EBP-20]
/*4A612E*/ MOV EAX,DWORD PTR SS:[EBP-8]
/*4A6131*/ CALL ghost_mp.004044FC
/*4A6136*/ MOV EAX,DWORD PTR SS:[EBP-8]
以上的两处call关键call中的关键,是比较头痛的两处,下面还会多次用到。此处我略过了不去看它们了,否则这篇文章长度就要×5了,而且我自己又要花一个晚上去看这个头疼的代码了,再者还会有几只小鸟可以看懂,我还未必可以分析出来,但是我有一个感觉,就是好像算法并不是那么简单,可能是一些经典的算法,可是peid的插件kanal却找不到有这种算法,也许某些数据它是动态生成的吧!
好了,我就这么结束了,通过本文我希望你感受到DEDE的好,也加强对汇编代码的感知程度和理解,最后如果你有兴趣可以给它做一个内存注册机,也不简单哟!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!