网络游戏逆向分析-4-分析喊话call参数来源
网络游戏逆向分析-4-分析喊话call参数来源
好久没更新了,去实习去了,大家见谅一下。

前面找到了喊话功能call函数,然后分析了它的参数有五个,分别的四个push的和一个ecx:
第一次
edx = 0
ebx = 0
ecx = 7E205ABC //字符串的首地址
edx = 5ABEB800
ecx = 2747D108
第二次:
edx = 0
ebx = 0
ecx = 2747D108
edx = 5ABEB800
ecx = 2747D108
通用指令:
push 0 //第一个push edx对应的edx寄存器始终为0
push 0 //第二个push ebx,对应的ebx寄存器始终为0
push ecx //字符串的首地址
push 5ABEB800 //edx的值
mov ecx,2747D108
需要找到ecx和edx的值的来源
很明显只需要分析到ecx和edx的来源就可以完全利用该函数了。
找ecx基址

这里的ecx是从eax来的,然而eax往上只有一条mov eax,dword ptr ss:[esp+40]采用赋值语句,而我在打断点给这里之后,发现这里的 ss:[esp+40] != 2747D108,并不和我们要的值相等,所以肯定是后面有函数把它改了,通过单步调试发现是中间的这个函数修改了eax:

进入该函数查看是一个jmp指令,再进入jmp指令查看:

就很明显得可以看到基址了 eax== ds:[ds:[1595EF0] +38]
找edx(foo版本)
这个相当麻烦,首先还是先往上找,查看修改edx的内容:

这里可以看到的是利用了esp寄存器,牵扯到esp寄存器就比较麻烦了,因为如果有函数调用肯定会修改esp寄存器的,不像之前那么好找了。
我在尝试了一些列的办法后,决定采用偏移地址的办法,也就是刚进入函数的时候的esp和到了该指令的esp+40的地址,首先给函数入口点和该指令分别打上断点:

然后查看函数首指令的esp:

然后查看跑到了指令之后对应的esp+40的地址:

可以非常明显的发现,两个值就差了4个地址,而且在该函数该地址对应的值没有改变过,所以在这个函数里面找没意义,需要往上找。
然后给外部函数打个断点:

发现它其实就是栈顶的内容,调用call指令后会压入一个返回地址,所以偏移了一下。
然后往该函数上看,就可以知道其实这个值就是我们找的喊话函数的一个外部函数的调用参数,而且这个外部函数也是一个thiscall:

eax==喊话call里面的edx。
然后分析这里的eax就好了。
这里的最近一个指令又是和esp有关的:
mov eax,dword ptr ss:[esp+10]
所以就先把对应的地址记下来,然后给该函数整体的首部打一个断点来观察该地址如何被修改:

这里呢,我发现了一个简答的办法,直接给该地址下一个硬件访问断点就好看,前面是我sb了。
发现,它在这里是直接被bl修改了后四位,改成了5ABEB800,在该指令之前它的值为:5ABEB858,就修改了最后一个字节 。该指令前的内容是xor bl,bl把bl清零了,然后再故意赋值过来的,看来是刻意而为之。


通过对这个大函数整体分析,可以看出来这个应该是一个完整的喊话函数call,先判断你喊话是在那个分组,如果是组队,你有没有队伍,然后还有判断说话的cd是否够。
我们之前一直采用的是普通的喊话,所以应该就在修改的时候前面是条件判断判断你是什么分组,还有判断你的cd,然后再调用mov byte ptr ss:[esp+10],bl来分到普通喊话里面,然后调用。
但是其实这里又浪费时间了,因为这个函数我是分析得没错,肯定是来比较喊话的分类还有CD看能不能发,但是这里只有这一条指令改变了5ABEB858,所以就往上找5ABEB858这个值,因为5ABEB858->5ABEB800值所以往上找5ABEB858的来源。
所以又往上找一层函数:

这里很明显可以看到入栈了一个speak函数,继续往上找一个函数call,看看到底谁修改了这个地址0019DAD8的内容为:5ABEB858

这个函数不对劲了,除了说话其它指令如移动这些也可以断下来,而且0019DAD8这个地址的内容修改了,所以这里感觉可以找到我们要的东西。我们给他改成一个条件断点,来满足0019DAD8的内容为:5ABEB858这样,就可以只在喊话的时候断下来了。
这里其实也有不对了,当你点进对话框的时候就会被修改为5ABEB858这个值了,所以这里应该是来确定是否是对话框,然后我们在后面的应该就是判断能否正确发出。
这里的整个函数没看出有啥思路:

但是其实已经告诉我们很多信息了。
所以我觉得再往上找一层:

条件断点还是成功了,还是这个值,我真是服了。
再往上找:

这个函数体里也没有看到有修改的,就又找上一层函数:

现在的情况就是你输入和修改文本框就会断下来,不仅仅是输出。
但是还是没有,又往上:
还是没有,再往上:

但是这里就出问题了,给第九层打了条件断点,但是却跳过了,停在了第八层,感觉要解决了。
所以这里就专注来调试,第九层里面的内容:

给第九层开始打一个断点来观察是哪里修改了0019DAD8这个地址的内容:
但是不能这样做,因为这个函数很多地方都会调用如果断下来就会一直断下来,根本不能确定是喊话的时候停下来的,所以在我观察了所有的汇编指令后,我发现没有一个是直接有基质然后赋值的,基本上都是和寄存器打交道,于是我决定给这里面的每个函数调用完之后打条件断点来判断是不是这个函数修改的内容。

