首先确实是不是线程发包
首先来到3大发包函数分别下断。
(send sendto WSASend)
发现send会断下。
这个时候如何确定是否是线程发包呢。
调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0017FBA4 002EA8F7 gshx.002EA4B0 gshx.002EA8F2 0017FBA0
0017FBBC 002EAA42 gshx.002EA840 gshx.002EAA3D 0017FBB8
0017FC0C 002D4E57 gshx.002EAA10 gshx.002D4E52 0017FC08
0017FC4C 002D4472 ? gshx.002D4CD0 gshx.002D446D 0017FC48
0017FC9C 002C50F4 gshx.002D42E0 gshx.002C50EF 0017FC98
调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0017FBA4 002EA8F7 gshx.002EA4B0 gshx.002EA8F2 0017FBA0
0017FBBC 002EAA42 gshx.002EA840 gshx.002EAA3D 0017FBB8
0017FC0C 002D4E57 gshx.002EAA10 gshx.002D4E52 0017FC08
0017FC4C 002D4472 ? gshx.002D4CD0 gshx.002D446D 0017FC48
0017FC9C 002C50F4 gshx.002D42E0 gshx.002C50EF 0017FC98
发现任何动作的包都是来自于同样的位置。那么基本就可以确定不是主线程发包了。
下面来看下线程发包的模型
int main()
{
//创建发包的线程
std::thread th(&threadfuc);
chiyao();
}
//吃药函数
void chiyao()
{
//遍历物品的id
//组包
//memcpy(全局指针,);
}
//线程发包函数
void threadfuc()
{
while(1)
{
//从全局指针里面去读数据
//调用游戏发包
}
}
从上面的模型我们就知道了,肯定会在线程里面调动send的地方对全局指针进行访问。
在buff上面下硬件写入断点,来到这了。
66FA1F87 66:D4 1F AAM 1F
66FA1F8A FA CLI
66FA1F8B 66:CC INT3
66FA1F8D 1F POP DS ; 段寄存器更改
66FA1F8E FA CLI
66FA1F8F 66:C41F LES BX,DWORD PTR DS:[EDI] ; 段寄存器更改
66FA1F92 FA CLI
66FA1F93 66:BC 1FFA MOV SP,0FA1F
66FA1F97 66:B4 1F MOV AH,1F
66FA1F9A FA CLI
66FA1F9B 66:AC LODS BYTE PTR DS:[ESI]
66FA1F9D 1F POP DS ; 段寄存器更改
66FA1F9E FA CLI
66FA1F9F 66:A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
66FA1FA1 1F POP DS ; 段寄存器更改
66FA1FA2 FA CLI
66FA1FA3 66:8B448E E4 MOV AX,WORD PTR DS:[ESI+ECX*4-1C]
66FA1FA8 89448F E4 MOV DWORD PTR DS:[EDI+ECX*4-1C],EAX
66FA1FAC 8B448E E8 MOV EAX,DWORD PTR DS:[ESI+ECX*4-18]
66FA1FB0 89448F E8 MOV DWORD PTR DS:[EDI+ECX*4-18],EAX
66FA1FB4 8B448E EC MOV EAX,DWORD PTR DS:[ESI+ECX*4-14]
66FA1FB8 89448F EC MOV DWORD PTR DS:[EDI+ECX*4-14],EAX
66FA1FBC 8B448E F0 MOV EAX,DWORD PTR DS:[ESI+ECX*4-10] ; 在这里断下了
66FA1FC0 89448F F0 MOV DWORD PTR DS:[EDI+ECX*4-10],EAX
66FA1FC4 8B448E F4 MOV EAX,DWORD PTR DS:[ESI+ECX*4-C]
66FA1FC8 89448F F4 MOV DWORD PTR DS:[EDI+ECX*4-C],EAX
66FA1FCC 8B448E F8 MOV EAX,DWORD PTR DS:[ESI+ECX*4-8]
66FA1FD0 89448F F8 MOV DWORD PTR DS:[EDI+ECX*4-8],EAX
66FA1FD4 8B448E FC MOV EAX,DWORD PTR DS:[ESI+ECX*4-4]
66FA1FD8 89448F FC MOV DWORD PTR DS:[EDI+ECX*4-4],EAX
66FA1FDC 8D048D 00000000 LEA EAX,DWORD PTR DS:[ECX*4]
66FA1FE3 03F0 ADD ESI,EAX
66FA1FE5 03F8 ADD EDI,EAX
66FA1FE7 FF2495 F01FFA66 JMP DWORD PTR DS:[EDX*4+66FA1FF0]
66FA1FEE 8BFF MOV EDI,EDI
66FA1FF0 0020 ADD BYTE PTR DS:[EAX],AH
66FA1FF2 FA CLI
66FA1FF3 66:0820 OR BYTE PTR DS:[EAX],AH
66FA1FF6 FA CLI
66FA1FF7 66:14 20 ADC AL,20
66FA1FFA FA CLI
66FA1FFB 66:2820 SUB BYTE PTR DS:[EAX],AH
66FA1FFE FA CLI
66FA1FFF 66:8B45 08 MOV AX,WORD PTR SS:[EBP+8]
66FA2003 5E POP ESI
66FA2004 5F POP EDI
66FA2005 C9 LEAVE
上层就是明文包拷贝的位置了。
===============================================
明文包拷贝的位置
002E9F7E CC INT3
002E9F7F CC INT3
002E9F80 55 PUSH EBP
002E9F81 8BEC MOV EBP,ESP
002E9F83 E8 B8EFFFFF CALL gshx.002E8F40
002E9F88 85C0 TEST EAX,EAX
002E9F8A 75 51 JNZ SHORT gshx.002E9FDD
002E9F8C 3986 34000800 CMP DWORD PTR DS:[ESI+80034],EAX
002E9F92 74 06 JE SHORT gshx.002E9F9A
002E9F94 33C0 XOR EAX,EAX
002E9F96 5D POP EBP
002E9F97 C2 0400 RETN 4
002E9F9A 8B56 08 MOV EDX,DWORD PTR DS:[ESI+8]
002E9F9D 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4]
002E9FA0 8D0411 LEA EAX,DWORD PTR DS:[ECX+EDX]
002E9FA3 3D 0F000400 CMP EAX,4000F
002E9FA8 73 07 JNB SHORT gshx.002E9FB1
002E9FAA B9 0F000400 MOV ECX,4000F
002E9FAF EB 05 JMP SHORT gshx.002E9FB6
002E9FB1 2D 0F000400 SUB EAX,4000F
002E9FB6 2BC8 SUB ECX,EAX
002E9FB8 3BCF CMP ECX,EDI
002E9FBA ^ 72 D8 JB SHORT gshx.002E9F94
002E9FBC 03D7 ADD EDX,EDI
002E9FBE 8D4430 0C LEA EAX,DWORD PTR DS:[EAX+ESI+C]
002E9FC2 8956 08 MOV DWORD PTR DS:[ESI+8],EDX
002E9FC5 85C0 TEST EAX,EAX
002E9FC7 ^ 74 CB JE SHORT gshx.002E9F94
002E9FC9 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
002E9FCC FF86 88000800 INC DWORD PTR DS:[ESI+80088]
002E9FD2 57 PUSH EDI
002E9FD3 52 PUSH EDX
002E9FD4 50 PUSH EAX
002E9FD5 E8 F8F40A00 CALL <JMP.&MSVCR100.memcpy> ; 明文包位置
002E9FDA 83C4 0C ADD ESP,0C
002E9FDD 8BC7 MOV EAX,EDI
002E9FDF 5D POP EBP
002E9FE0 C2 0400 RETN 4
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!