cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

cs2自动开枪算法

前期准备工具:

cs2 dump.exe(a2x/cs2-dumper: Counter-Strike: 2 Offset Dumper (github.com))

cheat engine 7.5

vs code

一、寻找m_iIDEntIndex(准星索引)

    既然要做自动开枪,那自然要找到准星瞄准的索引,通过变动不变动搜索准星状态

图片[1]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

可以看到偏移是0x1458,查找dump文件可知道这个偏移是m_iIDEntIndex

图片[2]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

复制可能的指针找他的基地址

图片[3]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

图片[4]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

然后找一下特征码方便游戏更新(这一步非必要,所以过程略),

图片[5]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

[[[48 8B 0D ?? ?? ?? ?? 0F B6 D8 4C 63 45 00+4]+0x168]+0x1458]

我们观察一下这个准星索引,发现瞄准不同的敌人时会变化,但是没法找出变化的规律,就没法与队友、鸡等无效对象区别,所以我们还得找到这个索引值之后拿来干嘛了

二、寻找解密算法

 我们对这准星索引的地址找访问,下个断点,可以看到此时准星索引赋值给了rax

图片[6]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

根据x64调用约定,这个rax里的准星索引应该作为一个返回值传出去了,我们走出这个call慢慢跟,发现走过这个call后我们的rax变动了

图片[7]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

应该是已经拿这准星索引去干什么事了,我们跟进这个call继续单步,发现这个call之后rax又变了

图片[8]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

我们吧这个RAX的值加上dump文件里的血量偏移(h_health),可以正确的得到指向敌人的血量,所以此时的rax是C_BaseEntity

图片[9]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

图片[10]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

所以我们可以肯定这个call里有我们要找的解密算法,跟进看看

图片[11]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

继续跟进这个call

图片[12]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

我们发现这个call没有再调用其他的call,而且ret的rax就是C_BaseEntity。到这里我们就真正的追到了我们要的解密call。

我们把他copy下来分析,同时在函数头打上断点,记录寄存器的值

图片[13]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

sub rsp,28
cmp ecx,-01
jne client.dll+5C2850
mov rcx,[client.dll+1A4D800]
lea rdx,[rsp+30]
mov rax,[rcx]
call qword ptr [rax+000002E8]
mov ecx,[rax]
movsxd  rax,ecx
lea rcx,[client.dll+1A41FD0]
mov rcx,[rcx+rax*8]
test rcx,rcx
je client.dll+5C28B5
mov edx,[rcx+0000062C]
cmp edx,-01
je client.dll+5C28B5
mov r9,[client.dll+193C268]
test r9,r9
je client.dll+5C28B5
cmp edx,-02
je client.dll+5C28B5
mov ecx,edx
and ecx,00007FFF
mov eax,ecx
mov r8d,ecx
shr eax,09
mov rcx,[r9+rax*8]
test rcx,rcx
je client.dll+5C28B5
and r8d,000001FF
imul rax,r8,78
add rax,rcx
je client.dll+5C28B5
cmp [rax+10],edx
jne client.dll+5C28B5
mov rax,[rax]
add rsp,28
ret

整理一下,去除无关信息,主要看怎么赋值的

首先是
lea rcx,[client.dll+1A41FD0]
然后在对rcx进行操作,此时的rax=0
mov rcx,[rcx+rax*8]

图片[14]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

紧接着吧rcx+62c的值赋值给edx

mov edx,[rcx+0000062C]

对r9赋值

mov r9,[client.dll+193C268]
然后对ecx进行and运算
and ecx,00007FFF

然后吧ecx的值赋值给eax,r8,同时吧eax右移了9位

mov eax,ecx
mov r8d,ecx
shr eax,09

然后吧[r9+0]赋值给rcx

mov rcx,[r9+rax*8]
最后对r8d进行与运算,再吧r8乘以0x78在赋值给rax, 然后吧rax和rcx相加。
 
and r8d,000001FF
imul rax,r8,78
add rax,rcx

再读一下rax指向的值,就能的到了我们要的C_BaseEntity

图片[15]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

 

三、探寻寄存器数据

理清楚了逻辑,我们来看看寄存器具体是那些参数

首先and ecx,00007FFF,从上边分析的逻辑可以知道ecx是[[client.dll+1A41FD0]]+0x62c]

翻看dump文件,找到0x62c,可以知道这是m_hPawn的偏移

图片[16]-cs2自动开枪算法-游戏安全逆向社区论坛-技术社区-学技术网

知道这是一个m_hPwan,所以and ecx,00007FFF,可以表示为

m_hPwan & 0x7FFF

然后是第二条

shr eax,09

 

从边的逻辑分析,我们知道 eax=m_hPwan & 0x7FFF 所以这里表示为

(m_hPwan & 0x7FFF)>>9

然后是第三条

mov rcx,[r9+rax*8]

从上边可知rax的值为0 ,所以此处表达为

[[client.dll+193C268]+0]+((m_hPwan & 0x7FFF)>>9)*8)

 然后是第四条

and r8d,000001FF

从上边可知r8d=m_hPwan & 0x7FFF

所以这里表示为

(m_hPwan & 0x7FFF)&0x1FF

第五条

imul rax,r8,78

表示为

((m_hPwan & 0x7FFF)&0x1FF)*78

  第六条

add rax,rcx

如上rcx=[client.dll+193C268]+((m_hPwan & 0x7FFF)>>9)*8)

所以最后的表达式为

((m_hPwan & 0x7FFF)&0x1FF)*78+[client.dll+193C268]+((m_hPwan & 0x7FFF)>>9)*8)

 

 最后我通过比较寄存器的值,知道了m_hPwan & 0x7FFF就是我们找的的准星索引的值

所以最终C_BaseEntity应该为: (准星索引&0x1FF)*0x78+[[client.dll+193C268]+0]+((准星索引)>>9)*8)

最后,再给C_BaseEntity加上阵营偏移即可判断出正确的开枪对象了

 

 

 

 

 

 

请登录后发表评论