停在了这个啊,然后给前面这个call eax打一个条件,然后破案了,就是这个call eax里面修改了ss:[0019DAD8] = 5ABEB858
这个属实就把我难到了。
找edx(正确版本)
其实说前面是找到了的,但是我自己傻逼了。
首先:
如果看到有esp+某个偏移作为媒介调用很有可能是两种情况:
1:传给函数的参数
2:函数的局部变量
当然你想怎么逆你自己看着来。
其实前面:

这里的mov byte ptr ss:[esp+10],bl是已经找到了的。
太过于纠结为四个字节了,其实这里就是一个byte来确定,而且确定的就是发言的类型,为0就是普通发言。害难顶。
然后用代码注射器试一下:
push 0 //第一个push edx对应的edx寄存器始终为0
push 0 //第二个push ebx,对应的ebx寄存器始终为0
push ecx //字符串的首地址
push 0 //edx的值
mov ecx,2747D108 //这个是对象首地址,this地址
完全没问题。
白忙活几小时了。
网络游戏逆向分析-4-分析喊话call参数来源的更多相关文章
- 网络游戏逆向分析-3-通过发包函数找功能call
网络游戏逆向分析-3-通过发包函数找功能call 网络游戏和单机游戏的分析有相似点,但是区别还是很大的. 网络游戏和单机游戏的区别: 网络游戏是需要和服务器进行交互的,网游中的所有功能几乎都会先发送封 ...
- 网络游戏逆向分析-6-使用背包物品call
网络游戏逆向分析-6-使用背包物品call 首先,大家在处理网络游戏的时候,一定得利用好发包函数,因为他就是整个网络游戏的关键. 处理办法: 这里还是直接给发包打断点来处理. 就像我们之前处理喊话函数 ...
- Linux系统IO分析工具之iotstat常用参数介绍
Linux系统IO分析工具之iotstat常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.安装iostat [root@flume115 ~]# yum - ...
- Linux系统IO分析工具之iotop常用参数介绍
Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...
- 20145307陈俊达_安卓逆向分析_APKtools分析smail
20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...
- x264源代码 概述 框架分析 架构分析
函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作用: 白色背景的函数:不加区分的普通内部函数. 浅红背景的函数:libx264类库的接口函数(API). 粉红色背景函数:滤 ...
- 转:[gevent源码分析] 深度分析gevent运行流程
[gevent源码分析] 深度分析gevent运行流程 http://blog.csdn.net/yueguanghaidao/article/details/24281751 一直对gevent运行 ...
- Qt Creator Valgrind内存分析前端(分析Nginx内存)
Linux上使用Qt Creator进行C/C++开发http://my.oschina.net/eechen/blog/166969Qt Creator GDB调试前端(调试Nginx):http: ...
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
随机推荐
- 第九章 身体质量指数BMI的python实现
身体质量指数BMI:对身体质量的刻画(Body Mass Index) 国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析 定义: BMI=体重(kg)/身高^2(m2) 提出问题: 实例 ...
- Linux | 配置主机名称
配置主机名称 为了便于在局域 网中查找某台特定的主机,或者对主机进行区分,除了要有 IP 地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问. 在 Linux 系统中,主 ...
- Linux | 命令的参数
命令的参数 格式:command parameters --> 命令参数 短参数 在短参数中,字母的大写效果是不同的,比如大写 T 和小写 t 的含义通常是不同的. 一个短参数 最常用的参数形式 ...
- STP概述简介及生成树算法
目录: STP概述 STP简介 生成树算法 选择根网桥 选择根端口 选择指定端口 BPDU(桥协议数据单元) STP利用BPDU选择根网桥 STP的收敛 VLAN与STP关系 MSTP多生成树协议华为 ...
- python all any函数(相反)
''' all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False. 元素除了是 0.空.FALSE 外都算 TRUE. 语 ...
- Node性能如何进行监控以及优化?
一. 是什么 Node作为一门服务端语言,性能方面尤为重要,其衡量指标一般有如下: CPU 内存 I/O 网络 CPU 主要分成了两部分: CPU负载:在某个时间段内,占用以及等待CPU的进程总数 C ...
- 2018年成为Web开发者的路线图
本文通过一组大图展示了Web开发技能图谱,给出了作为Web 开发者可以采取的路径,以及总结了想要成为Web工程师的朋友们.希望和大家一起交流分享 介绍 Web 开发的角色一般说来,包括前端.后端和de ...
- React 模块与组件
React 模块与组件 几个重要概念理解 1). 模块与组件 1. 模块: 理解: 向外提供特定功能的js程序, 一般就是一个js文件 为什么: js代码更多更复杂 作用: 复用js, 简化js的编写 ...
- 构建高效Presubmit卡点,落地测试左移最佳实践
樊登有一节课讲的挺有意思,说中国有个组织叫绩效改进协会,专门研究用技控代替人控的事情.其用麦当劳来举例子,他说麦当劳其实招人标准很低,高中文凭就可以,但是培养出来的人,三五年之后,每一个都是大家争抢的 ...
- android10Binder(五)java世界的binder:AndroidFramework
java世界的binder:AndroidFramework 目录 java世界的binder:AndroidFramework 一.前言 二.SystemServer进程的open.mmap 三.A ...