网络游戏逆向分析-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. Day002 Java特性和优势

    Java特性和优势 简单性(摒弃了c++的指针和内存分配释放) 面向对象(万物皆对象) 可移植性(write once run anywhere) 高性能 分布式 动态性(反射机制) 多线程 安全性 ...

  2. 【转】风控中的特征评价指标(一)——IV和WOE

    转自:https://zhuanlan.zhihu.com/p/78809853 1.IV值的用途 IV,即信息价值(Information Value),也称信息量. 目前还只是在对LR建模时用到过 ...

  3. @shiro.hasPermission 使用

    在页面上加上@shiro.hasPermission 如下用.ftl为例子: 当加上shiro标签后,会与后台代码结合使用: 需要继承AuthorizingRealm  下的 protected Au ...

  4. IT培训软件测试怎么样,问问“过来人”!

    经常看到有人在网上发帖子问:"XX培训(IT培训机构)怎么样,学过的老哥可以出来讲讲真话吗?"问这种问题的同学,来,站起来!我不得不在这儿说你两句:你要想知道一家IT培训机构到底怎 ...

  5. ACM、考研、就业,在我心底已经有了明确的答案_人生没有完整的,只有无悔的

    思绪再三,还是决定放弃了ACM,走上考研路(我现在是大二下学期,马上结束).虽然我们ACM的带队老师经常说:"ACM和考研是不冲突的",但是我感觉做ACM和考研的关系不是很紧密,而 ...

  6. Spring Cloud Alibaba(9)---Sentinel概述

    Sentinel概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护.热点防 ...

  7. VS2019解决X64无法内联汇编的问题

    策略:VC编译器x64平台不支持内联汇编,我们利用在Source文件中直接添加asm文件,直接在asm文件中写汇编代码,然后将asm文件编译为OBJ文件.然后就可以在c++文件中声明asm文件中的函数 ...

  8. 一道VM的逆向所引发的符号执行思路

    逆向虚拟机保护 虚拟机保护类的题目需要找到虚拟机的vm_code(字节码),各个handler,然后进一步分析虚拟机保护代码的流程. 用IDA打开程序,经分析后0x403040全局变量地址处存储的就是 ...

  9. 初识ClickHouse——安装与入门

    前言: 久闻 ClickHouse 大名,一直没有去详细了解.近期看了下 ClickHouse 相关文档,决定安装体验下.想了解 ClickHouse 的小伙伴可以一起跟着学习哦.本篇文章主要介绍 C ...

  10. java集合-哈希表HashMap

    一.简介 HashMap是一个散列表,是一种用于存储key-value的数据结构. 二.类图 public class HashMap<K,V> extends AbstractMap&l ...