梦真QQ群发 软件的破解+过重启验证
本帖最后由 今夕望月 于 2011-5-13 22:29 编辑没有任何的企图,破之只是为了交流。。软件很简单,就像我一样菜。。不知道有人发过没,如果有人发过就算我抄袭好了
【软件名称:】梦真QQ群发器
【官方网站】去百度吧
【工具】peid+od
开始。。。
首先用peid 查壳,惯例
简单的壳,大家都会脱,直接ESP定律马上就到OEP,脱掉之后查是C++写的,实际上看看文件夹里“krnln.fnr”这样的文件就知道是E语言写的了。
多的不说,开始开刀。
OD加载,运行,注册, 弹出错误框,到OD中F12暂停,然后查看调用堆栈,发现这个
双击进入,看到1006249E 6A 00 push 0
100624A0 FF15 9C160C10 call dword ptr [<&USER32.MessageBoxA>>; USER32.MessageBoxA
100624A6 5F pop edi ; 这里下个断
100624A7 83F8 03 cmp eax, 3
100624AA 5E pop esi
100624AB 75 0F jnz short 100624BC
100624AD 8B4C24 68 mov ecx, dword ptr
然后F9让程序跑起来,但提示框中点确认,程序就断了,取消断点,我们F8往下走真到回到程序领空
10028E39 8B4424 0C mov eax, dword ptr
10028E3D 8B5424 10 mov edx, dword ptr
10028E41 8B4C24 14 mov ecx, dword ptr
10028E45 83C4 18 add esp, 18
10028E48 C3 retn
先回到了这里,继续F8走,就返回到这里了
005B799E 68 03000000 push 3
005B79A3 BB 00030000 mov ebx, 300
005B79A8 E8 1E670000 call 005BE0CB ; 错误
005B79AD 83C4 28 add esp, 28
005B79B0 8B5D FC mov ebx, dword ptr
005B79B3 85DB test ebx, ebx
这里直接看是很难找到怎么跳过来的,我们一路往上翻,发现有些有趣的东西
005B78BA 6A 00 push 0
005B78BC 68 05A04F00 push 004FA005 ; ASCII "false"这个很可疑哦
005B78C1 68 04000080 push 80000004
005B78C6 6A 00 push 0
005B78C8 8B45 F0 mov eax, dword ptr
005B78CB 85C0 test eax, eax
005B78CD 75 05 jnz short 005B78D4
这里,我们可以在程序文件夹里看见key正是保存注册码的键值(是键值么,我不知道INI里怎么叫),这里估计是成功后保存键值
005B77F0 B8 0B494F00 mov eax, 004F490B ; ASCII "KEY"
005B77F5 8945 E8 mov dword ptr , eax
005B77F8 8D45 E8 lea eax, dword ptr
005B77FB 50 push eax
005B77FC E8 D72CFEFF call 0059A4D8 ; 推测是保存键值
005B7801 8B5D E8 mov ebx, dword ptr
005B7804 85DB test ebx, ebx
我们继续往上看,true 是不是很心动,005B771F 68 04000080 push 80000004
005B7724 6A 00 push 0
005B7726 68 E39F4F00 push 004F9FE3 ; ASCII "ture"
005B772B 68 04000080 push 80000004
005B7730 6A 00 push 0
005B7732 8B45 F0 mov eax, dword ptr
005B7735 85C0 test eax, eax
这里,想到了什么?网络验证?
005B76AA 3BC8 cmp ecx, eax
005B76AC 0F8F B7020000 jg 005B7969
005B76B2 8965 EC mov dword ptr , esp
005B76B5 FF75 FC push dword ptr
005B76B8 68 B69F4F00 push 004F9FB6 ; ASCII "http://www.qqjilu.com/soft/QQqf/GetTimes.asp"
005B76BD B8 65000000 mov eax, 65
005B76C2 E8 F8690000 call 005BE0BF
005B76C7 3965 EC cmp dword ptr , esp
005B76CA 74 0D je short 005B76D9
005B76CC 68 06000000 push 6
继续往上看看这里005B7654 3BC8 cmp ecx, eax ; eax与1比较
005B7656 0F8F 17030000 jg 005B7973 ; 这里跳走了 这个跳完全可以跳过去下面的网络验证等等好多东西,推测是关键,实际上多次实验发现这里的确是关键,不跳就注册成功了
005B765C 68 04000080 push 80000004
005B7661 6A 00 push 0
005B7663 68 D9494F00 push 004F49D9 ; ASCII "101700000101700000"
005B7668 68 01000000 push 1
005B766D BB E0090000 mov ebx, 9E0
005B7672 E8 546A0000 call 005BE0CB
005B7677 83C4 10 add esp, 10
005B767A 33C9 xor ecx, ecx
005B767C 3955 F8 cmp dword ptr , edx
005B767F 7F 08 jg short 005B7689
还是继续往上看看吧
005B75FE 3BC8 cmp ecx, eax
005B7600 0F8F 77030000 jg 005B797D ; 跳到失败处,改了就成功 。。这个地方第一次是不跳的,程序还会跳会这里一次,第二次就不跳了,要改。起初以为这里是关键,后来发现其实 改上面005B7656那个跳就够了继续往上,看见好多浮点,让人感觉像是注册码的事005B74F1 83C4 10 add esp, 10
005B74F4 8945 E4 mov dword ptr , eax
005B74F7 DB45 E4 fild dword ptr ; 有什么处理?
005B74FA DD5D E4 fstp qword ptr
005B74FD DD45 E4 fld qword ptr
005B7500 DC25 F90B4F00 fsub qword ptr
005B7506 DD5D DC fstp qword ptr
005B7509 DD45 DC fld qword ptr
再看到上面,这里基本上就上判别注册码的开始了005B743B 68 B00D0152 push 52010DB0
005B7440 E8 986C0000 call 005BE0DD ; 取注册码。。。
005B7445 83C4 10 add esp, 10
005B7448 8945 EC mov dword ptr , eax
005B744B C745 E4 0000000>mov dword ptr , 0
005B7452 C745 E8 0000000>mov dword ptr , 0
005B7459 6A 00 push 0
005B745B FF75 E8 push dword ptr
005B745E FF75 E4 push dword ptr
005B7461 8D45 EC lea eax, dword ptr
005B7464 50 push eax
005B7465 E8 BB6EFFFF call 005AE325 ; 注册码运算?,好多重复的浮点。。005AE325记着这个地址,重启时会有大发现.
005B746A 8945 E0 mov dword ptr , eax
005B746D 8B5D EC mov ebx, dword ptr ; 注册码
005B7470 85DB test ebx, ebx
好了,我们就直接 断在 005B7656 ,再输入注册码,确定,断在这里,不让它跳,OK,注册成功。
我们重新载入程序,这时怎么了?
OD报错了!断点不可用吗,我们去断点列表,发现断点被禁止了,而且反汇编也不一样!
这怎么办?先运行下,再看断点,发现反汇编又一样了,这时把断点激活,程序一样可以断下。
估计程序开始得要解码下,不知道是不是壳没脱干净的原因,我不知道,,先不管这个
**********************************
下面说重启验证的问题,软件重新运行继续提示未注册,那我们上面做的工作不是白费了?不会这么恶心,程序作者很仁慈的。
我们知道是INI了,所以我们下断bp GetPrivateProfileStringA,运行,断啊断啊断,知道堆栈中键值为key的时候返回。这是个漫长的过程。。。
005971A7 68 04000000 push 4
005971AC BB C8080000 mov ebx, 8C8
005971B1 E8 156F0200 call 005BE0CB ; 读ini的作用F8单步,005ACFEB E8 BD100100 call 005BE0AD
005ACFF0 83C4 04 add esp, 4
005ACFF3 58 pop eax
005ACFF4 8B5D E8 mov ebx, dword ptr
005ACFF7 8903 mov dword ptr , eax
005ACFF9 E8 50100000 call 005AE04E ; 时间长了一点,很可疑,进去看看
005ACFFE 8B1D E005BC00 mov ebx, dword ptr
005AD004 895D E8 mov dword ptr , ebx
005AD007 8B5D E8 mov ebx, dword ptr
005AD00A 833B 00 cmp dword ptr , 0
这么个情况。。。
完全一样。。。好了。无压力了,你知道怎么弄的
005AE26F 50 push eax
005AE270 3BC8 cmp ecx, eax
005AE272 0F8F 80000000 jg 005AE2F8 ; 这个不跳就可以了
005AE278 68 04000080 push 80000004
005AE27D 6A 00 push 0
005AE27F 68 D9494F00 push 004F49D9 ; ASCII "101700000101700000"
005AE284 68 01000000 push 1
005AE289 BB E0090000 mov ebx, 9E0
005AE28E E8 38FE0000 call 005BE0CB
005AE293 83C4 10 add esp, 10
005AE296 33C9 xor ecx, ecx
005AE298 3955 F8 cmp dword ptr , edx
005AE29B 7F 08 jg short 005AE2A5
这里改过以后程序就直接会进去主界面,而且注册按钮是灰色的。。程序就算是搞定了吧
****************************************************
另外由于程序存在一个解码问题,所以如果想破解的话还是打内存补丁比较好keymake测试通过。。
完了。。写这玩意好累
很好 很详细 谢谢分享 厉害·顶一下 不懂啊 感谢楼主分享 回复 kubi 的帖子
这还不懂啊。。。走一遍就懂了 其实断下来可以试试堆栈返回的 回复 今夕望月 的帖子
这个我以前也搞过不过是爆破的所以那个去验证的不是很懂。。 回复 kingbaby 的帖子
这个的确是爆破啊 很好的东西 谢谢了。 你太牛了,可惜我也看不懂