吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 18517|回复: 80
收起左侧

[第四课] 【交作业贴】吾爱破解培训第四课交作业专帖

   关闭 [复制链接]
小生我怕怕 发表于 2015-8-2 23:20
前提介绍:

《吾爱破解培训第四课:击破程序最坚固的堡垒--实战去程序自校验》 讲师:小生我怕怕   http://www.52pojie.cn/thread-392395-1-1.html

回复内容包括解决问题步骤,最后的成品可以上传网盘贴地址,节省论坛空间就不要上传到论坛了。

作业截至到2015年8月10号00:00前提交算数,没有加报名群的同学也可以提交,后期会通过作业的提交情况,来淘汰没有交作业的,让交作业的新人加入。


对于作业的解答我已经更新到上面培训贴中,作业遇到问题的可以参考一下。

帖子我设置只有我可见,等一周后取消,切记不要回复和作业无关内容,否则会被扣分,前50个名交作业的同学有奖励。

免费评分

参与人数 16热心值 +16 收起 理由
海盗小K + 1 我很赞同!
caleb110 + 1 看补录,才完成作业,感谢 小生我怕怕
墨泊VRednow + 1 已答复!
奋仔 + 1 看了录像,跟不上小生的思路啊~~
ha519520966 + 1 看了小生大牛的直播受益匪浅让我认识了MD5.
773827986 + 1 看了录像完全听不懂!0.0
拉风 + 1 不能交作业
萋小磊 + 1 宝马740
魔都闇 + 1 昨天看了会直播,完全不知所云,今天找时间.
幻梦丶诡瞳 + 1 谢谢@Thanks!
niuniu919 + 1 怎么现在提交不了作业啊,权限还没放开啊
q409195961 + 1 小白看了表示凌乱。。
chenyeugu + 1 感觉要振兴我大中华的节奏
潇潇风 + 1 佩服,佩服,看的直播,感觉讲的好快。云里.
349875904 + 1 有事出去没看直播,只能看录像了
蚯蚓翔龙 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

1364847132 发表于 2015-8-3 15:56

回帖奖励 +10 CB吾爱币

链接: http://pan.baidu.com/s/1hqhHTtE 密码: 7vxh
首先先破解掉。 1.png 2.png ,保存

然后我和视频不太一样直接下ReadFile断点 3.png
断下来 4.png

一直走出来就到这 5.png

然后就是这,那啥md5的地方 6.png

最后再改找个空地方改掉 7.png

保存。
seemk 发表于 2015-8-8 16:36
本帖最后由 seemk 于 2015-8-8 16:40 编辑

第一部分:爆破
1.搜索"已注册"unicode字符串,找到上一条语句cmp,得知该句与一个全局变量进行比较,搜索常量,在所有调用这个变量的地方下断点
2.重新载入程序,程序会断在一个给该变量赋值的语句,将je改成jmp强行给该变量赋值1
3.搜索"正在验证"ANSI字符串,直接retn该语句块,让其联网认证失败
另存为qqqf2.exe
第二部分:去自校验
1.OD载入qqqf2.exe并运行,由于程序采用了校验自身md5值得方法,所以下bp CreateFileA断点,点击插入随机数字,第二次断下时跟回程序领空,在上面的压入参数语句下断点,再次点击发现程序访问了qqqf2.exe,也就是程序自身,我的思路是将qqqf2.exe改成qqqf.exe,这样程序依然读取的原正确的MD5值
2.使用C32修改qqqf2.exe的最后一行,添加.\qqqf.exe字符串并保存成qqqf3.exe
3.重新来到OD载入qqqf3.exe,在内存窗口搜索".\qqqf.exe",找到位置以后记录下来地址
4.重新回到我们刚才下的断点,将mov eax,dword ptr [ebp-2]改成lea eax,dword ptr [记录的地址](注意下面的call应该先nop掉,因为该指令比mov指令要长)
这样程序每次都乖乖的读qqqf.exe的MD5值而不是我们修改后的qqqf3.exe,所以不会再出现MD5值不匹配的现象了

成品下载地址:http://pan.baidu.com/s/1ntmrK3B
将qqqf3.exe复制到目标目录下打开即可
cber 发表于 2015-8-9 21:18
1:先根据字符串找到判断版本的地方,将判断标志位存在   005435D6   .  A2 24BF5700   mov byte ptr ds:[0x57BF24],al  中
然后修改一下跳转,改为nop,如下所示:
1.png

改完以后,变成了注册版本,随便输入了12位以上的注册码

然后是去校验的修改:
找到了判断md5的地方,加了一条jmp语句:
2.png

然后在代码空白处,写入新加的代码,主要是把最开始的md5值写入ebp-0x14开始的位置:
3.png

修改后,程序编程了破解版本,同时去校验后,输入昵称等功能不会变成乱码了。


成品路径:http://yun.baidu.com/share/link?shareid=1154873676&uk=621215343
LoongKing 发表于 2015-8-3 13:51

回帖奖励 +10 CB吾爱币

载入OD,入口就是Delphi,两种搜索方式都有点信息,
但是我们最需要的就是已注册。

我们双击进入已注册可以看到
00541870  |.  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
00541877      74 10         je short qqqf.00541889

NOP这个JE就可以了,测试功能都正常我们保存一下。
00541877      90            nop
00541878      90            nop

