Baymax大白补丁从菜鸟到精通
故事从拖入文件后说起,难点在“异常中断补丁”菜单中,点【添加补丁】
出现下面的窗口
我们先从圈8,反调试说起,这个工具确实强大到不行不行。
你有两种添加定位到修改的VA地址的方法:
1种是直接输入+内存基址
1种是通过特征码(机器码的形式输入)
之后伟大的Nisy校长,又写了EXE版本的特征码学习工具和Ollydbg/x32dbg/x64dbg特征码转换工具
可谓是相当的便利!
=====================================================================
添加反调试检测,这个还是比较简单的。
找一个地址使用就行了。
这个程序中用不着使用,关于 添加反调试检测 我们就说到这里吧
-------------------------------------------------------------------------------------------------------------
接下来,我们找个地址进行第一个简单的任务:弹框训练 ,地址选择00408818好了
如果多行就要加\r\n(最多三行哟)
点添加,点保存。
回到主界面中,选择 圈9号 或 圈10号 都行。强烈建议选择圈9,创建劫持调试补丁(因为在调试过程中,不仅有log日志文件输出,程序还会转化成第二种模式,可谓相当的人性化设计)
生成EXE并补丁后,再生成dll后,再运行主程序后,就会像上图这个样子。
我们发现编辑框里啥也没有?是的,因为那个地方主要是放入注册码用的。
-----------------------------------------------------------------------
接下来,我们的任务是弹出00408824 |. 6>PUSH MageBros.00457570 ;Software\SaitoGames\MageBros这个地方的注册表键值
我们先来猜一猜,这次会不会成功呢?
测试后发现还是上图中的那个弹框,并没有成功,这是为什么呢?
因为00408824 PUSH 00457570是一个压栈的语句
当F8执行后值才能传入其中!
所以正确的伏击地点应该是:00408829
00408829 |. E>CALL MageBros.0042AB00 ; 对,就是这里!这里我们在堆栈窗口中才能真正意义的得到
光添加完了,别忘记,你还要再展示给观众才行的。这里只是添加,并没有得到哟~~
我们发现这次我们成功了。
为啥要加【】呢?
大家可以参考下校长语录和温馨提示。呵呵,菜鸟最笨的方法就是多试了。不明白就用实践来检验真理。见多识广,吃得多了,用得多了,一样可以进步的
关键得坚持,不能气馁。
==================================================
接下来,我们继续弹框练习。。。
刚才我们弹出了一个Software\SaitoGames\MageBros
如果它是带有连接符号的注册码呢?
所以练习3:在这个后面加上★▲◆字样
这样我们又学会了连接字符在内存注册机中的使用
===================================================
我们添加 内存 添加寄存器数值
这次我们成功得到了EAX的数值
还可以得到里边的其他数值,比如截图的这些哟 ~~
改变这两项就可以了哟~~
多多弹框,多多测试,好处多多。
========================================
在【内存注册机】下拉菜单中,我们还有一项【使用存储数据】没有演示其功能
接下来我们就来说 这个!
这个东东要怎么用呢?
这又得从【存储当前数据】说起了。
校长Nisy对于内存注册机的设计理念是:①存 ②读 ③展
我们可以利用弹框做许多其他的事情,比如遍历控件,遍历注册表键值,搞个弹窗炸弹~~
这种效果也是意外测试出来的,实际想想就跟你在用OD调试到某个循环的汇编命令一样的
只不过,大白补丁扮演了夹三儿(注入和劫持)这样的强大功能。
明白了原理,我们就可以继续测试和学习了。
============================================================
接下来,我们00458574这个存真码的地方设个硬件访问断点
然后我们就来到了另一个地方,这个地方在一个循环中!
这个地方有一个特点,如果你用的是硬件访问断点,那么一次就断到了,并且第一次的数值就是我们要得到的真码!
这次我们要练习的是条件断点+注册机+弹真码!
我们说干就干,试验开始。
经过试验,这样是不行的。因为该地址会被反复的读取到。
所以还得来个条件。而且上面的次数并不适用。
所以用004062B2的时候,我们用eax 或edi 都是可以的,同时我们发现eax=458574 ,edi=458574
也就是说
B1:内存注册机>添加寄存器指向内存
1-1)可设上硬件断点,或选择智能都行,建议选择上硬件断点!
1-2)取edi寄存器指向的内存地址的数据(因为是寄存器窗口中看到的,所以不加中括号,即[edi]
1-3)条件断点为:edi=00458574 (edi即dword)
B2:内存注册机>弹窗展示记录信息
2-1)可设上硬件断点,或选择智能都行,建议选择上硬件断点!
2-2)同1-3
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这是一种条件设置方法,还有另外的那种我们也可以试一下。
我们再一次得胜了。
到这里我们已经学会了【内存注册机】下拉菜单中的1235、神奇的条件断点、添加反调试检测。
接下来,我们学习修改寄存器标志位在大白补丁中是如何使用的:
我们运行程序,来到注册的地方!
接下来,我们就对这个JE下手。
为了让每次都能弹框,所以上面的1次,得改成【每次】截图失误了,抱歉!寄存器值我们取反就行
(OD中寄存器窗口显示为z=1,你就输入0;反之0就输1也是这个道理)
=================================================================================
接着,我们再来说一下【存储当前数据】->保存寄存器/保存寄存器指向内存
它分为两种情况:保存寄存器 就是说,你打算要寄存器里边的byte ? word ? dword? qword?(x64dbg中使用)
它们对应 1 2 4 8 字节,跟咱们用bph xxxxxxxx, r, 2(x32dbg/x64dbg中的硬件断点一个道理,很容易理解了吧?
这校长Nisy的黑科技还是相当给力的。
也就是说,可以得到这个里边的东东~~
是不是弹出了Thank you很高兴呢?然而这个地方是不行的。为什么呢?
0042AE5C CALL MageBros.0042A9F0 ; 显然这里的返回值,决定下面cmp和下面的je跳转(所以必F7一探究竟
0042AE61 MOV EAX,DWORD PTR DS:[0x46ABE>; 这句是赋值
0042AE66 CMP DWORD PTR DS:[EAX+0x28],0>; 这句是比较
0042AE6A JE SHORT MageBros.0042AE7F ; NOP
0042AE6C PUSH 0x40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0042AE6E PUSH MageBros.004575A4 ; |Mage Bros.
0042AE73 PUSH MageBros.004585A8 ; |Thank you改成 PUSH 0x458574
0042AE78 PUSH ESI ; |hOwner
0042AE79 CALL DWORD PTR DS:[<&USER32.M>; \MessageBoxA
我们看上面的代码,就会发现,起决定的作用的在0042A9F0里,所以F7之后,我们看到了下面的代码!
0042A9F0 /$ 6A FF PUSH -0x1
0042A9F2 |. 68 4A5F4500 PUSH MageBros.00455F4A
0042A9F7 |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0042A9FD |. 50 PUSH EAX
0042A9FE |. 83EC 1C SUB ESP,0x1C
0042AA01 |. 53 PUSH EBX
0042AA02 |. A1 508F4600 MOV EAX,DWORD PTR DS:[0x468F50]
0042AA07 |. 33C4 XOR EAX,ESP
0042AA09 |. 50 PUSH EAX
0042AA0A |. 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+0x24]
0042AA0E |. 64:A3 00000000 MOV DWORD PTR FS:[0],EAX
0042AA14 |. C74424 08 00000000 MOV DWORD PTR SS:[ESP+0x8],0x0
0042AA1C |. A1 ECAB4600 MOV EAX,DWORD PTR DS:[0x46ABEC]
0042AA21 |. 85C0 TEST EAX,EAX
0042AA23 |. 0F84 C3000000 JE MageBros.0042AAEC
0042AA29 |. 50 PUSH EAX
0042AA2A |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+0x10]
0042AA2E |. E8 5DB8FDFF CALL MageBros.00406290
0042AA33 |. 68 74854500 PUSH MageBros.00458574 ; MB-3186-2945
0042AA38 |. 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+0x20]
0042AA3C |. C74424 30 00000000 MOV DWORD PTR SS:[ESP+0x30],0x0
0042AA44 |. E8 47B8FDFF CALL MageBros.00406290
0042AA49 |. 8D4424 1C LEA EAX,DWORD PTR SS:[ESP+0x1C]
0042AA4D |. BB 01000000 MOV EBX,0x1
0042AA52 |. 50 PUSH EAX
0042AA53 |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+0x10]
0042AA57 |. C64424 30 01 MOV BYTE PTR SS:[ESP+0x30],0x1
0042AA5C |. 895C24 0C MOV DWORD PTR SS:[ESP+0xC],EBX
0042AA60 |. E8 FBBAFDFF CALL MageBros.00406560
0042AA65 |. 85C0 TEST EAX,EAX
0042AA67 |. 75 31 JNZ SHORT MageBros.0042AA9A
0042AA69 |. 68 68854500 PUSH MageBros.00458568 ; MB31862945
0042AA6E |. 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+0x18]
0042AA72 |. E8 19B8FDFF CALL MageBros.00406290
0042AA77 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+0x14]
0042AA7B |. 51 PUSH ECX
0042AA7C |. BB 03000000 MOV EBX,0x3
0042AA81 |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+0x10]
0042AA85 |. C74424 30 02000000 MOV DWORD PTR SS:[ESP+0x30],0x2
0042AA8D |. 895C24 0C MOV DWORD PTR SS:[ESP+0xC],EBX
0042AA91 |. E8 CABAFDFF CALL MageBros.00406560
0042AA96 |. 85C0 TEST EAX,EAX
0042AA98 74 05 JE SHORT MageBros.0042AA9F ; 正确的地方是这里!NOP
0042AA9A |> B8 01000000 MOV EAX,0x1
0042AA9F |> F6C3 02 TEST BL,0x2
0042AAA2 |. 8B15 ECAB4600 MOV EDX,DWORD PTR DS:[0x46ABEC]
0042AAA8 |. 8942 28 MOV DWORD PTR DS:[EDX+0x28],EAX
0042AAAB |. C74424 2C 01000000 MOV DWORD PTR SS:[ESP+0x2C],0x1
0042AAB3 |. 74 10 JE SHORT MageBros.0042AAC5
0042AAB5 |. 83E3 FD AND EBX,0xFFFFFFFD
0042AAB8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+0x14]
0042AABC |. 895C24 08 MOV DWORD PTR SS:[ESP+0x8],EBX
0042AAC0 |. E8 FBB9FDFF CALL MageBros.004064C0
0042AAC5 |> F6C3 01 TEST BL,0x1
0042AAC8 |. C74424 2C 00000000 MOV DWORD PTR SS:[ESP+0x2C],0x0
0042AAD0 74 09 JE SHORT MageBros.0042AADB
0042AAD2 |. 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+0x1C]
0042AAD6 |. E8 E5B9FDFF CALL MageBros.004064C0
0042AADB |> 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+0xC]
0042AADF |. C74424 2C FFFFFFFF MOV DWORD PTR SS:[ESP+0x2C],-0x1
0042AAE7 |. E8 D4B9FDFF CALL MageBros.004064C0
0042AAEC |> 8B4C24 24 MOV ECX,DWORD PTR SS:[ESP+0x24]
0042AAF0 |. 64:890D 00000000 MOV DWORD PTR FS:[0],ECX
0042AAF7 |. 59 POP ECX
0042AAF8 |. 5B POP EBX
0042AAF9 |. 83C4 28 ADD ESP,0x28
0042AAFC \. C3 RETN
我们这次用0042AA98再来尝试下上述操作。
z依旧填0
这次成功了吧? 未注册标志去除了吧?我们得到了第二次练手的机会了。
==================================================================================
接着我们再尝试下【修改EIP(NOP)】
依旧是这里!补丁过后,我们依旧变成了注册版。
我们再来看下帮助中是怎么说的? 原来它的原理是这样的啊 ~~ 也就是说,那个地方并非只能填写一个NOP,还有个【偏移量数值这么一说】
So,那我们【0042AA9A-0042AA98=2】行不行呢?
解释和分析:0042AA9A MOV EAX,0x1是一个赋值的语句,修改EIP的转向正好让它执行了这句,故此eax=1
程序走到0042AAFC RETN就会开心的把eax=1这个好消息传达给下面的注册标志,所以也就会注册成功~~
所以熟练运用好大白工具必须掌握几个要点: ①熟练的在Ollydbg/x32dbg/x64dbg认真的分析过、测试修改过、理念上实践上都能通的过才算成。 ②Y:在大白补丁工具中填写时,最好备一份自拟的填表方案和顺序号内容与之一一对应。这对初学者好处是非常多的。 ③Z:利用备份*.bpt文件反复保存与导入修改来修改填写错的地方,当前版本还不支持反向填表功能。这也是没有办法的办法或技巧。 ④利用思维导图、自己总结的填表对应值来少走弯路的填写正确的结果。 |
保存过后,补丁 ~~~ 我们又胜利了 ~~
果然可以啊 ~~~~ 兴奋吧 ~~~ 幸福吧 ~~~ Nisy万岁 ~~~
我们又学会了两招 ,不错吧 ~~
不仅复习了OD中灵活多样的条件断点 ~~
我们的条件断点生成器也快重新出炉了 ~~
这得益于对校长Nisy ’s Baymax Patch Tools的深度拆解和汇编中一些概念的重新认识和补足 ~~
工具会了,下条件断点会了,编程进一步扩展自己的断点生成器也有了新的想法了 ~~
真是一举数得啊 ~~
===================================================================================
PS:0042AA1C 或 0042AA21 其实都是可以的
==========================================================
后面还有一个存储,三个寄存器修改,一个HOOK还得再好好研究下才能补足下面的知识点。
那好,就先到这里吧 ~~ 几十张截图够喝一壶的了 ~~ 毕竟 学了 快两周时间了 ~~ 笔记做了一箩筐 ~~ 又是思维导图,又是列表,又是笔记 ,又是表格,又是电脑,又是本本,收益很多啊 ~~最后最后祝校长Nisy姐姐福寿年年 ~~开发出更牛X的工具来 ~~
00408EC3 . 6>PUSH 0x30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00408EC5 . 6>PUSH MageBros.004575A4 ; |Mage Bros.
00408ECA . 6>PUSH MageBros.00457664 ; |MageBros is already running.
00408ECF . 6>PUSH 0x0 ; |hOwner = NULL
00408ED1 . F>CALL DWORD PTR DS:[<&USER32.Messag>; \MessageBoxA
==================================================
0042A8C0 . 8>MOV EAX,DWORD PTR SS:[ESP+0x8]
0042A8C4 . 3>CMP EAX,0x110
0042A8C9 . 5>PUSH ESI
0042A8CA . 0>JNZ MageBros.0042A950
0042A8D0 . 8>MOV EAX,DWORD PTR SS:[ESP+0x14]
0042A8D4 . 8>TEST EAX,EAX
0042A8D6 . A>MOV DWORD PTR DS:[0x46ABF0],EAX
0042A8DB . 0>JE MageBros.0042A9AF
0042A8E1 . 5>PUSH EBX
0042A8E2 . 8>MOV EBX,DWORD PTR DS:[<&USER32.Get>; USER32.GetDlgItem
0042A8E8 . 5>PUSH EDI
0042A8E9 . 8>MOV EDI,DWORD PTR SS:[ESP+0x10]
0042A8ED . 6>PUSH 0x400 ; /ControlID = 400 (1024.)
0042A8F2 . 5>PUSH EDI ; |hWnd
0042A8F3 . F>CALL EBX ; \GetDlgItem
0042A8F5 . 6>PUSH 0x1 ; /ControlID = 0x1
0042A8F7 . 5>PUSH EDI ; |hWnd
0042A8F8 . 8>MOV ESI,EAX ; |
0042A8FA . F>CALL EBX ; \GetDlgItem
0042A8FC . 6>PUSH 0x0 ; /lParam = 0x0
0042A8FE . 6>PUSH 0x1E ; |wParam = 0x1E
0042A900 . 6>PUSH 0xC5 ; |Message = EM_LIMITTEXT
0042A905 . 5>PUSH ESI ; |hWnd
0042A906 . 8>MOV EDI,EAX ; |
0042A908 . F>CALL DWORD PTR DS:[<&USER32.SendMe>; \SendMessageA