网络游戏逆向分析-3-通过发包函数找功能call

网络游戏和单机游戏的分析有相似点,但是区别还是很大的。

网络游戏和单机游戏的区别:

网络游戏是需要和服务器进行交互的,网游中的所有功能几乎都会先发送封包数据到服务器,然后有服务器做出判断后反馈给客户端,客户端才会产生对应的相关功能。

找功能call的办法:

由于网游和单机游戏的区别,所以在网络游戏中要寻找功能call可以通过在发包函数处下断点来回溯找功能call。

相当于服务器是一个皇帝,客户端每想干什么事情前都得先给服务器进行交互,直到服务器同意才行。

大概是以下这个逻辑:

那么通过发包函数往上找,就可以找到可能是真实的吃药函数,当然也可能是吃药函数到发包函数的中间过程,但是没有关系能调用就好。

发包函数:

Windows的socket发包函数总共有三个:

//ws2_32.send
int WSAAPI send(
SOCKET     s,
const char *buf,
int       len,
int       flags
);
int WSAAPI WSASend(
SOCKET                             s,
LPWSABUF                           lpBuffers,
DWORD                             dwBufferCount,
LPDWORD                           lpNumberOfBytesSent,
DWORD                             dwFlags,
LPWSAOVERLAPPED                   lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
int WSAAPI sendto(
SOCKET         s,
const char     *buf,
int           len,
int           flags,
const sockaddr *to,
int           tolen
);

寻找喊话的功能call

首先查找发包函数,然后给发包函数打断点后再喊话,来查看是调用的哪一个发包函数。

这里通过查找后,发现只有send是可以断下来的,WSASend和sendto都没有用。

但是这里的send和我们想的不一样:

它打上断点后一直就卡这里,还没有喊话就断在这里了。

这里就需要引入一个新的内容:心跳包。

心跳包:

心跳包顾名思义,字面意思是按照心跳来发包,实际意思就是每时每刻都给服务器发个包,借此服务器可以用来检测,比如你是否还在线,是否掉线了,或者你有没有干别的坏事之类的,时刻让客户端和服务器保持联系。

心跳包的特点:心跳包只需要有特定的验证字符就好了,不需要发一堆东西来浪费资源,所以心跳包的长度len一般都比较小,而且长度是固定的。

还好这里心跳包频率不快,还是会隔一会才心跳的,还是可以按照之前的逻辑来找函数call。

假设:A调用B,B调用C,C调用发包函数,那么发包函数执行到函数返回再往上一条的call指令就是call的发包函数,然后再在调用发包函数这里使用执行到函数返回再往上一个指令就是call调用C函数,这样一直往上找六到七个函数来先分析一下看看

这里采用xdbg的办法来给每个函数上注释,通过找到发包函数,然后运行到函数返回回到上一层,然后这样来实现往上找函数。

通过xdbg的视图->注释可以查看到自己添加的注释的位置,以此来方便查看。

通过从send 到1然后到8从下往上给函数打断点,打完断点后人物再喊话来找到函数的call函数。(可以在注释这个窗口打断点)

打完断点后还得测试,测试是否是只有喊话的时候才会停下来,否则就不能用,这里我是在对应注释3这个函数找到的唯一可以在喊话后断下来的函数。

找到喊话功能call函数后进行分析

前面我们找到了喊话的函数,现在对其进行分析,一个函数必不可少的有,返回类型,函数参数的结构。返回类型不太好说明,但是函数参数可以先考虑,首先分析函数参数:

进入这个函数查看,最后有一个ret10,而且前面也给开辟的堆栈平衡了,说明函数的参数栈空间有十六位数的 10个,就是十位数的16,在看该函数前面有四个push,说明就是有四个参数了。

分析这四个参数来解剖该函数:

首先这里有4个push和一个mov ecx,eax。前面在学习反汇编C++的时候就得注意这个ecx,ecx很有可能是类里面的this指针,所以这次给第一个push edx打断点然后一直分析到调用函数:

edx == 00000000
ebx == 00000000
ecx == 字符串的首地址
edx == 6A1E8600
ecx == 2334FD68
//前面的edx ebx ecx edx都是入栈,ecx应该是一个对象的值把,这里猜测一下。
//然后再多调用几次看看有啥变化
//结论是不管多少次都只有ecx == 字符串首地址这个值做了变化

这里先利用代码注入器试一下:

注意:这里需要在一个空白的地方先放置字符串的数据,因为一会要用到字符串的首地址:

但是跟我们输入的字符串不一样,很有可能是编码的问题,这里改成unicode试试:

这样就ok了。

但是这个同样也只能临时用一下,所以还得往上找基址。

需要找的只有edx和ecx,因为别的都是0,或者是内存里的字符串,还有一个就是call的地址是一个静态地址也不用找。

就用前面的教程继续找edx和ecx的基址:https://www.cnblogs.com/Sna1lGo/p/14897870.html

网络游戏逆向分析-3-通过发包函数找功能call的更多相关文章

  1. 网络游戏逆向分析-6-使用背包物品call

    网络游戏逆向分析-6-使用背包物品call 首先,大家在处理网络游戏的时候,一定得利用好发包函数,因为他就是整个网络游戏的关键. 处理办法: 这里还是直接给发包打断点来处理. 就像我们之前处理喊话函数 ...

  2. 网络游戏逆向分析-4-分析喊话call参数来源

    网络游戏逆向分析-4-分析喊话call参数来源 好久没更新了,去实习去了,大家见谅一下. 前面找到了喊话功能call函数,然后分析了它的参数有五个,分别的四个push的和一个ecx: 第一次edx = ...

  3. 《C++反汇编与逆向分析技术揭秘》——函数的工作原理

    各种调用方式的考察 示例: cdecl方式是调用者清空堆栈: 如果执行的是fastcall: 借助两个寄存器传递参数: 参数1和2借助局部变量来存储: 返回值 如果返回值是结构体: 返回值存放在eax ...

  4. 《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口

    <C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户 ...

  5. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  6. SG Input 软件安全分析之逆向分析

    前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...

  7. Android逆向分析(2) APK的打包与安装

    http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...

  8. 【C++】从零开始的CS:GO逆向分析3——写出一个透视

    [C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...

  9. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

随机推荐

  1. pandas(10):数据增删改

    目录 一.对索引进行操作 1 操作索引值df.rename() 二.指定数据替换.修改df.replace() 三.特殊值--缺失值处理 四.新增行列 1 直接赋值添加新列 2 df.assign() ...

  2. 【敏杰开发】Beta阶段项目展示

    [敏杰开发]Beta阶段项目展示 项目相关地址汇总 线上地址:http://roadmap.imcoming.top 前端仓库:https://github.com/MinJieDev/Roadmap ...

  3. 初探DBSCAN聚类算法

    DBSCAN介绍 一种基于密度的聚类算法 他最大的优势是可以发现任意形状的聚类簇,而传统的聚类算法只能使用凸的样本聚集类 两个参数: 邻域半径R和最少点数目minpoints. 当邻域半径R内的点的个 ...

  4. 设了padding要减去盒高 和 line-height 行高

    增加了padding 一定要减去相应的高度,不然整个元素的高度会增高(原高+padding) line-height:行高 1.行高要比字体大,不然字体会挤到一块去 2.若父盒子没有设置高度,则行高会 ...

  5. .NET平台系列10 .NET统一平台愿景

    系列目录     [已更新最新开发文章,点击查看详细] 2019年,微软分享了[统一的.NET堆栈和生态系统的愿景].给开发者带来的价值是,将能够使用一组API,语言和工具来针对广泛的应用程序类型,包 ...

  6. [DB] Flink 读 MySQL

    思路 在 Flink 中创建一张表有两种方法: 从一个文件中导入表结构(Structure)(常用于批计算)(静态) 从 DataStream 或者 DataSet 转换成 Table (动态) pa ...

  7. Linux创建RAID概述

    Linux创建RAID RAID概述 RAID(Redundant Array of Independent Disk)虚拟存储系统 RAID即独立冗余磁盘阵列,其思想是将多块独立的磁盘按不同的方式组 ...

  8. suse12 设置ssh 远程连接

    前提:已安装相应的sshd软件包. 编辑sshd_config文件:vim /etc/ssh/sshd_config PermitRootLogin yes PasswordAuthenticatio ...

  9. node.js module初步理解-(转载)

    在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组 ...

  10. C++ STL 里为什么不维护一个 size 成员变量?

    回答: 为什么 GCC 里要把 list::size() 的复杂度搞成 O(N)? 一通搜索后终于看到有这样的讨论:关于 list::splice() 函数. list 是链表结构,它的优势就在于可以 ...