整理
约 1002 字
预计阅读 2 分钟
次阅读
整体流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
graph
subgraph 整体流程
找出发包函数-->
判断是否线程发包
-->
|否|找出加密封包
判断是否线程发包-->
|是|跳出线程发包-->
找出加密封包-->
|ctrl+F9向外层找|明文包-->
在明文包与加密封包之间找出加密call-->
分析加密call-->
|过滤心跳包|控件包
end
|
检测
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
|
主线程调用
Hook流程
1
2
3
4
5
6
|
graph
z1([Hook流程])-->
选一个大于5字节的位置-->
保存原来的代码-->
修改代码-->
改写c++代码
|
安装与卸载主线程勾子
窗口回调函数
注册消息
1
|
const DWORD MyMSGId=RegisterWindowMessageA("MyMSG"); //注册消息
|
发送消息(向主线程发送)
键盘按下的消息
1
|
#define MSG_KeyDown 100
|