因为群里有人学习找数据费时费力 所以两年前的总结晒出来 谢谢大家支持我 辅助保护内核pe研究QQ群 493622016 http://jq.qq.com/?_wv=1027&k=2LIhoYI
一,找点击选怪物call以及选怪状态标志
1,ce搜未知数据 ,选择一个怪 ,搜变动 ,换一个 再搜变动 最后找到最像的 查看访问地址代码 记下后 od附加跳转,下段 返回上一层 用注入软件测试一下
2,找到后 记下call上下代码和call内部代码 遗迹ce搜到的代码 方便以后定位基地址
3,一般参数是存放怪物id等信息的地址 和另外一个参数(可能是用来存放计算得到的怪物id等信息 就是ce搜到的存放怪物id的内存地址) 向上找 一般格式是mov[变量地址],数值
4,和选择怪物call相关的动作 ce搜到的数据 就可以直接od跳转到调试 向上找就能找到相关的动作call
5,或者直接bp send
6,ce搜出来的所点击怪物的id的地址 完后通过它od里找到的是一个call 吧某处地址的数据存入了ce找到的地址里面了 具体这个某处地址的数据是怎么来的 没点击肯定啥也没有 点击了 才会在某个地方计算 点击的坐标 和怪物的坐标等等数据 计算结果才会算出这个怪物的id 具体估计是在某个库里的call里面计算 所以你找不到的 点击选怪call 如果要自动运行 就必须先知道要攻击的怪物的ID等信息 所以你找哪里把怪物id存放到那个地址里 不是白费功夫吗
选怪状态标志:
查找经验:
1,有些游戏如天龙八部 每次调试出现错误 再启动 游戏的反汇编指令地址和特征码都在变动 所以每次找到重要数据 都要记录反汇编指令和特征码还有所在模块名字
2,选择怪物 ce搜未知初始化数据 完后不选择怪物 搜变动 来回搜 完后跳跃 打坐 搜未变动 几个回合后 剩下四五个了,完后选择一个 找访问的指令 写入的也可以 完后od跳转向上层找来源 发现
最后都会有个来源的地址的数据不停地变动 而且那层call不停的断下来 ce也搜不到访问的指令 那就说明只有用户选择了怪物 才会有数据存进那个地址 不然就是不停地变动(可能被其他指令访问存
取)
3,第一种情况遇到后不着急 ce查看另外一个搜到的结果 查看访问的代码 完后od跳转 是这种如上图指令:mov ecx,dword ptr ds:[esi+0xC] 完后发现是个二叉树遍历 完后发现是个二叉树数组
数组里每个二叉树的指定偏移都是选中怪物状态的标志 od不断下来 那些标志和数据也不变化 那就找到了 完后找树根 比如刚才那个指令下断点 完后内存窗口更随 完后ce搜包含esi的地址 完后搜
包含esi地址的地址 以此类推 找到了上图00745410 |. 8B30 mov esi,dword ptr ds:[eax] 完后发现eax来源ds:[edi+0x10] edi是基地址0x986618 断下来后数据不变动 那就找到了
二,寻路call 以及 坐标加密
1,ce搜索未知 跑动 改变 不跑 不改变
2,一般人物跑动状态是bool a=0 1 或者int a = 0不动 1跑动 2 走动 一般搜索0到2之间数字 有可能1是不动 0是跑
3,ce找到小数字 查看写入的代码 此时ce可能搜索到有很多个貌似得内存地址 一定要看跑的时候往里面写入的指令 比如跑的时候写入0 就监视器中找mov byte ...0之类的语句 选择几个 查看写入的代码 首先看游戏跑一下 监视器中有没有多弹出来的某条指令 如果有 那看是不是mov byte 之类的 因为可能是bool值 一个字节 如果没有多弹出来的指令 就看每条指令类似mov byte ,或者直接吧ce搜出来的地址 锁住 看游戏能跑动不 一般不能跑动的就是要找的了 记下来 od跳转 完后下段 ctrl+f9 上一层看这个call参数有没有坐标数值或者是存坐标的结构地址 或者把该call nop掉看看
4,完后一般寻路call 都是 先读取障碍物图call 完后查看坐标是否在障碍物上 完后是寻路call(武林外传的)
5,call参数如果是个地址,一定要在call内部看看这个地址 哪些偏移被访问了 没有断下来的时候里面存的是不是被访问的数据 如果没有 说明其他地方把数据写入了这地址的偏移里面了 还要再找找哪里写入的
6,坐标可能加密,一般是SHL SHR
7,如果坐标加密 当前寻路call下段后 参数里存放的地址 跟随进去后看到的是加密后的坐标 所以要查看哪里写入了这些坐标 一般下断点后 断下来的是读取现在的坐标完后 加每一步的偏移 最后写入那个地址里 而我们要找到的啥时候把现在的坐标写入的 所以要返回人物画面 重新进入游戏 断下来后一步步找
三,技能call
1,ce搜未知 选择怪物 搜变动 没选择 搜0
2,访问代码 双极怪物 看ce数量为1的代码 od跳转 一般格式是
while(1)
{
判断鼠标的目标
if(人物在攻击状态)
读取目标id
普攻
}
3,以上找不到 就在技能栏放两个技能 ce搜索未知初始化数据 完后把第一个栏的技能移动到别的栏 完后ce搜0 完后第一个栏放上一个技能 再搜变动 直到找到几个类似数据 选择较大的ce搜到的三个 最小的数字是技能序号 只查看访问大的的代码
查看访问 的代码 打开监视器 游戏里掉整一下技能位置 看监视器跳出的指令 记下 od查找到技能数组 完后 数组第一个元素是地址 ce查看方位这个地址的指令 od跳转到地址处 完后附近call里面的某个call就是技能call 一般参数 0或者1比较多 有个参数是可以随着技能不同而变化
4,也可以bp send 完后向上跳转 点击od上的k键 复制下 完后每个call都下断点 没有使用技能就断下来的 就pass掉 完后剩余的 nop掉再恢复 看看有没有任何动作 如果有的话 就基本不可能是了 接着向上层call 按同样方法nop再恢复 看有没有啥动作 如果一点都没有 就先在这个call里面开始 遇到的每一个call都同理nop掉在恢复 看有没有动作 没有的 就进入 同样道理直到找到
四,找铭文包call
1,bp send 完后游戏里做一些动作 断下来后 返回上一层 查看[esi+4]是封包头部[esi+8]是封包结尾 ce搜+8de地址 查看写入的代码 发言时候断下来od内存中中能否看到发言内容看不懂就是加密call
2,
五,鼠标点击普通攻击call
1,有时候k堆栈表啥都没有 换个od 或者ollyice(大陆od改进版) 删掉调试udd文件再试试
2,ce搜怪物id内存地址 查看访问的代码 返回游戏 攻击怪物 完后在监视器中查看 最先出来的指令(实在不行就看下一个出来的指令) 完后od跳转 看是不是该条指令下面吧这个怪物id访问出来后 存进了别的内存地址 完后ce 搜这个内存地址 查看访问的指令 完后 再去攻击怪物 监视器中查看 最后出来的访问的指令(不行就倒数第二出来的 以此类推) 完后od跳转 看指令下面的call 进入call开头下断点 返回后删掉这个call 在攻击怪物 看行不行 有没有任何动作(如果死屏的话 估计不是这个call了)完后撤销修改 再看有没有什么动作 有的话估计也不可能是了
3,bp send 下段后 返回 查看堆栈表 复制下来 找到最后的的call(nop掉不能有任何多余动作) 完后在这call里里面 分三层方法:
1,进入call后逐一排除 只要nop掉 什么动作都没有就行 至于恢复后有什么动作无所谓
2, nop掉后 看光标 如果有战斗的光标 点击后不打怪物 的话 可能就是他了
3, 进入后查看复制的堆栈表 看看哪个call在这个call的里面 完后在他附近找call nop 一下看看
六,背包数组和背包物品名称
1,
struct Goords
{
DWORD ID;
char name[32];
int num;
}
可以ce搜 物品id 物品名字 或者物品数量
d1911b526f83
2,提示vp protect 程序发生未知错误 重新启动游戏不登陆 重新打开od 完后提示错误 完后退出游戏 在登陆游戏 可解决 b不行 就 结束qqprotect 或者od进程 或者换个od
3,ce搜到 药品名字 修改的时候 不要改数据类型为text 再修改 会出错
4,od向上找基地址的时候 一定要注意每次 查看的找到的每次偏移 不下断点 的时候 还有没有数据 比如找血基地址 [esi+8c]+c 一定要先看+c这个地址有没有原来的数据 完后看esi+8c 里面有没有原来的数据 没有的话 就要查找哪里写入了
5,搜索物品名陈 有时候要搜 金创药(50) 的unicode编码
6,有时候要用ce搜到的的指令(搜物品名字的unicode 完后查看访问 当鼠标移动到物品上 监视器中弹出来的指令 记下) od跳转过去 遇到[local.x+xx] 或者堆栈内存都存在的 虽然不断下来 里面的值 一直在变化 也可以通过向上条件断点[local.x+xx]==xx 断下来 可以直接记下地址 完后[0x245678c]==xxx 245678c
可以使内存或者堆栈地址 如果 此时 里面数据是要找的数据 说明还要往上看往上找断下来没有要找的数据 就是这里存进去的
7,我猜可能是 因为当我鼠标移动到 这个物品的时候 才会显示物品名称 此时 是更具光标位置 算出移动到哪个格子 才会算出哪个物品 才会显示出名称 也就是说 此时你更具ce搜索访问那个地址(ce搜到的储存物品名称比如金创药)的代码 完后鼠标移动到金创药上 此时ce监视器中跳出几个mov ax,[ebx] 完后od跳到这里 向上找ebx 来源 最终卡到一个地址处 里面即使不断下来 也是很多数据不停地变动 因为此时你没有吧鼠标移动到金创药上 所以这个地址里面的指针式垃圾指针 只有当你鼠标移动到金疮药上的时候 某个call才会根据光标位置算出具体是在哪个物品上 完后把这个物品的关系地址发到 那个内存地址里 你才会看到 但是因为这个地址里的数据不停地被一些垃圾数据写入 你下断点 会无数次断下来 ce搜索出一堆 根本不知道当你鼠标移动到金创药上 是哪里写入数据到那个内存地址里
8,实在od遇到第七的情况 找不到名称基地址 就ce遍历搜索物品数组取出来的对象
9、通过搜索背包物品的数量,比如说,背包里面有个红药,有100个,那么,我们就用CE搜索100.
然后吃掉一个,改变他的数量,在搜索99.一次类推,最后会得到一个或者几个数值.剩下的就慢慢测试吧.
10、用物品在背包格里面的位置来搜索,比如说红药在背包第一个格子里面,我们用CE就搜索 未知初始化数值.
然后改变红药在背包的位置,移动到其他位置,搜0,移动回来,搜改变的数值,以此类推.
(c语言编程的特性,物品存在即大于0,不存在为0)
11,ce搜索存储物品名字的地址 要范围搜索 因为物品名字前面可能还有一些字符串和他是一体的 完后结果中找最大的内存地址 完后查看访问这个地址的代码 如果没有看到访问的指令 那就搜索存储这个物品名字的内存地址 可能是访问了这个存储物品名字的指针 完后吃
一下药物 看看有没有显示出来的指令
12,,ce搜索物品名字 最好是把文本宽度设置的宽一点 可以看有多余的字符出现 可能性就少了 比如:金创药</seg><obj>
13,可以先找到吃药call 进入后分析找到从物品数组取出的物品结构call
16,ce搜索名字的地址 要范围搜索 因为物品名字前面可能还有一些字符串和他是一体的 完后结果中找最大的内存地址 完后查看访问这个地址的代码 如果没有看到
访问的指令 那就搜索存储这个物品名字的内存地址 可能是访问了这个存储物品名字的指针 完后吃
一下药物 看看有没有显示出来的指令
七,人物角色姓名蓝色怒气血量
1,条件断点 eax == a247080 对吗
2,mov ecx,dword ptr ss:[ebp+0x1C] ebp到上层发现是00ce7cf0 其实只要此时发现 程序名字.00ce7cf0 就是基地址了 但是ebp=00ce7cf0 不是ebp = [00ce7cf0] 别搞错了
3,遇到这种指令mov ecx,dword ptr ss:[ebp+0x1C] 别着急查看哪里写入数据到[ebp+1c]里面了 而是要看没有断下来 此时里面的数据还是不是原来的数据 如果是的话 那就找ebp来源
4,ce搜素血量 完后被怪物打 查看变动的数值 完后修改一下数值 看看修改哪个后 血量变动 就是他了 (搜出来的绿色的地址也可以 但是修改数值后不能改动人物血量)完后查看写入的指令 再被怪物打 完后监视其中看最后的类似于mov [],eax这种 完后od跳转 向上跟 最后找到后 +4 +8等位置一般为怒气 或者其他相关
5,ce查看写入的指令的时候 比如遇到mov dword ptr ds:[esi+0x278],edx 找的是esi的来源 而不是edx的来源 切记
找人物名称经验:
1,ce搜索宽字符(unicode)或者窄字符(g2b) unicode:3575505b386e67720d54cf65
2,ce搜索后找mov ax,word ptr ds:[ecx+ebp*2]这种类型的 一般都是数组形式取出来的 或者不行换一个试试
3,ce直接查看访问的指令(没有经过附加条件比如鼠标点一下完后才查看ce监视器) 完后od跳转 下段 无限断下来 这种情况下 就不用条件断点 直接断下来向上找
八,找明文包
,006C5802 |. 8B06 mov eax,dword ptr ds:[esi]
006C5804 |. 8B4E 04 mov ecx,dword ptr ds:[esi+0x4]
006C5807 |. 3BC1 cmp eax,ecx
006C5809 |. 74 1A je short elementc.006C5825
找到类似的 完后esi+4的地址下内存写入断点
2,在send call哪里下入断点 查看data 地址处的内存 随便下一个写入断点 od跳转后 到开头看看
3, 弄两个相同动作 查看堆栈表 那些call一样 对比出来 最后一个一样的call
九,根据技能和普通攻击分析出游戏大概的循环攻击功能框架
1,
2,bp下断点 完后向上层 复制堆栈k表数据 完后找到上层第一个不停断下的call的下一层call 完后nop掉 如果此时按技能键没有任何效果 撤销nop 看看有没有变
化 如果有 那么游戏的功能call和封包组合call可能不在一个支线上 可能在别的岔道口的支线上 因为根据循环技能框架分析知道 我们刚才找到的第一个无限断下
来的call的所在的call可能是一个无限循环判断是否有技能发生 他的判断条件就是看看某些结构等东西里面是否有某个标志 有的话就会调用封包组合函数 而我们
刚才说的nop掉的那个call是一个封包组合call或者是 封包组合call和功能call的集合 因为此时撤销nop发现 还是有相关动作发生 说明刚才说的那个结构里面的某
个标志还存在 所以循环技能不停地调用这个被nop掉的call 你撤销nop 他正好调用了 也说明这个call只是封包组合call 不包含功能call 因为只有功能call才会
把那个标志写入某个结构里 完后就在刚才被nop掉的call下断点 完后查看参数(或者向上看看有没有跳转指令 跳过这个被nop的call的 完后断下后和撤销断点后看
看里面的值有没有变化 注意:这里的跳转指令类似于技能框架里的判断某个结构里的某个标志是否存在一个值 如果存在就执行功能封包call 完后就是可能在功能封
包call里写入数据到发包结构里 完后发送封包 最后就是恢复那个结构里的某个标志为某个值 也可能是在刚才说的被nop掉的封包组合call的下面恢复那个结构里
的某个标志为某个值 具体看这个被nop掉的call下面还有没有类似mov指令 如果都是pop之类的那恢复那个标志的指令就存在于刚才说的被nop的那个封包组合call里
面支线) 内存窗口跟随进去 完后撤销断点 看看里面哪些值发生变化了 完后ce搜索查看写入的指令 完后od跳转 如果此时看到的只是一些简单的赋值指令 估计
不是功能call 那就向上层返回 感觉像功能call的话 就nop掉看看 没有任何动作的话 估计就是了 而且一般像拾取call的话 参数比较少 而且一般就一个call就可
以完成 找到这个call后 注入测试
如果那个被nop掉的call后 在撤销nop 发现没有任何动作 那么就测试这个call看看是不是功能与封包组合call的集合call 或者
进入这个call再细找详细哪个是功能call 注意刚才说的 一般拾取这些call 参数少 一个call就可以实现
( 遇到这种call doword ptr ds:[eax+0c]断下来无线断的情况 在他的下层call里找条件判断 查看哪里跳过那个下层call 按照上述方法也可以 此时注意每次查看跳转标志位的值是否改变 要下断点查看的 注意每次断点后这个标志位内存地址的值还是不是一样 不一样就不行了 有时候不好找到正确的标志位的话,可以看看哪些跳转地方的标志位的内存地址的值每次运行某个功能(比如普攻)的时候就会发生改变 不运行这个功能就不改变的话 就ce查哪里写入了这个改变的值 od跳转后也可以向上层按照上面方法找到 是在找不到标志位的话 可以试试啥时候啥条件成立就会把eax设置为0049C883,比如只有某个内存(标志位)里的值为1的时候就会把eax的值变为0049C883,那么就找到标志了 剩下就是ce查看哪里写入.
)
九,怪物坐标,数组,等
<坐标>
1,ce搜坐标 换文本 换字节 搜不出来 就是加密了 就是230 经过加密变成256032
2,od跳到代码处 向上找 注入工具测试 完后找到以后 进入call 一个看 找类似235200这样的数字 完后ce搜索写入地址的代码 找到加密来源
<数组结构>
1、我最常用的就是通过怪物的血量来找.搜索怪物的血值方法和上面类似
2、通过怪物的名字搜索,这个方法比较麻烦,有时候要看运气.而且还要看怪物名字是什么类型的.文本/UNICODE. 搜一种怪物名字完后跑向另外一种怪物 完后查
看那些内存地址变为这种怪物 完后选几个查看写入地址
3、可以通过人物于怪物的距离
4、可以通过怪物的等级
5,选怪call的参数分析
6,按照技能结构分析的经验 找到选怪call
7,进入单步执行 找到第一个call 返回一个从数组中选出来的怪物id 完后进入这个call查找从哪里返回出来的 直到找到一个数组
十,判断是否是怪物(角色怪物类别)
1,普通攻击call里面在跳转地方 查看怪物或者npc对比看那个跳了
2,ce选择怪物搜索初始化值 完后选择npc 选择改变的 选择另外一个npc 选择没改变的 以此类推
3,内存遍历怪物结构
十一,跨图寻路call
1,call内部头部下断点 一直断下来 可以[esp]!=0x4526c 这里的4526c是这个call返回到哪个地址
2,可能注入测试的时候 参数需要几个内存地址存储一些值 不用vs2010写代码 可以直接ce搜索0的内存 完后写入一些值 吧这些内存地址push 进测试call就行了
3,有些游戏 城里的坐标和城外的不一样
4,有些游戏的寻路call的参数内存地址存放的的坐标是加过密的 当执行到这个call的时候 坐标被别的call解密修改写入了
5,gettickcount 是得到操作系统启动后到现在的秒数 一般用于加密
6,scanf字眼的是用于得到游戏界面的内容 比如当前地图id 当前坐标什么的
7,堆栈和内存都存在的地址 想要找到哪里修改了这个地址的内容 可以在开头下断点 此时断下来里面的内容不是要找的内容 完后ce查看写入的指令 完后撤销断点f9运行到下个断点(此时地址里面是要找的内容) 再看ce的监视器 一般找最后出现的指令就是了
8,一般call调用测试不成功 一般都是参数不正确 看看call里面哪些访问了参数的哪些偏移内容 对比我们注入测试的时候 是不是这些偏移地址内的内容和正常情况下不一样 完后找哪里写入的这些内容 比如 写入的内容是ds:[eax+11c] 就找eax来源 发现eax= ds:[esi+02c] 发现esi的值=ds:[edx] 里面每次都在变动 ce查看那里写入 看最后出现的 od跳转 完后继续如此的找 其实这种情况一般都是在找到的call上几层的call下断点 完后看看此时参数有没有地图id 目的目标 当前坐标 这几个参数 如果有那就找对了 这个call里面某个地方的call会改变ds:[eax+11c]里面的值 完后你第一次找到的call会访问这个地址的值 因为你没调用那个写入ds:[eax+11c]地址处的call,所以此时你发现你测试的call没用
9,如果你下断点 想返回上层 此时可能当你的动作触发后 不止一次被断下来 这种情况 最好是 在下段点前先看看这个call开头有没有提示 多个 调用来自某个地址 如果有 那就没必要下断电了 只能按照别的办法了
10,有时候进入城里或者客栈什么的 是另外一个call负责寻路 可以进入城里后再寻路 send断点断下来找到那个call
11,有时候测试call没跑进客栈 坐标改一改 改类型 double float dword 或者13.1254这种写入进去 完后不行就退出游戏重新测试 有时是游戏问题不是call问题
十二,拾取,打坐等call
1,按照第九步
十三、技能数组(结构)方法:
1、搜索CD时间,一般都是用回城这个技能来搜索,先用CE搜索,未知初始化数值然后搜索减少的数值.
2、通过技能名字查找,CE搜索文本型,技能的名字.
3、可以通过快捷栏对象搜索. 或者使用技能更具参数技能id向上找到
4、设置默认技能或者选择某个技能,然后搜索技能名字(搜默认技能对象地址,未知初始化).
5,一个call开头 前面几个nop 以为是call开头其实 可能是跳过来的 注意跳转
6,找某个内存里的值何时被写入的时候 找不到 此时要注意上层call的参数push 可能吧某个值压入这个内存里了
7,ce搜索名字的地址 要范围搜索 因为技能名字前面可能还有一些字符串和他是一体的 完后结果中找最大的内存地址 完后查看访问这个地址的代码 如果没有看到
访问的指令 那就搜索存储这个技能名字的内存地址 可能是访问了这个存储技能名字的指针 完后点击一下那个技能列表按钮 看看有没有显示出来的指令
8,有时候call开头下断点 返回上一层 这个call开头要看准了 有的时候call开头没有红线提示跳转 按ctrl+a分析后也没有 而且旁边没有?这个暗示开头的符号
那么它就是call开头 不要弄错了
十四、地面物品数组(结构)方法:
1、找距离,找一个不变的地面物品,通过人物走远走近,搜索增加或减少的数值.
2、找名字吧,不过这个比较麻烦,也比较耗时间,就是CE搜索未知初始化数值,然后地面掉一个物品
就搜这个物品名字
3、找掉落物品的数量
搜索未知,掉一个,搜增加的值,减少一个就搜减少的值当然不一定能找到就是了,因为很多游戏都没有这个值
十五、任务数组(结构)方法:
1、通过任务打怪的数量来查找,比如你打15/50,就搜索15,打16,就搜索16.(文本型),或者是byte类型
2、通过任务的名字来查找,CE搜索任务的名字.这个比较好找.
3、通过任务的数量来查找,这个和方法1差不多.(不如接了5个任务,然后在接就搜增加,取消就搜减少)
4、任务状态参照上面
十六、装备数组(结构)方法:
1、通过装备的耐久度来搜索,一般是字节.
2、通过装备的名字来搜索.CE搜索装备的名字.
十七、队友数组(结构)方法:
1、通过队伍的数量来搜索,比如你一个队伍5个人,就搜5.然后T掉一个,就搜减少.
2、搜索队伍里面队友的血量.
3、搜索队伍里面队友的名字.
4、通过搜索队伍里面队友掉线的方法,因为一般来说,组队了,掉线不会马上脱离队伍的,这时候就可以通过上线,下线来搜索
十八、宠物数组(结构)方法:
1、通过宠物的属性来搜索,比如宠物的血,等级,坐标等
2、通过宠物的召唤标志来搜索,比如召唤搜1,没有召唤搜0.
十九、找周围玩家与NPC数组
1、通过周围玩家与NPC名字来查找,CE搜索任务的名字.这个比较好找.
二十吃药call
1,一般参数是药品在背包的序号 横竖序号 或者药品id 6bd什么的
二十一物品等级 人物等级以及cd冷却时间
1,更具下面的结构图 可知道当等级小于物品等级不会调用 我们可以买一个物品等级大于自己的物品 完后更具堆栈表 找到吃药call完后 下断点 完后吃那个买来的药 看能不能断下来 能断下来 就进入这个call的下层call 下断点 直到找到不能断下来的 完后就在那个call上面找跳转 或者开头下断点 能跳转就注释1 完后吃等级低于自己的药物 也同样一路注释下去 对比找到计算人物等级和物品等级的call
2,cd冷却偏移也是同样道理 完后如果当前call上下文很多跳转 就在附近遇到跳转就下断点 遇到jmp 就在他前面的跳转下断点 完后写十几个后 点击正在cd冷却中的药品 完后看在那个断电的时候 就跳过吃药call了
二十二技能冷却偏移
1,同物品冷却call 有时候在发包call的上面有个跳转 cd冷却时间内 这个跳转就会和cd冷却时间外的不一样
二十三喊话call
1,更具第九步 一般参数是有喊话内容
二十四跳跃call
1,根据第九步 一般没啥参数
二十五打开npc对话框call
1,按照第九步找到标志位 完后od跳转后 到上层后 看是不是那个call 不是的话 就在本层找找其他call 不行就是再上层的call 以此类推
2,一般打开npc对话框call这种类似的动作 要先分析第一先跑到npc对面 完后才执行打开npc对话框 所以找到标志位后 od跳转后到上层后 一般不是打开对话框call
,要再往上找到参数一般一个的那种call 完后在头不下断点 段两次 第一次是调用寻路call 第二次调用打开对话框call
3,参数有时候分析会发现分析道:
006A3B32 |> /33D2 /xor edx,edx
006A3B34 |> |8B43 0C mov eax,dword ptr ds:[ebx+0xC]
006A3B37 |. |B9 07000000 |mov ecx,0x7
006A3B3C |. |8D7C24 14 |lea edi,dword ptr ss:[esp+0x14]
006A3B40 |. |8D70 08 |lea esi,dword ptr ds:[eax+0x8]
006A3B43 |. |F3:A5 |rep movs dword ptr es:[edi],dword ptr ds:[esi]
006A3B45 |. |8B08 |mov ecx,dword ptr ds:[eax]
参数来自esi 这是批赋值指令 此时大概看一下上下指令 原来是从左子拿出一个对象指针 完后把他里面的七个数据批处理复制到另外一个结构 以此类推直到左子树弄完 后面就看不明白了 大概是这么个意思 此时我们当点击npc打开对话框的时候断下来 发现里面七个数据第一个是102 于是乎想要自己遍历这个二叉树 找到符合102的那个 可是在当前头部下段后发现ebx+c里面都是0 于是查看那里写入 发现另外一处地方写入 而且发现这个地方有一个call先得出一个对象地址 完后吧一些七个值都批复制到里面 此时发现那七个值来自esi 我们此时要弄清楚那个对象指针里面的七个数据是啥东西 于是我们就到上层找esi来源 于是发现一堆往esi的对象指针里批复制的指令 由于其他的6个数据不变 只有一个类似于指针在变化 就找这个来源吧 于是就接上上层找 最后找到一个数组 当我们点击npc断下来的时候 此时数组第一个元素进去后再进去就会发现是npc的id +4+8等等都是些垃圾数据(因为对比了断下来时候数组里的和上面那些指令ebx+c 点进去后的对比 发现除了npc 的id 其他都不一样貌似是垃圾数据 实在不行就进入打开npc对话框call进去后看看访问了哪些偏移地址不就知道了?)
4,关闭对话框由于有些游戏不发包 所以不能通过bp send来找到 只能通过有关系的行为来找 比如开着对话框 就不能寻路 可以在寻路call下断点 进入后对比关闭
对话框后的寻路 查看标志位跳转 完后找到一个内存地址 里面是1就标志开着对话框 0就是关着 完后ce查看写入的指令 od跳转 到上层 测试调用call成功
上文提到的找到的数组:
、当点击npc 打开对话框的时候 ebx=0进去后是怪物id
[[[[[00CEBE30+0x20]+0x1D4]+ebx*4]+0x4]+0c]+2=npc id
二十六 接受任务,放弃任务
1,按照第九步,接受任务有一个参数是npc ID 还有一个参数可以看出是选择了某个选项
2,放弃任务的参数一般很少 一般一个
二十七 任务完成标志
1,更具任务的数组 随便选一个任务的结构 od内存里修改一下 不是真修改 只是为了改变时候会变红 完后去完成他对应的的任务 切记这个任务完成后不是变成其他的任务 完成后界面上他就消失了 完后再对比od内存 看看哪些地方修改了 一般看ffff0203这种数据 比如武林外传就是03变成00 多对比几次 有时候不是03变00而是02变其他数字等等
二十八游戏控件和子控件
1,进入登录界面 切换线路 第一个是0 第二个是1 以此类推 完后ce找到后 od跳转进入后 dd 内存地址(里面存放的是刚才ce搜到的地址) 完后找到上面第一个
element.1234 (此时会注意到第一个控件字符串list)这种进入后是一堆element.2345 这种 就是虚函数表完后在存放1234的地址处 ce搜索访问的指令 选择一个 od
跳转 查看ecx来源 完后 看看看看这个来源内存进去是不是刚才第一次看到的list字符串 如果是就找来源吧 完后ce查看访问他的代码 完后od跳转向上找到来源 数
组数量可以查看访问数组地址的代码 找到类似于循环遍历的代码也可以找到数量基地址
2,也可以点击强行登陆等check复选框 ce搜索1 完后撤销 ce搜索0
3,子控件偏移就是按照第一步 内存中进去发现第一个字符串list 那时候就是偏移
找控件数组:
找控件数组经验;
1,ce搜索密码字符个数 最后找到进入游戏call 他的参数是一个事件id名称 ecx就是对应的控件(大控件就是包含小空间的)
2,找ecx来源 发现最后找到一个堆栈地址 ce也搜不到来源 比如要找哪里吧数据022cdc写入那个堆栈地址 可以ce搜那个022dc 完后查看访问指令 从进入游戏界面 点击返回上一步进入选择服务器界面
查看监视器中的窗口多出一个数组的指令 完后od跳转 接着向上跟 最后找到上面说的的eax 发现进入后是当前控件数组 select_server2 坐标在1e4 有的控件在1d0处周围
3,找的过程中 发现假如eax来源于一个堆栈地址 ce搜写入这个地址的时候 发现一堆杂乱无章的数据 毫无头绪的时候 ce直接搜写入eax的那个值 比如想找到eax的值0x2145001是啥时候被写入那个堆
栈地址的 就ce搜0x2145001就行了 完后选择一个 查看访问的指令 od跳转接着找
4,游戏进入游戏窗口 激活后 就是听到音乐后 再下断点调试 后期就是不听到音乐下断点 激活后断下后找数据
5,下断点后 断下来后 不能查看内存窗口的偏移 不然汇报不能访问进程内存的错误
6,od内存窗口查看ascii文本的时候要注意用hex 16位查看 这样当你按减号的时候 可以返回去不然饭不会了
二十九游戏登陆验证码
1,先进入游戏 完后看到提示输入验证码的对话框后 ce搜索四字节 未知初始化数据 完后刷新验证码 搜变动 几次下来后 移动对话框位置 完后搜不变动 完后写入一些数字 搜不变动 最后剩下4000多个 完后按照地址分几大类 比如23412c 234125c 2341278 发现都是234开头 那么就是一类 选择第一个 以此类推 选择10个 完后ce查看访问代码 注意要看带mov的 而且要是四字节的 最后od跳转后 看是不是循环复制图片数据进去 里面的数据大概都一样 比如.......p.........p...........p 完后剩下两个后 发现代码存放了好几个图片数据 不知道哪个是要找的时候 就看call结尾 发现此处吧一个图片数据复制到了一个固定的地址处 那个固定地址就是了
找验证码图片基地址经验:
1,点击刷新 搜四字节或者字节等变动 持续几个回合 完后输入一些数字 不点击确定 再输入不变动
完后剩下几千个 你点击确定 这时候弹出验证失败请重新输入 你搜索未变动的 这时候就剩下几百个了 你归类一下 看开头的地址 比如123ffc 123fbv 你发现都是123家族的 你就选择第一个123ffc 以此类推 这是我在别的教程那里学来的 完后选择几十个后 依次查看访问的代码 完后你点击刷新验证码 完后看监视器里有没有mov 类的指令没有就找下一个 有就od跳过去看看是不是批复制
看看是不是批复制类的指令 或者是循环复制某些数据到另外一个内存中
图片的数据 一般有很多一样的
2,记者这些特征 完后吧那些数据改一下 你看看验证码发生变化没有 发生变化 说明就是这个了 完后查看那些地方访问了这个地址 直到找到一个基地址存放着数据前前后后都不变动 除非点击刷新
3,,有时候有些数据不是图片 是游戏自己画上去的 怎么区分呢 就是修改中间的为ff 查看验证码中间是不是多了一条黑线 如果多了 那就是画上去的
三十游戏窗口以及游戏登陆选择区和服务器
1,直接下showwindow断点(条件断点 不然会一直断下来 无法找到真的)和WritePrivateProfileString断点就可以找到 记住游戏要在选区的界面才行 完后选择一个区 断下来后 就能看到写入游戏ini文件哪些内容 最后GetPrivateProfileString可以得到对应的内容 WritePrivateProfileString写入对应的内容
showwidnows的call的参数 可能不变 不用继续向上找 一般是通过getwindowlong得到的一个userdata
三十一进入游戏call和账号密码框输入call
密码账号找call经验:
1,ce搜索输入的个数 找到剩下的几个 完后查看访问 一直断下来的先pass掉 找到一个没有输入就不会断下来的 完后输入一个1 断下来后 堆栈窗口向下查看有一个参数是31的那个诸如返回到某个地址的注释 完后右键汇编窗口中跟随 完后测试
2,ce搜索的时候 最好查看两次访问 看看变化不 有时候查看访问的结果不一样
3,d找到的call地址会每次启动游戏都变动 所以要getmodulehandle(call的地址-dll的基地址=偏移) 获得dll的基地址或者百度搜枚举模块dll 或者在od 的M窗口 右键特征码搜索 搜到的区段 (call的地址减去区段的基地址=偏移)完后浏览器外挂收藏夹里有两篇文章可以参考 搜索pe 指定的区段+ 偏移就是要call的地址了
4,如果是lua call 调用他可以直接下lua_dostring断点 完后做一个动作 完后断下来 向上层就是主进程领域了 完后调用
进入游戏找call经验;
1,同上ce搜索密码框个数 完后查看访问的指令 找到一个不下断点就不会断下来的 完后下断点 完后查看k堆栈窗口 完后看有没有挑一个call 的参数是上面说的id 那就找到了
2,如果是按照bp send找的话 要注意循环发包结构 完后查看访问写入封包的地址的指令 完后od跳转完后下段 完后向上找 挨个nop 直到找打一call被nop掉后 点击进入游戏 什么反应东西都没弹出来
3,这个call也可以用来干别的 比如焦点转移 点击别的按钮 只有和事件有关的 只是参数变化罢了
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)