保存之后再打开,试试功能有几个已经出现了乱码,这就是所谓的程序自校验。
那咋办?我们先来判断一下自校验类型,是不是和文件大小有关,
原程序1.92 MB (2,020,352 字节)
修改后1.92 MB (2,020,352 字节)
并没有什么不同,
大小是没变,是不是MD5改变了?(还有很多猜想,这个只是比较接近。)
我们找个工具看看
原程序
11ea70a3c3735c29b48552776756406a
修改后
444245cd385eeb18bc431a600c5136df

果然有问题,那咋办?可以用到一个断点,(CreateFileA)自校验

我们载入修改后的文件运行起来

0012FCE8  |00E89E90  ASCII "C:\Program Files\QQSendFriend\qqqfs.exe"

出现这玩意,是不是我们修改后的文件,他要干嘛?
这个断点是自校验相关的莫非.........................
没错你猜对了他要开始自校验了........
回溯到
004B1DD8   $  55            push ebp

单步
注意循环有可能是验证我们的MD5
004B1F8F  |.^\75 E6         \jnz short qqqfs.004B1F77
这个循环完了
我们注意数据窗口,此时已经出现了我们的MD5
我们替换他的原版MD5
改写代码如下,我就不说了,我也是第一次patch,生哥视频已经很详细了。
004B1F74     /E9 2B910B00          jmp qqqfs.0056B0A4
004B1F79     |90                   nop

0056B0A4      60                   pushad
0056B0A5      C745 EC 11EA70A3     mov dword ptr ss:[ebp-0x14],0xA370EA11
0056B0AC      C745 F0 C3735C29     mov dword ptr ss:[ebp-0x10],0x295C73C3
0056B0B3      C745 F4 B4855277     mov dword ptr ss:[ebp-0xC],0x775285B4
0056B0BA      C745 F8 6756406A     mov dword ptr ss:[ebp-0x8],0x6A405667
0056B0C1      8D5D EC              lea ebx,dword ptr ss:[ebp-0x14]
0056B0C4      8D55 E8              lea edx,dword ptr ss:[ebp-0x18]
0056B0C7      33C0                 xor eax,eax
0056B0C9      8A03                 mov al,byte ptr ds:[ebx]
0056B0CB      E8 E85FF4FF          call qqqfs.004B10B8
0056B0D0      8B55 E8              mov edx,dword ptr ss:[ebp-0x18]
0056B0D3      8BC7                 mov eax,edi
0056B0D5      E8 F294E9FF          call qqqfs.004045CC
0056B0DA      43                   inc ebx
0056B0DB      4E                   dec esi
0056B0DC    ^ 75 E6                jnz short qqqfs.0056B0C4
0056B0DE      61                   popad
0056B0DF    ^ E9 AD6EF4FF          jmp qqqfs.004B1F91

只是需要注意一下堆栈平衡。还有那个jnz对应的地址,
保存文件,测试功能是不是已经正常了呢?
http://1000eb.com/1f5jk
pnccm 发表于 2015-8-3 13:59

回帖奖励 +10 CB吾爱币

本帖最后由 pnccm 于 2015-8-6 18:01 编辑

首先查壳:Borland Delphi 6.0 - 7.0

其次打开程序测试该程序的注册流程和错误提什么等等的信息。

接着知道是无壳程序直接od载入程序,
1.反汇编窗口搜索unicode 字符创。
2.来到字符串窗口  经测试Ctrl+F  输入已注册版本 可以搜索到相关字符串   

3.双击已注册版本字符串来到反汇编窗口
00541870  |.  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0           ;  //  下面的跳转是通过579f24这个常量和零比较 相等跳转
00541877  |.  74 10         je short 00541889                        ;  qqqf.00541889
00541879  |.  BA F4185400   mov edx,0x5418F4                         ;    // 已注册版本   //双击后来到这里  上面有个je的跳转

4.右键点击查找所有常量输入579f24。然后来到一个新的窗口。右键 然后点击在每个命令上设置断点。
5.重新载入程序。点F9 运行程序。这时会断在我们刚才设置好的断点。
00541650   > \8815 249F5700 mov byte ptr ds:[0x579F24],dl            ;    / /F9运行程序后会断在这里。往下继续单步F8
00541656   .  83F8 0C       cmp eax,0xC
00541659   .  75 48         jnz short 005416A3                       ;     // 这里是判断注册码长度是否等于12不相等跳转
0054165B   .  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]
0054165E   .  50            push eax
0054165F   .  B8 64000000   mov eax,0x64
00541664   .  E8 AF17ECFF   call 00402E18                            ;  qqqf1.00402E18
00541669   .  8B0485 2C9F57>mov eax,dword ptr ds:[eax*4+0x579F2C]
00541670   .  B9 02000000   mov ecx,0x2
00541675   .  BA 01000000   mov edx,0x1
0054167A   .  E8 A531ECFF   call 00404824                            ;  qqqf1.00404824
0054167F   .  8B45 F4       mov eax,dword ptr ss:[ebp-0xC]
00541682   .  BA 64175400   mov edx,0x541764                         ;  02
00541687   .  E8 8430ECFF   call 00404710                            ;  qqqf1.00404710
0054168C   .  75 0A         jnz short 00541698                       ;      //  这里小生大牛是nop掉的,这里我暂不修改
0054168E   .  8B07          mov eax,dword ptr ds:[edi]
00541690   .  E8 177EFCFF   call 005094AC                            ;  qqqf1.005094AC
00541695   .  40            inc eax
00541696   .  7F 04         jg short 0054169C                        ;  qqqf1.0054169C
00541698      40            inc eax                                  ;    //  上面的jnz跳到这里、这里是清空eax的值 这里我改成了inc eax 让eax=1
00541699      90            nop
0054169A   .  EB 02         jmp short 0054169E                       ;  qqqf1.0054169E
0054169C   >  B0 01         mov al,0x1
0054169E   >  A2 249F5700   mov byte ptr ds:[0x579F24],al            ;    // 这里会吧eax的值赋值给579f24
005416A3   >  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0           ;  //  这里和零做比较
005416AA   .  75 05         jnz short 005416B1                       ;    // 不相等就实现跳转。
005416AC   .  E8 63FCFFFF   call 00541314                            ;  qqqf1.00541314
005416B1   >  33C9          xor ecx,ecx

