本帖最后由 雨天没有雨 于 2016-1-11 22:02 编辑
由于需要这个软件,但是发送图片是乱码,到吾爱看了说是自校验,就看了小生大大的视屏,只是变成图文教程给新手们看看
1.用OD载入后搜索 “已注册”双击进去
1
[Asm] 纯文本查看 复制代码
005498B3 |. E8 2003F3FF call qqqf.00479BD8
005498B8 |. 803D C4305800>cmp byte ptr ds:[0x5830C4],0x0 【这个就是关键比较了】
005498BF |. 74 10 je short qqqf.005498D1
005498C1 |. BA 3C995400 mov edx,qqqf.0054993C ; 已注册版本 【这里是搜索到的字符串】
2.因为影响跳转的是这个cmp比较,这个变量我们记下[0x5830C4]这个地址重新载入程序
ctrl+g 到这个地址0x5830C4 选择后修改值为1,然后下内存写入断点 f9运行起来,记住有一个地方是赋值为1的,要记住
[Asm] 纯文本查看 复制代码
00549672 . B8 64000000 mov eax,0x64
00549677 . E8 CC97EBFF call qqqf.00402E48
0054967C . 8B0485 CC3058>mov eax,dword ptr ds:[eax*4+0x5830CC]
00549683 . E8 6CAFEBFF call qqqf.004045F4
00549688 . 83F8 18 cmp eax,0x18
0054968B . 74 09 je short qqqf.00549696 根据跳转的流程,这个跳实现了,[-0x5830C4-]这个值就是1就是已注册版 改jmp
0054968D . 83F8 0C cmp eax,0xC
00549690 . 74 04 je short qqqf.00549696
00549692 . 33D2 xor edx,edx
00549694 . EB 02 jmp short qqqf.00549698
00549696 > B2 01 mov dl,0x1 ;一定要执行到这里,不然就未注册
00549698 > 8815 C4305800 mov byte ptr ds:[0x5830C4],dl ; 断在这里 【这里给他赋值,值取决于dl的值】
重要提示,还有这个程序有多处修改[-0x5830C4-]这个值 修改的方法一样我就不说了 只要下内存断点然后都改掉就可以了,
重要提示,还有这个程序有多处修改[-0x5830C4-]这个值 修改的方法一样我就不说了 只要下内存断点然后都改掉就可以了,
重要提示,还有这个程序有多处修改[-0x5830C4-]这个值 修改的方法一样我就不说了 只要下内存断点然后都改掉就可以了,
重要的事情说3遍
改好后,我们F9运行起来
[Asm] 纯文本查看 复制代码 00548B56 |.^\0F85 48FEFFFF \jnz qqqf.005489A4
00548B5C |> 807D EF 00 cmp byte ptr ss:[ebp-0x11],0x0
00548B60 |. 75 68 jnz short qqqf.00548BCA
00548B62 |. B8 148F5400 mov eax,qqqf.00548F14 ; 验证失败!
00548B67 |. E8 ECD10100 call qqqf.00565D58
00548B6C |. A1 44EE5700 mov eax,dword ptr ds:[0x57EE44]
00548B71 |. C600 00 mov byte ptr ds:[eax],0x0 段在这里,
上面有一个验证失败 这是个网络验证,段首ret
但是发送图片还是不行
跳过“程序被损坏”后,插入入后就是乱码,这就是一个自校验,我们把他去掉吧
自校验有可能读自己 所以我们用这个api断点,GetModulefileNameA api下段
然后再下按钮事件,然后在单步走,如果断在API里面,按【-】号看看是哪个call调用了 再进去看看,在断下来的地方call的段首下段,再返回上一层,有几层call就在段首下段,然后在点击一下其他的功能,比如会出现乱码的地方,如果断下了,这个地方就是验证call,然后就是找了,每个call都找一下,然后再猜测一下,一般为了隐蔽性,作者都只会调用一次关键call,只是猜测,然后看看寄存器和堆栈的相关数据,或者一个更傻的方法每运行一个call 就搜索一下,程序的md5值,出现了,就进去call看看是哪个寄存器或堆栈指向这个md5的值,因为md5是32位的,所以通常是类似于编程里面的指针形式赋值的 ,也就是所谓的传址,lea 这样的指令就要关注一下啦
如果你能识别md5算法那就更快的锁定地方了,看看特征
[Asm] 纯文本查看 复制代码
004B42A2 |. 8D45 F4 lea eax,[local.3]
004B42A5 |. E8 CAE2FFFF call qqqf1.004B2574 ; 这里获取自己的名字
004B42AA |. 8B55 F4 mov edx,[local.3]
004B42AD |. 8D45 FC lea eax,[local.1]
004B42B0 |. B9 70444B00 mov ecx,qqqf1.004B4470 ; Desklog.dll
004B42B5 |. E8 8603F5FF call qqqf1.00404640
004B42BA |> BA 20000000 mov edx,0x20
004B42BF |. 8B45 FC mov eax,[local.1]
004B42C2 |. E8 455BF5FF call qqqf1.00409E0C
004B42C7 |. 8BF8 mov edi,eax
004B42C9 |. 8BCB mov ecx,ebx
004B42CB |. 8BD6 mov edx,esi
004B42CD |. 8BC7 mov eax,edi
004B42CF |. E8 14E2FFFF call qqqf1.004B24E8
004B42D4 |. 8BC7 mov eax,edi
004B42D6 |. E8 515CF5FF call qqqf1.00409F2C
004B42DB |. 8D55 F0 lea edx,[local.4]
004B42DE |. 33C0 xor eax,eax
004B42E0 |. E8 B7E7F4FF call qqqf1.00402A9C
004B42E5 |. 8B45 F0 mov eax,[local.4]
004B42E8 |. 8D55 F8 lea edx,[local.2]
004B42EB |. E8 ECF0FFFF call qqqf1.004B33DC ; 这里就是自校验的地方了,我们进去看看
004B33DC /$ 55 push ebp 进去后
004B33DD |. 8BEC mov ebp,esp
004B33DF |. 83C4 E8 add esp,-0x18
004B33E2 |. 53 push ebx
004B33E3 |. 56 push esi
004B33E4 |. 57 push edi
004B33E5 |. 33C9 xor ecx,ecx
004B33E7 |. 894D E8 mov [local.6],ecx
004B33EA |. 8BFA mov edi,edx
004B33EC |. 8945 FC mov [local.1],eax
004B33EF |. 8B45 FC mov eax,[local.1]
004B33F2 |. E8 ED13F5FF call qqqf1.004047E4
004B33F7 |. 33C0 xor eax,eax
004B33F9 |. 55 push ebp
004B33FA |. 68 57344B00 push qqqf1.004B3457
004B33FF |. 64:FF30 push dword ptr fs:[eax]
004B3402 |. 64:8920 mov dword ptr fs:[eax],esp
004B3405 |. 8BC7 mov eax,edi
004B3407 |. E8 FC0EF5FF call qqqf1.00404308
004B340C |. 8D55 EC lea edx,[local.5]
004B340F |. 8B45 FC mov eax,[local.1]
004B3412 |. E8 69FEFFFF call qqqf1.004B3280
004B3417 |. BE 10000000 mov esi,0x10
004B341C |. 8D5D EC lea ebx,[local.5] ; 这个地址就是md5的地址值给了 ebx 就到这里 改一下吧
004B341F |> 8D55 E8 /lea edx,[local.6]
004B3422 |. 33C0 |xor eax,eax
004B340F 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
004B3412 E8 69FEFFFF call qqqf1.004B3280
004B3417 E9 360D0C00 jmp qqqf1.00574152 ;改成这样子
004B341C 90 nop ;
004B341D 90 nop
004B341E 90 nop
004B341F 8D55 E8 lea edx,dword ptr ss:[ebp-0x18]
004B3422 33C0 xor eax,eax
原来的改成这样子
[attach]593128[/attach]
我们取得原程序的md5是200e44743f4540b612f1c2b8fce826e7
找到 空白地方 jmp过去
[Asm] 纯文本查看 复制代码
00574152 . 0000 add byte ptr ds:[eax],al
改成这样子
00574152 BE 10000000 mov esi,0x10
00574157 8D1D 62415700 lea ebx,dword ptr ds:[0x574162] 这里指向的就是下面的md5的地址,并且把地址给edx
0057415D ^ E9 BAF2F3FF jmp qqqf1.004B341C 00574162 下面就是原版程序的md5的值了,这个不是程序的执行代码,是数据了
00574162
00574162 200E and byte ptr ds:[esi],cl
00574164 44 inc esp
00574165 74 3F je short qqqf1.005741A6
00574167 45 inc ebp
00574168 40 inc eax
00574169 B6 12 mov dh,0x12
0057416B F1 int1
0057416C C2 B8FC retn 0xFCB8
0057416F E8 26E70000 call qqqf1.0058289A
00574174 0000 add byte ptr ds:[eax],al
00574176 0000 add byte ptr ds:[eax],al
之后的 错误信息框,用F12暂停法和alt+k 查看定位调用处,上面的跳转改成jmp就可以了
我们F12暂停后,alt+k
我在运行的时候没有出现错误,可以发送图片和文字,但是有可能会出现错误,那就请各位指正啦
在此,我要谢谢52给了我们这么多资源可以让我们学习
至此破解完毕,感谢小生大神出视频给我们菜鸟指点,我只是把他变成图片利于学习
大家给个评分吧,谢谢啦 成品http://pan.baidu.com/s/1mhcMd1A
|