目录

整理

整体流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
graph
subgraph 整体流程
找出发包函数-->
判断是否线程发包
-->
|否|找出加密封包
判断是否线程发包-->
|是|跳出线程发包-->
找出加密封包-->
|ctrl+F9向外层找|明文包-->
在明文包与加密封包之间找出加密call-->
分析加密call-->
|过滤心跳包|控件包
end

检测

  • CRC检测
  • 数据检测(内存地址)
  • CALL检测
    • 堆栈检测
    • 标志位检测
1
2
3
4
5
6
7
8
9
graph
subgraph CRC检测 
a1([CRC检测<br>即代码修改检测])-->
在猜测的位置下访问断
-->
能跳到检测的位置
-->
nop & hook & 中策:jmp & 上策:改变检测标志位
end
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
graph
subgraph CALL检测 
d0([CALL检测])-->堆栈检测 & 标志位检测
堆栈检测-->
d3["第一种<br>本地堆栈检测"]-->
d1["mov ecx,[ebp+4]"]
堆栈检测-->
d4["第二种<br>网络堆栈检测"]-->
d2["发包的包内容中<br>包含大量堆栈数据"]
end
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
graph
subgraph 数据检测 
z1(["数据检测<br>即内存地址数据检测"])-->
CE对数据查访问-->
z3["找到疑似检测代码"]
z1-->
CE对数据的替身查访问-->
z3-->
z2["OD内找来源<br>可向上层找"]-->
找到疑似检测call-->
观察平栈情况-->
z4["观察寄存器<br>在call执行前后<br>的变化情况"]-->
z5["观察变化后的寄存器<br>对后面的代码有没有作用<br>没有作用的可忽略"]-->
z6["把检测call nop掉或者hook<br>给有用的寄存器赋值<br>并平栈"]
end

主线程调用

  • call
  • 写内存
  • hook

Hook流程

1
2
3
4
5
6
graph
z1([Hook流程])-->
选一个大于5字节的位置-->
保存原来的代码-->
修改代码-->
改写c++代码

安装与卸载主线程勾子

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/image-20211022233212141.png

窗口回调函数

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/image-20211023000439359.png

1
HHOOK g_hhookGame;

注册消息

1
const DWORD MyMSGId=RegisterWindowMessageA("MyMSG");	//注册消息

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/image-20211022235349954.png

发送消息(向主线程发送)

键盘按下的消息

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/image-20211022235044301.png

1
#define MSG_KeyDown 100