常德网站建设网站优化,鹤壁网站制作,雄安移动网络电视,广州seo全网营销项目实战1#xff08;30小时精通C和外挂实战#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标
这个外挂只针对植物大战僵尸游戏
开发这个外挂#xff0c;首先要将界面… 项目实战130小时精通C和外挂实战 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标
这个外挂只针对植物大战僵尸游戏
开发这个外挂首先要将界面即桌面程序做出来 外挂包含
外挂界面 事件处理对我们的点击事件进行处理 跨进程访问外挂程序和植物大战僵尸是两个不同进程要控制需要跨进程访问 新建一个PVZCheater的MFC项目弹出框后要选择基于对话框然后点击完成。
02-MFC2-按钮、调试、打开网页
工具箱 按钮button拖到对话框上先不要双击要在名字更改后再双击。 一旦双击会自动生成很多代码
点击button在属性—外观–caption中改表面文字
Dlg是对话框类 Dlg.h和Dlg.cpp分贝是类的声明和实现分离 我们点击按钮需要在Dlg.cpp对应的函数处理需要绑定按钮的I这个ID会在resource这个文件中注册一个文件生成一个id号。
在Dlg.cpp中有个BEGIN_MESSAGE_MAP函数此处就是用来绑定id的 在MFC中使用字符串需要使用cstring包装一下才可以。
对话框的父类的父类是CWND是可以使用messagebox的。 上面给斜线的目的是下面的属于宏宏就是左侧的东西替代右侧的东西两者相互等价其中变量的要用_VA_ARGS_代表将来传进来的多个参数
#define log(fmt,...)\CString str; \str.Format(CString(fmt), __VA_ARGS__); \AfxMessageBox(str);我们可以右击转到定义看其父类
下面参数很复杂
ShellExecuteW(
_In_opt_ HWND hwnd,_In_opt_ LPCWSTR lpOperation,_In_ LPCWSTR lpFile,
_In_opt_ LPCWSTR lpParameters,
_In_opt_ LPCWSTR lpDirectory,_In_ INT nShowCmd); #正常显示就行
LPCWSTR 表示字符串我们只传必要的参数就行了
afx_msg void OnBnClickedBtnCource();
afx_msg这是个标识用来标识后面为事件处理函数。05-MFC5-checkbox及按钮绑定对象 手动绑定事件id声明实现太麻烦我们还有一种自动绑定的方式
第一种自动 Checkbox是可以打钩的东西我们想要监听它的点击事件
我们可以右击Checkbox有个添加事件处理程序 BN_CLICKED单击事件 Bn_doubleclick是双击事件
这个我们要选择单击事件基本上它默认就选好了不用自己选然后点击添加编辑它就帮你做好了
它做了哪些事 1首先在dlg.h声明了一个函数它给了一个public个人认为没必要public这个是内部使用的 2在dlg.cpp中实现了这个函数 3在dlg.cpp中的BEGIN_MESSAGE_MAP(有个绑定操作在最上方应该
第二种自动 直接双击自动生成函数
这个checkbox勾选做一件事不勾选这件事要被取消 我们要判断此时是否有无勾选 在MFC中checkbox对应类型是Cbutton它就是button所以有buttonid
#define log(fmt,...)\CString str; \str.Format(CString(fmt), __VA_ARGS__); \AfxMessageBox(str);第一种判断checkbox是否被勾选的方式
void CPVZCheaterDlg::OnBnClickedKill()
{// TODO: 在此添加控件通知处理程序代码BOOL checked IsDlgButtonChecked(IDC_KILL);if (checked){log(勾选);}else{log(没有勾选);}
}在MFC中界面上能看到的东西最终都是继承于CWND 第二种是通过获得指针来判断的方式 通过id拿到按钮函数再开按钮的check有没有勾选
void CPVZCheaterDlg::OnBnClickedKill()
{// TODO: 在此添加控件通知处理程序代码//BOOL checked IsDlgButtonChecked(IDC_KILL);CButton *button (CButton *) GetDlgItem(IDC_KILL);if (button-GetCheck()){log(勾选);}else{log(没有勾选);}
}还有第三种方法使用变量的方式而不是指针的方式 将其最为一个对象操作此对象就相当于操作此按钮 将其变为成员变量是非常重要的一步在后面开发中会使用到。 1在dlg界面右击checkbox添加变量这是个比较高级的做法 2类型默认控件变量名称m_bnsun,访问private即可子类也不允许访问若子类允许访问就protect 3注释无限阳光点击完成即可
首先在对话框头文件中有CButton m_bnSun; 接着在对话框c文件有
void CPVZCheaterDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_SUN, m_bnSun);这就是变量与按钮的绑定DDX_Control(pDX, IDC_KILL, m_bnKill);
}我们在双击按钮下的函数中可以输入
void CPVZCheaterDlg::OnBnClickedKill()
{//BOOL checked IsDlgButtonChecked(IDC_KILL);/*CButton *button (CButton *) GetDlgItem(IDC_KILL);if (button-GetCheck()){log(勾选);}else{log(没有勾选);}*/if (m_bnKill.GetCheck()){log(勾选);}else{log(没有勾选);}
}这样直接调用对象成员变量就方便多了为我们后面开发外挂打下了基础 现在界面基本上没什么问题了
事件绑定和成员变量的绑定位置不同 成员变量的绑定是在void CAboutDlg::DoDataExchange(CDataExchange* pDX)绑定的
很多东西都是大同小异界面开发逻辑是差不多的 我们精通好一个平台转到其他平台就很轻松只是写法不太一样
06–文件格式、OD序列号
我们要先去考虑怎么破解软件再去思索怎么做外挂
Windows平台文件是PE文件格式我们想要破解的应该是exe文件植物大战僵尸的代码基本在exe文件中我们双击就能启动这是windows平台的可执行文件
三大平台的可执行文件格式
1.windowsPE
2.LinuxELF
3.MaciOSmach-c这些文件格式决定了什么
我们知道一个程序运行起来在内存中分很多段的
代码段、数据段、堆空间、栈空间文件格式是将这段分配位置的
不知道文件格式就不知道代码在哪个地方不知道代码在哪个地方就无法去破解 要想在软件破解深入下去的话必须了解文件格式不了解PE格式很多东西就无法去做
今天软件破解比较简单暂时不用深入了解PE格式
破解windows程序需要了解一些windowsAPI 我们先从简单的入手
Crackme.Exe怎么去破解 这个软件所有代码都在exe文件里面那我可以看其代码有什么东西看其汇编代码。
我们拿到exe肯定是看不到其C语言或c代码的因为它已经编译完了但是我们知道里面放的是机器码机器码和汇编码是一一对应的我可以用某些软件将其翻译成汇编代码
有了汇编代码就能分析它的执行逻辑了。 一旦分析其执行逻辑可以找到其判断序列号的代码。 但我们怎么将其翻译成汇编怎么知道哪些是数据段哪些是代码段自己的话需要懂PE格式 我们使用OD就能瞬间分析代码段在哪里直接将代码段翻译成汇编
如果代码很多使用OD
我们要是很懂windows开发的话在breakpoint可以打一个断点我们点击错误时会弹出序列号不对这就调用了messagebox这个我们可以在此位置打断点只要调用messagebox就弹框停止 带条件的跳转jnzjmz
If(){}else{}
004010BD . 52 push edx ; /String2
004010BE . 50 push eax ; |String1 FFFFFFFF ???
004010BF . FF15 04204000 call dword ptr ds:[KERNEL32.lstrcmpA] ; \lstrcmpA
004010C5 . 85C0 test eax,eax
004010C7 . 6A 00 push 0x0 ; /Style MB_OK|MB_APPLMODAL
004010C9 . 75 1D jnz short CrackMe.004010E8 ; |
004010CB . 68 30304000 push CrackMe.00403030 ; |Title OK!
004010D0 . 68 24304000 push CrackMe.00403024 ; |Text 恭喜你
004010D5 . 6A 00 push 0x0 ; |hOwner NULL
004010D7 . FF15 24204000 call dword ptr ds:[USER32.MessageBoxA; \MessageBoxA
004010DD . B8 01000000 mov eax,0x1
004010E2 . 83C4 14 add esp,0x14
004010E5 . C2 1000 retn 0x10
004010E8 68 1C304000 push CrackMe.0040301C ; |Title ERROR!
004010ED . 68 00304000 push CrackMe.00403000 ; |Text 序列号不对重新再试一次
004010F2 . 6A 00 push 0x0 ; |hOwner NULL
004010F4 . FF15 24204000 call dword ptr ds:[USER32.MessageBoxA; \MessageBoxA我们很容易看到在序列号不对上面有个jnz我们可以在此jnz打断点OD中F2打断点在跳之前断住。
OD读取的是硬盘文件上的内容并不是侵入已经运行的程序 我们利用OD启动程序点击三角形 我们输入666点击checkOD会暂停断点并显示灰色代表此断点停留在此位置
这里用户的序列号要和自己的序列号比较如果相等就通过
在上方有个call 调用函数如果调用的是系统函数OD会识别出函数名并在右侧注释中显示。 若是开发者自己写的函数此函数名就识别不出来做混淆。
我们在call出打个断点就是在调用验证函数的地方打个断点另其运行再看右侧注释能看到序列号
004010BD . 52 push edx ; /String2 9981
004010BE . 50 push eax ; |String1 666
004010BF . FF15 04204000 call dword ptr ds:[KERNEL32.lstrcmpA] ; \lstrcmpA可以看到在右下角的栈空间也有显示
08-暴力破解
暴力破解就是输什么都对或不输也对改判断
If{
恭喜你
}else{
序列号不对
}直接将判断删掉
004010BF . FF15 04204000 call dword ptr ds:[KERNEL32.lstrcmpA] ; \lstrcmpA
004010C5 . 85C0 test eax,eax
004010C7 . 6A 00 push 0x0 ; /Style MB_OK|MB_APPLMODAL
004010C9 . 75 1D jnz short CrackMe.004010E8 ; |
004010CB . 68 30304000 push CrackMe.00403030 ; |OK!
004010D0 . 68 24304000 push CrackMe.00403024 ; |恭喜你
004010D5 . 6A 00 push 0x0 ; |hOwner NULL
004010D7 . FF15 24204000 call dword ptr ds:[USER32.MessageBoxA; \MessageBoxA
004010DD . B8 01000000 mov eax,0x1
004010E2 . 83C4 14 add esp,0x14
004010E5 . C2 1000 retn 0x10
004010E8 68 1C304000 push CrackMe.0040301C ; |ERROR!
004010ED . 68 00304000 push CrackMe.00403000 ; |序列号不对重新再试一次
004010F2 . 6A 00 push 0x0 ; |hOwner NULL
004010F4 . FF15 24204000 call dword ptr ds:[USER32.MessageBoxA; \MessageBoxAJnz跳到序列号不对若将其删掉前面有个CMP比较产生结果jnz根据结果来判断是否跳转到序列号不对而汇编是从上向下执行的若将jnz删掉则直接向下执行恭喜你
说的删掉不是真的删掉直接删掉会导致里面字节缺失字节缺失会导致后面字节向前移导致地址变乱
我们直接将jnz的字节变为空指令Nop什么都不干对应的机器码90占一个字节 直接右击将jnz所占的字节改为Nop下面已知jnz占两个字节故将其改为两个90好处代码不会执行不会影响原来的结构 75 1D jnz short CrackMe.004010E8 ;
抹去一条指令最合理的做法是将其指令所占的所有字节变为90即Nop
1做法右击jnz指令二进制用Nop填充 2此时点击OD的运行暴力破解成功 3但如果我们将OD关掉在双击exe改了吗没有刚刚改的是载入OD的代码在OD内存中将代码改掉了我们应该将改掉的代码重新导出一个exe才能破解 4使用暴力破解后应该右击复制到可执行文件选择所有修改全部复制此时多出个exe有点像η窗口对着此exe文件右击保存文件 5此时关闭OD打开破解版点击就成功进入
这个是比较简单的网上有很多的crackme程序这是比较简单的破解要想破解植物大战僵尸的话还有很多东西要学
英文版有一点不一样只是一些按钮所在位置不太同。
一般的软件破解思路 首先将其载入内存载入OD分析其二进制码进行相应破解导出新的exe
但是有的软件会加大破解难度可能会对软件加壳保护程序不易被破解
加壳 首先有个exe程序A它要进行加壳相当于加了一个exe程序C这个课也就是说我们表面上看到的载进内存看到的exeC将exeA的代码可能包起来了甚至exe中程序代码可能是经过加密的exeC先运行跑起来跑起来后再将exeA代码进行解密解密后再将exeA程序跑起来所以我们载进内存的是他们混合二进制机器码像这种已经加壳的破解应该先脱壳脱壳后只剩下exeA机器码就可以分析破解导出新的exe程序了
09-CE
今天是最后一天 首先打开游戏 秒杀僵尸打一下就死 无限阳光阳光永远用不完
使用CE选择进程
我们此时会发现一个value即数值现在要通过CE将阳光改掉怎么改改阳光要找到阳光所在的内存假设阳光值是int类型占四个字节我们要找到四个字节将数值填充这四个字节就好啦。 我们在value数值输入阳光值50点击fist scan首次扫描在左上角found 说明有这些个地方放着50的值。 我们让其阳光值发生变化再输入75点击next scan 再次扫描我们双击地址在下方会出现我们将值改为500发现游戏值更改了这就类似外挂了后面的辅助本质也是这样都是通过修改内存中的数据达到外挂目的。
外挂的原理修改内存数据
无线阳光就是找到其内存空间内存地址改掉它的值。
10-秒杀僵尸
秒杀僵尸 并不是一下打死需要很多下
可以想象僵尸有个属性生命值打一下生命值就减一下
Zombie zombieZombie.life - 10;秒杀僵尸打一下我们直接将其生命值变为0
Zombie.life 0;我们首先要知道哪句代码修改了僵尸的生命值 首先找到生命值的内存在哪里我们不确定僵尸生命值
1先点击新的扫描选择扫描类型未知的初始值
2点击首次扫描发现found结果很多
3我们可以返回游戏收个阳光僵尸生命值不变未被打选择未变动的数值UNchanged value
4点击next scan 再次扫描
5找个植物打他一下选择减少的值dcreased value
6点击next scan 再次扫描
7循环5、6几次
8找到之后双击就下来了右击找到什么改写了这个地址值find out what write to the access
9选择yes此时就会监听我们再打一下僵尸此时the following窗口就出现指令了就是这句代码改了僵尸的值
00566D10 - 89 B5 C8000000 - mov [ebp000000C8],esi
这句代码改了僵尸的内存地址很明显左侧为ebp000000C8内存地址右侧为值这个ebp000000C8就是僵尸生命值的内存地址
10我们可以使用OD改其汇编代码关闭CE用OD打开exe
11我们ctrG输入上面地址00566D10我们可以找到代码
12秒杀僵尸可以mov [ebp000000C8],0 但有点问题我们可以在前面就将esi 变为0
00566D06 |. 2B7424 20 sub esi,dword ptr ss:[esp0x20]
前面是将esi减去某个值再赋给esi,右侧应该就是打一下减少的值为什么右侧是取内存的数据因为每个植物伤害值不同我们可以 sub esi,esi 相当于esi减esi再赋值给esi就是0
13改汇编的快捷键是敲空格改完后会发现多处两个Nop原来汇编占4个字节修改后占2个字节多处两个变为空
14点击OD运行游戏可发现能秒杀僵尸了我们已经将代码改掉了所以此时调试已有秒杀僵尸的功能了我们可以看到一颗子弹僵尸就挂了
15但是我们发现戴帽子的僵尸打不死好几弹都不行说明这个戴帽子的僵尸跟我们普通僵尸的代码是不一样的被打了最后执行的代码不是刚刚找到的代码此时思路和上面一样样CE找其生命值。
16要想这个游戏彻底一些每个僵尸都一枪搞定此时观察改的代码适不适用这种僵尸不适用再找
17还有个无CD功能也要自己去做CD就是冷却时间
18我们用OD调试程序时是不允许其他程序再调试此程序的所以使用外挂前要关掉OD
19CD是冷却时间肯定也是个数值可以使用CE找到此值并将其值改为0即可和僵尸生命值搜索道理一样。像CD等就是先找出数值内存在哪里然后找到什么汇编修改了它的内存然后改汇编代码就达到了修改程序功能的目的
我们可以将修改秒杀功能后的exe保存成新的破解版此exe就有秒杀僵尸的功能了破解版和未破解版大小是一样的只是将字节替换并未减少或增加
虽然破解版秒杀了但功能无法去掉因为代码已经改死了每次打开都这样所以游戏破解版体验不好外挂体验比较好想要就来不想要就关掉
下面是有关戴帽子僵尸的内存代码 使用CE搜索 找到那个地址更改了此代码 是下面的地址
00566896 - 89 8F D0000000 - mov [edi000000D0],ecx 载入OD找到此地址
CtrG 00566896
00566896 |. 898F D0000000 mov dword ptr ds:[edi0xD0],ecx 向上找到
00566890 |. 2BC8 sub ecx,eax将其改为
00566890 2BC9 sub ecx,ecx 这个改完后是直接一下将帽子打掉了 也就是说此处内存为帽子的生命值
我们先将普通僵尸的生命值打掉在看两者之间关联性
CTRG 找到修改内存的地址
00566D10 |. 89B5 C8000000 mov dword ptr ss:[ebp0xC8],esi ;
向上找到其生命值减少的代码
00566D06 2B7424 20 sub esi,dword ptr ss:[esp0x20]要想将其变成下方
00566D06 2BF6 sub esi,esi
00566D08 90 nop
00566D09 90 nop帽子生命值和普通僵尸生命值是不同的两者互相依存秒杀普通僵尸秒杀帽子两者同步
秒杀帽子后僵尸是普通僵尸会被秒杀普通僵尸秒杀
秒杀帽子的代码更改如下
00566890 |. 2BC8 原来
00566890 2BC9 秒杀后但因前面字节2B是相同的故也可以更改的地址及数据为下
00566891 C8
00566891 C9代码为
//下面是秒杀僵尸的帽子BYTE data1[] {0x2B,0XC9};//2BC9此为帽子秒杀后的数据WriteMemory(data1, sizeof(data1), 0x00566890); //00566890为所修改帽子生命值数据的内存地址//下面是将秒杀僵尸的帽子生命值还原BYTE data1[] { 0x2B, 0XC8 };//2BC8此为帽子原来生命值的数据WriteMemory(data1, sizeof(data1), 0x00566890);这里要注意里面的修改字节数sizeof(data1)要一致否则程序会异常退出