前期准备工具:
cs2 dump.exe(a2x/cs2-dumper: Counter-Strike: 2 Offset Dumper (github.com))
cheat engine 7.5
vs code
一、寻找m_iIDEntIndex(准星索引)
既然要做自动开枪,那自然要找到准星瞄准的索引,通过变动不变动搜索准星状态
可以看到偏移是0x1458,查找dump文件可知道这个偏移是m_iIDEntIndex
复制可能的指针找他的基地址
然后找一下特征码方便游戏更新(这一步非必要,所以过程略),
[[[48 8B 0D ?? ?? ?? ?? 0F B6 D8 4C 63 45 00+4]+0x168]+0x1458]
我们观察一下这个准星索引,发现瞄准不同的敌人时会变化,但是没法找出变化的规律,就没法与队友、鸡等无效对象区别,所以我们还得找到这个索引值之后拿来干嘛了
二、寻找解密算法
我们对这准星索引的地址找访问,下个断点,可以看到此时准星索引赋值给了rax
根据x64调用约定,这个rax里的准星索引应该作为一个返回值传出去了,我们走出这个call慢慢跟,发现走过这个call后我们的rax变动了
应该是已经拿这准星索引去干什么事了,我们跟进这个call继续单步,发现这个call之后rax又变了
我们吧这个RAX的值加上dump文件里的血量偏移(h_health),可以正确的得到指向敌人的血量,所以此时的rax是C_BaseEntity
所以我们可以肯定这个call里有我们要找的解密算法,跟进看看
继续跟进这个call
我们发现这个call没有再调用其他的call,而且ret的rax就是C_BaseEntity。到这里我们就真正的追到了我们要的解密call。
我们把他copy下来分析,同时在函数头打上断点,记录寄存器的值
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
整理一下,去除无关信息,主要看怎么赋值的
紧接着吧rcx+62c的值赋值给edx
mov edx,[rcx+0000062C]
对r9赋值
mov r9,[client.dll+193C268]
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]
and r8d,000001FF
imul rax,r8,78
add rax,rcx
再读一下rax指向的值,就能的到了我们要的C_BaseEntity
三、探寻寄存器数据
理清楚了逻辑,我们来看看寄存器具体是那些参数
首先and ecx,00007FFF,从上边分析的逻辑可以知道ecx是[[client.dll+1A41FD0]]+0x62c]
翻看dump文件,找到0x62c,可以知道这是m_hPawn的偏移
知道这是一个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加上阵营偏移即可判断出正确的开枪对象了