上面的代码修改完后继续F9运行,这时程序左下角会出现  验证失败。

6.这里先去除这个网络验证 。继续搜索字符串。搜索“验证失败”  找到后双击该字符串。来到反汇编窗口。往上一直找到断首 修改代码 push 为 retn

7.去掉修改后添加随机字母或是随机数字为乱码的校验。这里先清除所有断点。然后运行Delphi 按钮事件脚本。设置好断点后。运行程序,选择添加随机字母 这时被断下来。F7跟进


8.中间如何寻找到小生大牛说的读取程序自身的md5值作为字符串加密的秘钥就省略掉。我是跟着教程走的。自己真的不知道如何判断定位到底那个call可以进。那个call是关键。
004B1F6A  |.  E8 69FEFFFF   call 004B1DD8                            ;  qqqf1.004B1DD8
004B1F6F  |.  BE 10000000   mov esi,0x10
004B1F74  |.  8D5D EC       lea ebx,[local.5]                        ;    // 来到这里是关键位置
004B1F77  |>  8D55 E8       /lea edx,[local.6]
004B1F7A  |.  33C0          |xor eax,eax
004B1F7C  |.  8A03          |mov al,byte ptr ds:[ebx]
004B1F7E  |.  E8 35F1FFFF   |call 004B10B8                           ;  qqqf1.004B10B8
004B1F83  |.  8B55 E8       |mov edx,[local.6]
004B1F86  |.  8BC7          |mov eax,edi
004B1F88  |.  E8 3F26F5FF   |call 004045CC                           ;  qqqf1.004045CC
004B1F8D  |.  43            |inc ebx
004B1F8E  |.  4E            |dec esi
004B1F8F  |.^ 75 E6         \jnz short 004B1F77                      ;  qqqf1.004B1F77
004B1F91  |.  33C0          xor eax,eax

接着后面修改方法太过于复杂,完全照搬无误
不过这样好像还是破解不完整。因为测试发送信息时会提示注册码错误。下载的是官网最新版本。

后面这个问题再自己尝试看看是否能够移除。也期待小生大牛继续添加此问题的解决办法
终于完美破解了。用最原始最古老的办法开两个程序对比法,千辛万苦最终决定放弃的时候,原来我已经成功了。后来仔细找了下终于让我找到关键位置了。


00565075  |.  BA AC535600   mov edx,0x5653AC                         ;  Tencent_QQBar|0|0|30|70|515|522|2000
0056507A  |.  E8 F1F2E9FF   call 00404370                            ;  00404370
0056507F  |.  A1 085E5700   mov eax,dword ptr ds:[0x575E08]
00565084  |.  8038 00       cmp byte ptr ds:[eax],0x0                ;   // 这里eax的内存地址是00579f24 它的值是1  这里把0修改为1
00565087  |.  74 41         je short 005650CA                        ;     // 这里1和零如果不相等的话不会跳转
00565089  |.  B8 14000000   mov eax,0x14
0056508E  |.  E8 85DDE9FF   call 00402E18                            ;  00402E18
00565093  |.  8B15 405E5700 mov edx,dword ptr ds:[0x575E40]          ;  qqqf_版?00579F2C
00565099  |.  8B0482        mov eax,dword ptr ds:[edx+eax*4]
0056509C  |.  E8 07FFFFFF   call 00564FA8                            ;  00564FA8
005650A1  |.  84C0          test al,al
005650A3  |.  75 25         jnz short 005650CA                       ;  005650CA
005650A5  |.  8D4D CC       lea ecx,[local.13]
005650A8  |.  33D2          xor edx,edx
005650AA  |.  B8 DC535600   mov eax,0x5653DC
005650AF  |.  E8 F8C3FDFF   call 005414AC                            ;  005414AC
005650B4  |.  8B45 CC       mov eax,[local.13]
005650B7  |.  33D2          xor edx,edx
005650B9  |.  E8 420CFAFF   call 00505D00                            ;  00505D00
005650BE  |.  C605 FCA65700>mov byte ptr ds:[0x57A6FC],0x1
005650C5  |.  E9 A1020000   jmp 0056536B                             ;  0056536B
005650CA  |>  8B07          mov eax,dword ptr ds:[edi]               ;  apisetsc.00040250
005650CC  |.  E8 5706FAFF   call 00505728                            ;  00505728
005650D1  |.  8945 D0       mov [local.12],eax                       ;  qqqf_版?00579F24
005650D4  |.  8B45 D0       mov eax,[local.12]
005650D7  |.  A3 A0A75700   mov dword ptr ds:[0x57A7A0],eax          ;  qqqf_版?00579F24
005650DC  |.  33C0          xor eax,eax                              ;  qqqf_版?00579F24
005650DE  |.  8945 F4       mov [local.3],eax                        ;  qqqf_版?00579F24
005650E1  |.  33C0          xor eax,eax                              ;  qqqf_版?00579F24

