一、游戏的CALL 1.调用MessgeBoxA函数call示例 (1)找到MessageBoxA call地址 (2)分析MessageBoxA call的参数 (3)注入代码测试调用MessageBoxA call push 0x11 push 75AEBB1F push 75AEBB1F push 0 call 75ACAB20
- 窗口菜单类CALL分析 1) .windows菜单基本知识: 菜单被点击的时候发送的是WM_COMMAND消息 窗口处理函数 LRESULT CALLBACKwindowProc ( _in HWND hwnd, in UINT uMsg, in wPARAM wParam __in LPARAM lParam ) ; 当点击菜单的时候,windowProc会被系统调用: uMsg 赋值为: wM_COMMAND wParam 赋值为:对应的菜单的ID〈我们要分析的数据就是这个) 2) 用OD打开扫雷游戏程序,定位窗口处理函数的地址 窗口处理函数地址:01001BC9 3) 在扫雷游戏windowProc函数处下条件断点 条件是:uMsg == WM_COMMAND 如: edx == WM_COMMAND的条件断点
01001BC9 /. 55 PUSH EBP ASCII "酎 " 01001BCA |. 8BEC MOV EBP,ESP 01001BCC |. 83EC 40 SUB ESP,40 01001BCF |. 8B55 0C MOV EDX,DWORD PTR SS:[ARG.2] 01001BD2 |. 8B4D 14 MOV ECX,DWORD PTR SS:[ARG.4] 在这里下断点 01001BD5 |. 53 PUSH EBX 01001BD6 |. 56 PUSH ESI
4)分析出各项菜单被点击时, windowProc的4个参数的值 EBP+8 /000F117E ; UNICODE "tls_hotkey32" 参数hwnd EBP+C |00000111 参数uMsg EBP+10 |00000209 参数wParam EBP+14 |00000000 参数lParam
如: wParam 初级菜单ID: 0x209 中级菜单ID: 0x20A 高级菜单ID: 0x20B 5)注入代码调试 push 0 push 0x209 push 0x111 push 0x000F117E call 0x01001BC9 二、分析游戏基地址 1.基地址的概念 全局变量 字符常量等的地址 2.查找和验证基地址 1)使用CE内存查找工具查找数据地址 1.首次先让要查找的数据稳定在某个范围(或者某个精确的值) 使用CE的首次扫描功能 2.改变要查找的数据,根据变化筛选出数据地址 2)OD中验证是否就是基地址 通过下内存断点的方式来验证 add dword ptr [ 1005194],eax ;这种立即数寻址的基本都是基地址
三、游戏菜单点击和读取基地址 四、扫雷游戏的辅助编写 1.雷区数据分析 雷区数据基地址 0x01005361 宽 基地址0x01005334 高 基地址0x01005338 char a [ 24][ 32] //ReadProcessMemory
- 分析数据意义 0x8F 翻开是雷 0x10 结束标示
五、植物大战僵尸游戏
- 分析阳关基地址 006A9EC0
2.分析金币基地址 通过CE工具收索游戏本次运行的金币基地址 猜想 金币和数字对应比例,可能是1:1,也可能是其他比例 分析:金币显示的值不是数字1:1关系,我们只能通过范围搜索的方式定位金币的地址了 植物大战僵尸:显示金币和数字之间的比例10:1 金币的地址不是绿色基地址,所以我们需要找到[基地址+偏移地址]的方式来表示它 金币基地址 006A9EC0 3.分析植物安放的冷却时间 猜想 冷却时间是一个计数器变量,每隔一段时间增加一定的数量 递减:10 9 8 7 6 5 4 3 2 1 0 递增:0 1 2 3 4 5 6 7 8 9 10 通过CE工具收索游戏本次运行的计数器变量地址
if(计数器的值>上限值) { 植物就判定为可安放状态 } 植物就判定为不能安放状态 思路一:改掉计数器上限的值,可以缩短冷却时间 思路二:直接修改代码段,改变程序的执行流程
分析植物大嘴花吞噬的冷却时间 思路:找出判断大嘴花吞噬时间的代码,并改变执行逻辑 1.先定位大嘴花吞噬时间计数器变量的地址 2.通过CE或者OD工具定位谁访问了这个地址,从而定位到判断大嘴花吞噬冷却时间的代码 3.分析判断大嘴花吞噬冷却时间的代码
分析按放植物ca11 思路:找出按放植物的ca11代码 1.先定位代表鼠标右键选中植物类型的地址 2.分析ca11代码的参数及堆栈 3,将自己的写的植物按放的汇编代码注入到游戏进程空间中
5.远程线程注入代码 步骤: 1)打开目标进程 OpenProcess,获取到目标进程句柄 2)在目标进程分配内存空间 VirtualAllocEx 3)往分配的内存空间中写入代码 4)远程调用 CreateRemoteThread执行目标进程指定地址的代码 5)等待远程线程执行完成 WaitForSingleObject 6)释放目标进程空间 VirtualFreeEx 7)关闭目标进程句柄