好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 今夕望月 于 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 [esp+68]
然后F9让程序跑起来,但提示框中点确认,程序就断了,取消断点,我们F8往下走真到回到程序领空
10028E39 8B4424 0C mov eax, dword ptr [esp+C]
10028E3D 8B5424 10 mov edx, dword ptr [esp+10]
10028E41 8B4C24 14 mov ecx, dword ptr [esp+14]
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 [ebp-4]
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 [ebp-10]
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 [ebp-18], eax
005B77F8 8D45 E8 lea eax, dword ptr [ebp-18]
005B77FB 50 push eax
005B77FC E8 D72CFEFF call 0059A4D8 ; 推测是保存键值
005B7801 8B5D E8 mov ebx, dword ptr [ebp-18]
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 [ebp-10]
005B7735 85C0 test eax, eax
这里,想到了什么?网络验证?
005B76AA 3BC8 cmp ecx, eax
005B76AC 0F8F B7020000 jg 005B7969
005B76B2 8965 EC mov dword ptr [ebp-14], esp
005B76B5 FF75 FC push dword ptr [ebp-4]
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 [ebp-14], 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 [ebp-8], 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 [ebp-1C], eax
005B74F7 DB45 E4 fild dword ptr [ebp-1C] ; 有什么处理?
005B74FA DD5D E4 fstp qword ptr [ebp-1C]
005B74FD DD45 E4 fld qword ptr [ebp-1C]
005B7500 DC25 F90B4F00 fsub qword ptr [4F0BF9]
005B7506 DD5D DC fstp qword ptr [ebp-24]
005B7509 DD45 DC fld qword ptr [ebp-24]
再看到上面,这里基本上就上判别注册码的开始了005B743B 68 B00D0152 push 52010DB0
005B7440 E8 986C0000 call 005BE0DD ; 取注册码 。。。
005B7445 83C4 10 add esp, 10
005B7448 8945 EC mov dword ptr [ebp-14], eax
005B744B C745 E4 0000000>mov dword ptr [ebp-1C], 0
005B7452 C745 E8 0000000>mov dword ptr [ebp-18], 0
005B7459 6A 00 push 0
005B745B FF75 E8 push dword ptr [ebp-18]
005B745E FF75 E4 push dword ptr [ebp-1C]
005B7461 8D45 EC lea eax, dword ptr [ebp-14]
005B7464 50 push eax
005B7465 E8 BB6EFFFF call 005AE325 ; 注册码运算?,好多重复的浮点 。。005AE325记着这个地址,重启时会有大发现.
005B746A 8945 E0 mov dword ptr [ebp-20], eax
005B746D 8B5D EC mov ebx, dword ptr [ebp-14] ; 注册码
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 [ebp-18]
005ACFF7 8903 mov dword ptr [ebx], eax
005ACFF9 E8 50100000 call 005AE04E ; 时间长了一点,很可疑,进去看看
005ACFFE 8B1D E005BC00 mov ebx, dword ptr [BC05E0]
005AD004 895D E8 mov dword ptr [ebp-18], ebx
005AD007 8B5D E8 mov ebx, dword ptr [ebp-18]
005AD00A 833B 00 cmp dword ptr [ebx], 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 [ebp-8], edx
005AE29B 7F 08 jg short 005AE2A5
这里改过以后程序就直接会进去主界面,而且注册按钮是灰色的。。程序就算是搞定了吧
****************************************************
另外由于程序存在一个解码问题,所以如果想破解的话还是打内存补丁比较好keymake测试通过。。
完了。。写这玩意好累
|
免费评分
-
查看全部评分
|