00565084 |. 8038 00 cmp byte ptr ds:[eax],0x0 ;   // 这里eax的内存地址是00579f24 它的值是1  这里把0修改为1
这句的内存地址是0057f24,这里的值是先前破解的时候搜索的常量。也就是搜索“已注册版本”时的那个常量的最终值。我们前面给他赋值为1后成功显示已注册界面。可是后面测试点击发送时还会调用该值。而且是把该值
和零比较。
00565087 |. 74 41 je short 005650CA ;     // 这里1和零比较如果相等的话就会跳过注册码错误。不相等的话就会弹出注册码错误提示。
只需吧上面的0修改为1即可正常发送。
狂晕,原来可以直接用断信息框定位到上面的注册码错误提示。结果我还是走了弯路。开了两个程序从按钮事件一步一步的对比,晕死。

吾爱破解培训第四课作业_pnccm









免费评分

参与人数 1热心值 +1 收起 理由
小生我怕怕 + 1 不错,分析得仔细认真

查看全部评分

黑的思想 发表于 2015-8-3 14:09

回帖奖励 +10 CB吾爱币

本帖最后由 黑的思想 于 2015-8-3 14:43 编辑

企业版豪迪,没有测试过,因为没有企业版QQ,所以无法测试。
但却也是按课程要求一步一步来的。
做如下简要说明
02168.jpg 02169.jpg

00539E87     处修改为jmp 跳向注册成功对话框,并重启验证。
004B1A8C     处修改为jmp 00554124
并在00554124处输入如下代码,修改md5
02171.jpg

通过“已注册版本”字符串,查找常量,修改 0053D10C  处为 jmp 0053D112
0053A9AE处改为 jmp 0053A9FF 跳过网络验证

就修改了这几处,不知道还有没有校验未触发,多包涵吧

作业链接: http://pan.baidu.com/s/1sjn5kTJ 密码: iuqr
niuniu919 发表于 2015-8-3 14:47

回帖奖励 +10 CB吾爱币

本帖最后由 niuniu919 于 2015-8-4 21:03 编辑

作业跟着教学视频写完了,但是如果换个程序,估计自己还不会。对这节课的内容没有理解透彻。

1.png


2.png

3.png

4.png

QQ截图20150804210322.png

成品作业:http://pan.baidu.com/s/1qWuYIpY

ha519520966 发表于 2015-8-3 16:11

回帖奖励 +10 CB吾爱币

本帖最后由 ha519520966 于 2015-8-3 17:37 编辑

1.png 第一步我们载入OD找到字符串“已注册版本”然后呢根据小生大牛的指点简单的破解了下
3.png 重新载入发现已经是注册版本了。
但是我们发现当我们插入其它字符或者图片文件的时候会出现乱码那我们怎么办呢?
利用小生大牛的方法,我们先找下被我们修改后的程序的MD5: 444245CD385EEB18BC431A600C5136DF,然后我们找到程序的按钮事件 5.png 跟进去。 6.png 进入第一个CALL一直跟到这个位置这个CALL是关键 7.png CALL直接F7步入
8.png
追踪到这里MD5校验找到 9.png 是不是和我们查到的MD5一样呢?于是我们修改成他原来的MD5
修改方法参考小生大牛教程此处略过1万字
最后看看成品效果
11.png
最后再补充2句,小生的这个软件还没测底破解完成。{:1_903:}他也太懒了都不测试下。当我们点击发送的消息的时候会提示注册码错误!
当然这个也很好解决下个MessageBoxA断点向上跟踪可以发现 12.png 这个获取错误的函数我们在段首下断
然后点软件发送消息按钮返回到上一层这里 13.png 可以发现上面有个跳JNZ我们改成JMP测试下 14.png OK程序正常运行 18.png 还有冒昧问一句小生大牛俺可以加入你们学习群吗?

软件下载链接:http://pan.baidu.com/s/1dDuFkbf 密码:6trs
残情 发表于 2015-8-3 16:24

回帖奖励 +10 CB吾爱币

11ea70a3c3735c29b4855277 6756406a  原文件MD5值

193d8563ef4675e572c4b3d9a7b55063 修改后MD5值

通过查找字符,发现常量0x579F24如果为1则为注册。搜索所有常量给0x579F24赋值进行分析

找后找字符将程序网络验证部分的CALL 直接RET掉。

保存后启动程序发现注册已爆破。但有自校验导致出现乱码,下DEPHP按键事件断点,
随便找一功能问题断下来进CALL分析

找到程序MD5值判断CALL

找到关键位置后,在程序中找段空白代码将原版的MD5值赋值。
破解文件地址 http://pan.baidu.com/s/1pJGF36N

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg

wenbo998 发表于 2015-8-3 16:59

回帖奖励 +10 CB吾爱币

本帖最后由 wenbo998 于 2015-8-3 17:00 编辑

