【交作业贴】吾爱破解培训第四课交作业专帖
前提介绍:《吾爱破解培训第四课:击破程序最坚固的堡垒--实战去程序自校验》 讲师:小生我怕怕 http://www.52pojie.cn/thread-392395-1-1.html
回复内容包括解决问题步骤,最后的成品可以上传网盘贴地址,节省论坛空间就不要上传到论坛了。
作业截至到2015年8月10号00:00前提交算数,没有加报名群的同学也可以提交,后期会通过作业的提交情况,来淘汰没有交作业的,让交作业的新人加入。
对于作业的解答我已经更新到上面培训贴中,作业遇到问题的可以参考一下。
帖子我设置只有我可见,等一周后取消,切记不要回复和作业无关内容,否则会被扣分,前50个名交作业的同学有奖励。
链接: http://pan.baidu.com/s/1hqhHTtE 密码: 7vxh
首先先破解掉。,保存
然后我和视频不太一样直接下ReadFile断点
断下来
一直走出来就到这
然后就是这,那啥md5的地方
最后再改找个空地方改掉
保存。
本帖最后由 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 改成lea eax,dword ptr [记录的地址](注意下面的call应该先nop掉,因为该指令比mov指令要长)
这样程序每次都乖乖的读qqqf.exe的MD5值而不是我们修改后的qqqf3.exe,所以不会再出现MD5值不匹配的现象了
成品下载地址:http://pan.baidu.com/s/1ntmrK3B
将qqqf3.exe复制到目标目录下打开即可
1:先根据字符串找到判断版本的地方,将判断标志位存在 005435D6 .A2 24BF5700 mov byte ptr ds:,al中
然后修改一下跳转,改为nop,如下所示:
改完以后,变成了注册版本,随便输入了12位以上的注册码
然后是去校验的修改:
找到了判断md5的地方,加了一条jmp语句:
然后在代码空白处,写入新加的代码,主要是把最开始的md5值写入ebp-0x14开始的位置:
修改后,程序编程了破解版本,同时去校验后,输入昵称等功能不会变成乱码了。
成品路径:http://yun.baidu.com/share/link?shareid=1154873676&uk=621215343
载入OD,入口就是Delphi,两种搜索方式都有点信息,
但是我们最需要的就是已注册。
我们双击进入已注册可以看到
00541870|.803D 249F5700>cmp byte ptr ds:,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|00E89E90ASCII "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:,0xA370EA11
0056B0AC C745 F0 C3735C29 mov dword ptr ss:,0x295C73C3
0056B0B3 C745 F4 B4855277 mov dword ptr ss:,0x775285B4
0056B0BA C745 F8 6756406A mov dword ptr ss:,0x6A405667
0056B0C1 8D5D EC lea ebx,dword ptr ss:
0056B0C4 8D55 E8 lea edx,dword ptr ss:
0056B0C7 33C0 xor eax,eax
0056B0C9 8A03 mov al,byte ptr ds:
0056B0CB E8 E85FF4FF call qqqfs.004B10B8
0056B0D0 8B55 E8 mov edx,dword ptr ss:
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-6 18:01 编辑
首先查壳:Borland Delphi 6.0 - 7.0
其次打开程序测试该程序的注册流程和错误提什么等等的信息。
接着知道是无壳程序直接od载入程序,
1.反汇编窗口搜索unicode 字符创。
2.来到字符串窗口经测试Ctrl+F输入已注册版本 可以搜索到相关字符串
3.双击已注册版本字符串来到反汇编窗口
00541870|.803D 249F5700>cmp byte ptr ds:,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:,dl ; / /F9运行程序后会断在这里。往下继续单步F8
00541656 .83F8 0C cmp eax,0xC
00541659 .75 48 jnz short 005416A3 ; // 这里是判断注册码长度是否等于12不相等跳转
0054165B .8D45 F4 lea eax,dword ptr ss:
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:
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:
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:
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:,al ; // 这里会吧eax的值赋值给579f24
005416A3 >803D 249F5700>cmp byte ptr ds:,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, ; // 来到这里是关键位置
004B1F77|>8D55 E8 /lea edx,
004B1F7A|.33C0 |xor eax,eax
004B1F7C|.8A03 |mov al,byte ptr ds:
004B1F7E|.E8 35F1FFFF |call 004B10B8 ;qqqf1.004B10B8
004B1F83|.8B55 E8 |mov edx,
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:
00565084|.8038 00 cmp byte ptr ds:,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: ;qqqf_版?00579F2C
00565099|.8B0482 mov eax,dword ptr ds:
0056509C|.E8 07FFFFFF call 00564FA8 ;00564FA8
005650A1|.84C0 test al,al
005650A3|.75 25 jnz short 005650CA ;005650CA
005650A5|.8D4D CC lea ecx,
005650A8|.33D2 xor edx,edx
005650AA|.B8 DC535600 mov eax,0x5653DC
005650AF|.E8 F8C3FDFF call 005414AC ;005414AC
005650B4|.8B45 CC mov eax,
005650B7|.33D2 xor edx,edx
005650B9|.E8 420CFAFF call 00505D00 ;00505D00
005650BE|.C605 FCA65700>mov byte ptr ds:,0x1
005650C5|.E9 A1020000 jmp 0056536B ;0056536B
005650CA|>8B07 mov eax,dword ptr ds: ;apisetsc.00040250
005650CC|.E8 5706FAFF call 00505728 ;00505728
005650D1|.8945 D0 mov ,eax ;qqqf_版?00579F24
005650D4|.8B45 D0 mov eax,
005650D7|.A3 A0A75700 mov dword ptr ds:,eax ;qqqf_版?00579F24
005650DC|.33C0 xor eax,eax ;qqqf_版?00579F24
005650DE|.8945 F4 mov ,eax ;qqqf_版?00579F24
005650E1|.33C0 xor eax,eax ;qqqf_版?00579F24
00565084 |. 8038 00 cmp byte ptr ds:,0x0 ; // 这里eax的内存地址是00579f24 它的值是1这里把0修改为1
这句的内存地址是0057f24,这里的值是先前破解的时候搜索的常量。也就是搜索“已注册版本”时的那个常量的最终值。我们前面给他赋值为1后成功显示已注册界面。可是后面测试点击发送时还会调用该值。而且是把该值
和零比较。
00565087 |. 74 41 je short 005650CA ; // 这里1和零比较如果相等的话就会跳过注册码错误。不相等的话就会弹出注册码错误提示。
只需吧上面的0修改为1即可正常发送。
狂晕{:1_908:},原来可以直接用断信息框定位到上面的注册码错误提示。结果我还是走了弯路。开了两个程序从按钮事件一步一步的对比,晕死。
吾爱破解培训第四课作业_pnccm
本帖最后由 黑的思想 于 2015-8-3 14:43 编辑
企业版豪迪,没有测试过,因为没有企业版QQ,所以无法测试。
但却也是按课程要求一步一步来的。
做如下简要说明
00539E87 处修改为jmp 跳向注册成功对话框,并重启验证。
004B1A8C 处修改为jmp 00554124
并在00554124处输入如下代码,修改md5
通过“已注册版本”字符串,查找常量,修改 0053D10C处为 jmp 0053D112
0053A9AE处改为 jmp 0053A9FF 跳过网络验证
就修改了这几处,不知道还有没有校验未触发,多包涵吧
作业链接: http://pan.baidu.com/s/1sjn5kTJ 密码: iuqr
本帖最后由 niuniu919 于 2015-8-4 21:03 编辑
作业跟着教学视频写完了,但是如果换个程序,估计自己还不会。对这节课的内容没有理解透彻。
成品作业:http://pan.baidu.com/s/1qWuYIpY
本帖最后由 ha519520966 于 2015-8-3 17:37 编辑
第一步我们载入OD找到字符串“已注册版本”然后呢根据小生大牛的指点简单的破解了下
重新载入发现已经是注册版本了。
但是我们发现当我们插入其它字符或者图片文件的时候会出现乱码{:1_937:}那我们怎么办呢?
利用小生大牛的方法,我们先找下被我们修改后的程序的MD5: 444245CD385EEB18BC431A600C5136DF,然后我们找到程序的按钮事件跟进去。进入第一个CALL一直跟到这个位置这个CALL是关键CALL直接F7步入
追踪到这里MD5校验找到是不是和我们查到的MD5一样呢?于是我们修改成他原来的MD5
修改方法参考小生大牛教程{:1_918:}此处略过1万字
最后看看成品效果
最后再补充2句,小生的这个软件还没测底破解完成。{:1_903:}他也太懒了都不测试下。:loveliness:当我们点击发送的消息的时候会提示注册码错误!
当然这个也很好解决下个MessageBoxA断点向上跟踪可以发现这个获取错误的函数我们在段首下断
然后点软件发送消息按钮返回到上一层这里可以发现上面有个跳JNZ我们改成JMP测试下OK程序正常运行还有冒昧问一句小生大牛俺可以加入你们学习群吗?
软件下载链接:http://pan.baidu.com/s/1dDuFkbf 密码:6trs
11ea70a3c3735c29b4855277 6756406a原文件MD5值
193d8563ef4675e572c4b3d9a7b55063 修改后MD5值
通过查找字符,发现常量0x579F24如果为1则为注册。搜索所有常量给0x579F24赋值进行分析
找后找字符将程序网络验证部分的CALL 直接RET掉。
保存后启动程序发现注册已爆破。但有自校验导致出现乱码,下DEPHP按键事件断点,
随便找一功能问题断下来进CALL分析
找到程序MD5值判断CALL
找到关键位置后,在程序中找段空白代码将原版的MD5值赋值。
破解文件地址 http://pan.baidu.com/s/1pJGF36N
本帖最后由 wenbo998 于 2015-8-3 17:00 编辑
首先感谢小生大大在百忙之中来做直播教学。昨天一听到声音就知道是你了,你的教程我学习过的。而且你用那个,查找所有常量,这一招我是太熟悉啦, 哈哈哈!通过锁定某个常量下断从而找到该程序的关键赋值点,判断点。
1、首先载入OD一看,Delphi。无壳就简单了一步,首先查找字符串。找到类似注册相关字眼。跟踪之。在有“已注册版本”那段程序的段首下断。来到:
00541865 8B83 0C030000 mov eax,dword ptr ds:
0054186B E8 E46FF3FF call qqqf.00478854
00541870 803D 249F5700 0>cmp byte ptr ds:,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:,dl
00541656 .83F8 0C cmp eax,0xC
00541659 .75 48 jnz short qqqf.005416A3
0054165B .8D45 F4 lea eax,dword ptr ss:
0054165E .50 push eax
0054165F .B8 64000000 mov eax,0x64
00541664 .E8 AF17ECFF call qqqf.00402E18
00541669 .8B0485 2C9F57>mov eax,dword ptr ds:
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:
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:
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:,al
005416A3 >803D 249F5700>cmp byte ptr ds:,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:,dl
00541656 .83F8 0C cmp eax,0xC
00541659 90 nop
0054165A 90 nop
0054165B .8D45 F4 lea eax,dword ptr ss:
判断位数的这里,下面的条件跳转直接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:,al
005416A3 >803D 249F5700>cmp byte ptr ds:,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了。如图所示:
底下的广告已经变为已注册,打开注册也看到是已注册版本。现在点确认仍然是报错的,因为我们破解的只是他的本地验证机制,所以你输入错误的注册码以后,点确认,昨晚我大概跟过,他是要打开一个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:
00567EEA 64:8920 mov dword ptr fs:,esp
00567EED 8D4D F8 lea ecx,dword ptr ss:
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:
00567EFF 8D45 FC lea eax,dword ptr ss:
00567F02 E8 D1CCE9FF call ceshi2.00404BD8
00567F07 8B45 FC mov eax,dword ptr ss:
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:,edx
00567F1E 68 3B7F5600 push ceshi2.00567F3B
00567F23 8D45 F8 lea eax,dword ptr ss:
00567F26 E8 ADC3E9FF call ceshi2.004042D8
00567F2B 8D45 FC lea eax,dword ptr ss:
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:
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:,edx
004B1ED1 68 E71E4B00 push ceshi2.004B1EE7
004B1ED6 8B45 F0 mov eax,dword ptr ss:
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:,edx
004B1EEF 68 051F4B00 push ceshi2.004B1F05
004B1EF4 8B45 F4 mov eax,dword ptr ss:
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:
004B1F77 8D55 E8 lea edx,dword ptr ss:
004B1F7A 33C0 xor eax,eax
004B1F7C 8A03 mov al,byte ptr ds:
004B1F7E E8 35F1FFFF call ceshi2.004B10B8
数据窗跟随,看到假的MD5。ok,CTRL+B,补写代码吧。如下:
0056B0A4 60 pushad
0056B0A5 C745 EC 11EA70A>mov dword ptr ss:,0xA370EA11
0056B0AC C745 F0 C3735C2>mov dword ptr ss:,0x295C73C3
0056B0B3 C745 F4 B485527>mov dword ptr ss:,0x775285B4
0056B0BA C745 F8 6756406>mov dword ptr ss:,0x6A405667
0056B0C1 8D5D EC lea ebx,dword ptr ss:
0056B0C4 8D55 E8 lea edx,dword ptr ss:
0056B0C7 33C0 xor eax,eax
0056B0C9 8A03 mov al,byte ptr ds:
0056B0CB E8 E85FF4FF call ceshi2.004B10B8
0056B0D0 8B55 E8 mov edx,dword ptr ss:
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:
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,保存,测试。成功。如图:
作业地址:http://pan.baidu.com/s/1eQ0cPnO
吾爱破解培训第四课作业
http://pan.baidu.com/s/1dDnRLVb
以下是破文
【文章标题】: 豪迪QQ群发破解
【文章作者】: 286733081
【软件名称】: 豪迪群发普通版2015.7.28
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.查壳,无壳,运行软件,发现注册对话框里有“未注册版本”,可以作为破解的突破口。
2.OD载入软件,搜索字符串“未注册版本”,没有找到,但在里面找到了“已注册”,跟随过去
00541865|.8B83 0C030000 mov eax,dword ptr ds:
0054186B|.E8 E46FF3FF call qqqf.00478854 ;在里面有比较
00541870|.803D 249F5700>cmp byte ptr ds:,0x0
00541877 74 10 je short qqqf.00541889 ;关键跳
00541879|.BA F4185400 mov edx,qqqf.005418F4 ;已注册版本
0054187E|.8B83 FC020000 mov eax,dword ptr ds:
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:,0x0
0054136D 74 24 je short qqqf去网.00541393 ;关键跳,跳到底部广告,不能让他跳
0054136F|.8D4D F0 lea ecx,
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,
00541381|.8D45 F4 lea eax,
00541384|.E8 4F38ECFF call qqqf去网.00404BD8
00541389|.8B45 F4 mov eax,
0054138C|.E8 E7C70100 call qqqf去网.0055DB78
00541391|.EB 22 jmp short qqqf去网.005413B5
00541393|>8D4D E8 lea ecx,
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, ;出现底部广告
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:
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: ;加载MD5
004B1F67 8B45 FC mov eax,dword ptr ss:
004B1F6A|.E8 69FEFFFF call qqqf.004B1DD8 ;验证md5
004B1F6F|.BE 10000000 mov esi,0x10
004B1F74|.8D5D EC lea ebx, ;加载MD5
004B1F77|>8D55 E8 /lea edx,
004B1F7A|.33C0 |xor eax,eax
004B1F7C|.8A03 |mov al,byte ptr ds:
004B1F7E|.E8 35F1FFFF |call qqqf.004B10B8
004B1F83|.8B55 E8 |mov edx,
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, ;加载MD5
004B1F67 8B45 FC mov eax,
004B1F6A|.E8 69FEFFFF call qqqf.004B1DD8 ;验证md5
004B1F6F|.BE 10000000 mov esi,0x10
004B1F74|.8D5D EC lea ebx, ;加载MD5
12.查找二进制字符串全0的地方 0056B0AE .0000 add byte ptr ds:,al
等下就跳到上面地方改代码
004B1F64 8D55 EC lea edx, ;加载MD5
改为
004B1F64 /E9 45910B00 jmp qqqf.0056B0AE ;加载MD5
004B1F69 |90 nop
在0056B0AE处添加代码
0056B0AE C745 EC 11EA7>mov dword ptr ss:,0xA370EA11
0056B0B5 8D55 EC lea edx,dword ptr ss:
0056B0B8 8B45 FC mov eax,dword ptr ss:
0056B0BB E8 186DF4FF call qqqf.004B1DD8
0056B0C0 BE 10000000 mov esi,0x10
0056B0C5 C745 EC 11EA7>mov dword ptr ss:,0xA370EA11
0056B0CC 8D5D EC lea ebx,dword ptr ss:
0056B0CF ^ E9 A36EF4FF jmp qqqf.004B1F77
保存文件,测试正常!
--------------------------------------------------------------------------------
【经验总结】
和小生教程里不太一样,我是在winxp下做的
--------------------------------------------------------------------------------
【版权声明】: 本文原创于吾爱破解,转载请注明作者并保持文章的完整,谢谢!
2015年08月03日 16:55:31