首先感谢小生大大在百忙之中来做直播教学。昨天一听到声音就知道是你了,你的教程我学习过的。而且你用那个,查找所有常量,这一招我是太熟悉啦, 哈哈哈!通过锁定某个常量下断从而找到该程序的关键赋值点,判断点。
1、首先载入OD一看,Delphi。无壳就简单了一步,首先查找字符串。找到类似注册相关字眼。跟踪之。在有“已注册版本”那段程序的段首下断。来到:
00541865    8B83 0C030000   mov eax,dword ptr ds:[ebx+0x30C]
0054186B    E8 E46FF3FF     call qqqf.00478854
00541870    803D 249F5700 0>cmp byte ptr ds:[0x579F24],0x0
00541877    74 10           je short qqqf.00541889
00541879    BA F4185400     mov edx,qqqf.005418F4                    ; 已注册版本
这里是对0x579F24这里的值进行一个判断,为0就跳过已注册版本。所以,这个0x579F24里面的数值不能让他为0。用小生大大那招,查找所有常量,锁定它。在每个地方下断,重新载入。一开始,程序断在这里:

00541650   > \8815 249F5700 mov byte ptr ds:[0x579F24],dl
00541656   .  83F8 0C       cmp eax,0xC
00541659   .  75 48         jnz short qqqf.005416A3
0054165B   .  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]
0054165E   .  50            push eax
0054165F   .  B8 64000000   mov eax,0x64
00541664   .  E8 AF17ECFF   call qqqf.00402E18
00541669   .  8B0485 2C9F57>mov eax,dword ptr ds:[eax*4+0x579F2C]
00541670   .  B9 02000000   mov ecx,0x2
00541675   .  BA 01000000   mov edx,0x1
0054167A   .  E8 A531ECFF   call qqqf.00404824
0054167F   .  8B45 F4       mov eax,dword ptr ss:[ebp-0xC]
00541682   .  BA 64175400   mov edx,qqqf.00541764                    ;  02
00541687   .  E8 8430ECFF   call qqqf.00404710
0054168C   .  75 0A         jnz short qqqf.00541698
0054168E   .  8B07          mov eax,dword ptr ds:[edi]
00541690   .  E8 177EFCFF   call qqqf.005094AC
00541695   .  40            inc eax
00541696   .  7F 04         jg short qqqf.0054169C
00541698   >  33C0          xor eax,eax
0054169A   .  EB 02         jmp short qqqf.0054169E
0054169C   >  B0 01         mov al,0x1
0054169E   >  A2 249F5700   mov byte ptr ds:[0x579F24],al
005416A3   >  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
005416AA   .  75 05         jnz short qqqf.005416B1
005416AC   .  E8 63FCFFFF   call qqqf.00541314
DL此时的值为1,写入0x579F24这个地址。往下看,明显发现程序在判断注册码的位数是否合格,因为我写的注册码是012345678912,所以是12也就是0xC。继续往下单步跟。

这里:
00541650   > \8815 249F5700 mov byte ptr ds:[0x579F24],dl
00541656   .  83F8 0C       cmp eax,0xC
00541659      90            nop
0054165A      90            nop
0054165B   .  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]
判断位数的这里,下面的条件跳转直接nop,不让他进行位数判断。

这里:
00541695   .  40            inc eax
00541696   .  7F 04         jg short qqqf.0054169C
00541698   >  33C0          xor eax,eax
0054169A      90            nop
0054169B      90            nop
0054169C   >  B0 01         mov al,0x1
0054169E   >  A2 249F5700   mov byte ptr ds:[0x579F24],al
005416A3   >  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
005416AA   .  75 05         jnz short qqqf.005416B1
005416AC   .  E8 63FCFFFF   call qqqf.00541314
看到给al赋值,然后再把al给0x579F24这里,然后再把0x579F24和0作比较。这里就是关键点了,把那个jmp直接nop,让他这个赋值过程实现,从而将0x579F24赋值为1。然后跑起来,发现有一个网络验证。也就是说,当软件检测到0x579F24里的值为1的时候,软件就知道已经注册,那么下一步就是来验证到底是否注册了。那么我们就需要把这个网络验证给nop掉。查找字符串。找到了正在验证和验证失败。跟进去。结果发现这么一段程序貌似就是进行网络验证,那么段首retn试试吧,注意和段尾的retn相对应。保存,测试。经过验证,ok了。如图所示:
1.png


底下的广告已经变为已注册,打开注册也看到是已注册版本。现在点确认仍然是报错的,因为我们破解的只是他的本地验证机制,所以你输入错误的注册码以后,点确认,昨晚我大概跟过,他是要打开一个URL,带上你的机器码和注册码进行服务器验证的,所以还是不能通过。但是这样已经可以啦。
2、接下来就是昨晚的重点,去除程序自校验。说实话昨晚小生大大操作的太快,上上下下进进出出的看的我很晕,其实这种校验以我的耐心我是跟不下去的,找一会我就晕了,而且我也未必找得到,找到了也未必认识他就是MD5的段。那就照猫画虎下吧,练练手。OK,用脱壳脚本在所有按钮事件上下断,找到合适的位置以后取消其他无用断点。
OK,进入这里就是啦,这一段虽然不长,但是里面的这些CALL可是暗藏杀机啊!现在就在每个CALL里好好的跟一跟吧。
00567ED8    55              push ebp
00567ED9    8BEC            mov ebp,esp
00567EDB    6A 00           push 0x0
00567EDD    6A 00           push 0x0
00567EDF    33C0            xor eax,eax
00567EE1    55              push ebp
00567EE2    68 347F5600     push ceshi2.00567F34
00567EE7    64:FF30         push dword ptr fs:[eax]
00567EEA    64:8920         mov dword ptr fs:[eax],esp
00567EED    8D4D F8         lea ecx,dword ptr ss:[ebp-0x8]
00567EF0    33D2            xor edx,edx
00567EF2    B8 1E000000     mov eax,0x1E
00567EF7    E8 C4AEF4FF     call ceshi2.004B2DC0
00567EFC    8B55 F8         mov edx,dword ptr ss:[ebp-0x8]
00567EFF    8D45 FC         lea eax,dword ptr ss:[ebp-0x4]
00567F02    E8 D1CCE9FF     call ceshi2.00404BD8
00567F07    8B45 FC         mov eax,dword ptr ss:[ebp-0x4]
00567F0A    50              push eax
00567F0B    E8 5049FFFF     call ceshi2.0055C860
00567F10    5A              pop edx                                  ; ceshi2.0048B2DC
00567F11    E8 9AF9F8FF     call ceshi2.004F78B0
00567F16    33C0            xor eax,eax
00567F18    5A              pop edx                                  ; ceshi2.0048B2DC
00567F19    59              pop ecx                                  ; ceshi2.0048B2DC
00567F1A    59              pop ecx                                  ; ceshi2.0048B2DC
00567F1B    64:8910         mov dword ptr fs:[eax],edx
00567F1E    68 3B7F5600     push ceshi2.00567F3B
00567F23    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
00567F26    E8 ADC3E9FF     call ceshi2.004042D8
00567F2B    8D45 FC         lea eax,dword ptr ss:[ebp-0x4]
00567F2E    E8 DDCAE9FF     call ceshi2.00404A10
00567F33    C3              retn
00567F34  ^ E9 E3BCE9FF     jmp ceshi2.00403C1C
00567F39  ^ EB E8           jmp short ceshi2.00567F23
00567F3B    59              pop ecx                                  ; ceshi2.0048B2DC
00567F3C    59              pop ecx                                  ; ceshi2.0048B2DC
00567F3D    5D              pop ebp                                  ; ceshi2.0048B2DC
00567F3E    C3              retn
…………经过反复的跟啊跟,重点小生大大说,文件读取完,关闭以后就该是出MD5的地方了类似这样意思的话。那么我找到了这些:

004B1EB8    8B45 EC         mov eax,dword ptr ss:[ebp-0x14]
004B1EBB    50              push eax
004B1EBC    E8 5F51F5FF     call <jmp.&kernel32.UnmapViewOfFile>
004B1EC1    C3              retn
004B1EC2  ^ E9 551DF5FF     jmp ceshi2.00403C1C
004B1EC7  ^ EB EF           jmp short ceshi2.004B1EB8
004B1EC9    33C0            xor eax,eax
004B1ECB    5A              pop edx                                  ; ceshi2.004B1F05
004B1ECC    59              pop ecx                                  ; ceshi2.004B1F05
004B1ECD    59              pop ecx                                  ; ceshi2.004B1F05
004B1ECE    64:8910         mov dword ptr fs:[eax],edx
004B1ED1    68 E71E4B00     push ceshi2.004B1EE7
004B1ED6    8B45 F0         mov eax,dword ptr ss:[ebp-0x10]
004B1ED9    50              push eax
004B1EDA    E8 E14DF5FF     call <jmp.&kernel32.CloseHandle>
004B1EDF    C3              retn
004B1EE0  ^ E9 371DF5FF     jmp ceshi2.00403C1C
004B1EE5  ^ EB EF           jmp short ceshi2.004B1ED6
004B1EE7    33C0            xor eax,eax
004B1EE9    5A              pop edx                                  ; ceshi2.004B1F05
004B1EEA    59              pop ecx                                  ; ceshi2.004B1F05
004B1EEB    59              pop ecx                                  ; ceshi2.004B1F05
004B1EEC    64:8910         mov dword ptr fs:[eax],edx
004B1EEF    68 051F4B00     push ceshi2.004B1F05
004B1EF4    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]
004B1EF7    50              push eax
004B1EF8    E8 C34DF5FF     call <jmp.&kernel32.CloseHandle>
004B1EFD    C3              retn
继续往下跟,返回到:

004B1F6F    BE 10000000     mov esi,0x10
004B1F74    8D5D EC         lea ebx,dword ptr ss:[ebp-0x14]
004B1F77    8D55 E8         lea edx,dword ptr ss:[ebp-0x18]
004B1F7A    33C0            xor eax,eax
004B1F7C    8A03            mov al,byte ptr ds:[ebx]
004B1F7E    E8 35F1FFFF     call ceshi2.004B10B8
数据窗跟随,看到假的MD5。ok,CTRL+B,补写代码吧。如下:

0056B0A4    60              pushad
0056B0A5    C745 EC 11EA70A>mov dword ptr ss:[ebp-0x14],0xA370EA11
0056B0AC    C745 F0 C3735C2>mov dword ptr ss:[ebp-0x10],0x295C73C3
0056B0B3    C745 F4 B485527>mov dword ptr ss:[ebp-0xC],0x775285B4
0056B0BA    C745 F8 6756406>mov dword ptr ss:[ebp-0x8],0x6A405667
0056B0C1    8D5D EC         lea ebx,dword ptr ss:[ebp-0x14]
0056B0C4    8D55 E8         lea edx,dword ptr ss:[ebp-0x18]
0056B0C7    33C0            xor eax,eax
0056B0C9    8A03            mov al,byte ptr ds:[ebx]
0056B0CB    E8 E85FF4FF     call ceshi2.004B10B8
0056B0D0    8B55 E8         mov edx,dword ptr ss:[ebp-0x18]
0056B0D3    8BC7            mov eax,edi
0056B0D5    E8 F294E9FF     call ceshi2.004045CC
0056B0DA    43              inc ebx
0056B0DB    4E              dec esi
0056B0DC  ^ 75 E6           jnz short ceshi2.0056B0C4 (注意这里应该往哪里跳)
0056B0DE    61              popad
0056B0DF  ^ E9 AD6EF4FF     jmp ceshi2.004B1F91
然后把原来004B1F74这里往下到补写回跳之间全部nop,如下:

004B1F67    8B45 FC         mov eax,dword ptr ss:[ebp-0x4]
004B1F6A    E8 69FEFFFF     call ceshi2.004B1DD8
004B1F6F    BE 10000000     mov esi,0x10
004B1F74    E9 2B910B00     jmp ceshi2.0056B0A4 (去执行我补写的代码)
004B1F79    90              nop
004B1F7A    90              nop
004B1F7B    90              nop
004B1F7C    90              nop
004B1F7D    90              nop
004B1F7E    90              nop
004B1F7F    90              nop
004B1F80    90              nop
004B1F81    90              nop
004B1F82    90              nop
004B1F83    90              nop
004B1F84    90              nop
004B1F85    90              nop
004B1F86    90              nop
004B1F87    90              nop
004B1F88    90              nop
004B1F89    90              nop
004B1F8A    90              nop
004B1F8B    90              nop
004B1F8C    90              nop
004B1F8D    90              nop
004B1F8E    90              nop
004B1F8F    90              nop
004B1F90    90              nop
004B1F91    33C0            xor eax,eax (执行完毕后回来的地方)
OK,保存,测试。成功。如图:
2.jpg

作业地址:http://pan.baidu.com/s/1eQ0cPnO


免费评分

参与人数 1热心值 +1 收起 理由
小生我怕怕 + 1 作业完成的非常认真,如果MD5那块比较快的.

查看全部评分

286733081 发表于 2015-8-3 17:04

回帖奖励 +10 CB吾爱币

吾爱破解培训第四课作业
http://pan.baidu.com/s/1dDnRLVb

以下是破文
【文章标题】: 豪迪QQ群发破解
【文章作者】: 286733081
【软件名称】: 豪迪群发普通版2015.7.28
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  1.查壳,无壳,运行软件,发现注册对话框里有“未注册版本”,可以作为破解的突破口。
  
  2.OD载入软件,搜索字符串“未注册版本”,没有找到,但在里面找到了“已注册”,跟随过去
  00541865  |.  8B83 0C030000 mov eax,dword ptr ds:[ebx+0x30C]
  0054186B  |.  E8 E46FF3FF   call qqqf.00478854                       ;  在里面有比较
  00541870  |.  803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
  00541877      74 10         je short qqqf.00541889                   ;  关键跳
  00541879  |.  BA F4185400   mov edx,qqqf.005418F4                    ;  已注册版本
  0054187E  |.  8B83 FC020000 mov eax,dword ptr ds:[ebx+0x2FC]
  00541884  |.  E8 F77CFBFF   call qqqf.004F9580
  00541889  |>  33C0          xor eax,eax
  
  3.先处理这个关键跳,直接NOP掉。让程序向下走到已注册版本。保存看看。
  
  4.加载保存文件,运行起来,点击注册按钮,发现已经是“已注册版本”,但在软件底部还有一些广告和验证信息。
  
  5.我们搜索“正在验证”,跟随过去,在段首下段,重新加载运行程序在这一段停下,因为此段为网络验证,就让他不
  进行网络验证,在段首处直接retn
  
  6.通过分析有几处验证都是验证0x579F24里的值是否为1,查找所以常量0x579F24,并下段,运行发现
  00541366  |> \803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
  0054136D      74 24         je short qqqf去网.00541393                 ;关键跳,跳到底部广告,不能让他跳
  0054136F  |.  8D4D F0       lea ecx,[local.4]
  00541372  |.  33D2          xor edx,edx                              ;  qqqf去网.00541448
  00541374  |.  B8 34145400   mov eax,qqqf去网.00541434
  00541379  |.  E8 2E010000   call qqqf去网.005414AC
  0054137E  |.  8B55 F0       mov edx,[local.4]
  00541381  |.  8D45 F4       lea eax,[local.3]
  00541384  |.  E8 4F38ECFF   call qqqf去网.00404BD8
  00541389  |.  8B45 F4       mov eax,[local.3]
  0054138C  |.  E8 E7C70100   call qqqf去网.0055DB78
  00541391  |.  EB 22         jmp short qqqf去网.005413B5
  00541393  |>  8D4D E8       lea ecx,[local.6]
  00541396  |.  33D2          xor edx,edx                              ;  qqqf去网.00541448
  00541398  |.  B8 48145400   mov eax,qqqf去网.00541448
  0054139D  |.  E8 0A010000   call qqqf去网.005414AC
  005413A2  |.  8B55 E8       mov edx,[local.6]                        ;  出现底部广告
  
  7.把关键跳NOP掉,让程序直接向下走就能跳过广告。保存修改,运行测试底部广告已经去除。
  
  8.软件在使用的时候,插入图片不能用,或插入其他也会出现乱码。说明程序还存在暗桩,因为没有加壳,
  修改程序大小字节没变,可能就是MD5校验。
  
  9.经过一系列跟踪,到校验程序头文件的地方
  004B1AD2  |.  B9 02000000   mov ecx,0x2
  004B1AD7  |.  E8 C8F7FFFF   call qqqf.004B12A4                       ;  也有MD5校验
  004B1ADC  |.  8B43 10       mov eax,dword ptr ds:[ebx+0x10]
  004B1ADF  |.  C1E8 03       shr eax,0x3
  004B1AE2  |.  83E0 3F       and eax,0x3F
  004B1AE5  |.  83F8 38       cmp eax,0x38
  004B1AE8  |.  73 0B         jnb short qqqf.004B1AF5
  004B1AEA  |.  BA 38000000   mov edx,0x38
  004B1AEF  |.  2BD0          sub edx,eax
  004B1AF1  |.  8BC2          mov eax,edx
  004B1AF3  |.  EB 09         jmp short qqqf.004B1AFE
  004B1AF5  |>  BA 78000000   mov edx,0x78
  004B1AFA  |.  2BD0          sub edx,eax
  004B1AFC  |.  8BC2          mov eax,edx
  004B1AFE  |>  BA F0E05600   mov edx,qqqf.0056E0F0
  004B1B03  |.  8BCB          mov ecx,ebx
  004B1B05  |.  91            xchg eax,ecx
  004B1B06  |.  E8 39FFFFFF   call qqqf.004B1A44
  004B1B0B  |.  8BD4          mov edx,esp
  004B1B0D  |.  8BC3          mov eax,ebx
  004B1B0F  |.  B9 08000000   mov ecx,0x8
  004B1B14  |.  E8 2BFFFFFF   call qqqf.004B1A44
  004B1B19  |.  8BD6          mov edx,esi
  004B1B1B  |.  8BC3          mov eax,ebx
  004B1B1D  |.  B9 04000000   mov ecx,0x4
  004B1B22  |.  E8 7DF7FFFF   call qqqf.004B12A4                       ;  call出来MD5 校验头文件
  004B1B27  |.  8BC3          mov eax,ebx
  
  10.回溯到
  004B1F5D  |.  8BC7          mov eax,edi
  004B1F5F  |.  E8 7423F5FF   call qqqf.004042D8                       ;  验证MD5
  004B1F64      8D55 EC       lea edx,dword ptr ss:[ebp-0x14]          ;  加载MD5
  004B1F67      8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  004B1F6A  |.  E8 69FEFFFF   call qqqf.004B1DD8                       ;  验证md5
  004B1F6F  |.  BE 10000000   mov esi,0x10
  004B1F74  |.  8D5D EC       lea ebx,[local.5]                        ;  加载MD5
  004B1F77  |>  8D55 E8       /lea edx,[local.6]
  004B1F7A  |.  33C0          |xor eax,eax
  004B1F7C  |.  8A03          |mov al,byte ptr ds:[ebx]
  004B1F7E  |.  E8 35F1FFFF   |call qqqf.004B10B8
  004B1F83  |.  8B55 E8       |mov edx,[local.6]
  004B1F86  |.  8BC7          |mov eax,edi
  004B1F88  |.  E8 3F26F5FF   |call qqqf.004045CC
  004B1F8D  |.  43            |inc ebx
  004B1F8E  |.  4E            |dec esi
  004B1F8F  |.^ 75 E6         \jnz short qqqf.004B1F77
  
  11.修改下面代码
  004B1F5F  |.  E8 7423F5FF   call qqqf.004042D8                       ;  验证MD5
  004B1F64      8D55 EC       lea edx,[local.5]                        ;  加载MD5
  004B1F67      8B45 FC       mov eax,[local.1]
  004B1F6A  |.  E8 69FEFFFF   call qqqf.004B1DD8                       ;  验证md5
  004B1F6F  |.  BE 10000000   mov esi,0x10
  004B1F74  |.  8D5D EC       lea ebx,[local.5]                        ;  加载MD5
  
  12.查找二进制字符串全0的地方 0056B0AE   .  0000          add byte ptr ds:[eax],al
  等下就跳到上面地方改代码
  004B1F64      8D55 EC       lea edx,[local.5]                        ;  加载MD5
  改为
  004B1F64     /E9 45910B00   jmp qqqf.0056B0AE                        ;  加载MD5
  004B1F69     |90            nop
  
  在0056B0AE处添加代码
  0056B0AE      C745 EC 11EA7>mov dword ptr ss:[ebp-0x14],0xA370EA11
  0056B0B5      8D55 EC       lea edx,dword ptr ss:[ebp-0x14]
  0056B0B8      8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056B0BB      E8 186DF4FF   call qqqf.004B1DD8
  0056B0C0      BE 10000000   mov esi,0x10
  0056B0C5      C745 EC 11EA7>mov dword ptr ss:[ebp-0x14],0xA370EA11
  0056B0CC      8D5D EC       lea ebx,dword ptr ss:[ebp-0x14]
  0056B0CF    ^ E9 A36EF4FF   jmp qqqf.004B1F77
  
  保存文件,测试正常!
  
--------------------------------------------------------------------------------
【经验总结】
  和小生教程里不太一样,我是在winxp下做的
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于吾爱破解,转载请注明作者并保持文章的完整,谢谢!

                                                       2015年08月03日 16:55:31
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表