比较简单,大牛飘过~~~~
通过耍玩游戏可以发现,当队友或自己 被敌人 打中后,此游戏(csgo)会给敌方人物或队友上个光的渲染(我就拿我已经修改好透视的了。。。),如下图:

那好,我们暂且姑且这是一个全局开关,bool类型,亮的时候为1,暗的时候为0,然后用CE搜索。。。
实际情况比较复杂,先要开个无人的房间,然后加入一个敌方单位,然后不断测试,不断测试,不断测试。。。。
在讲这个问题之前,我们首先要搞清楚一个游戏的类是需要生成对象的(实体),我们把自己的人物 我这里叫做人物基址
图内的其他单位(包括自己)的对象 叫做 实体对象。。。。
0x1 寻找人物基址
如何寻找?写过游戏的都知道,譬如一个关于人物信息的结构体,他一定有人物HP,MP,人物ID之类的。。如下:
struct MyEntity
{
int id;
int hp;
int mp;
char name[10];
};
思路是这样的,我们找到人物HP的地址,然后减去人物HP在结构体中的偏移,得到的首地址就是人物对象地址,通过人物对象地址,找到指向 人物对象地址的指针,这个指针就叫做人物基址。。当然也可能是多级指针,为了好理解,我用代码解释一下:
MyEntity *pBase = new MyEntity();
pBase->hp = 0;
上述代码 其中的pBase的值就是人物对象的首地址,通过人物对象首地址+hp的偏移处地址的内容设置为0,这样人物血量就会为0了。。。
那么so easy了,开个单人房,通过控制台命令hurtme+血量,改变自身的血量,然后最终可以找到血量偏移为0xfc,人物基址为client.dll+A6E444,然后我们可以修改我们自身的血量为0,然后就死了,这当然仅限于单机模式了。。。
0x2 寻找实体对象列表基址
通过人物基址找到人物对象地址,那么这个人物对象地址一定包含在图内实体对象列表地址中,你可以认为是数组,也可以是链表,实际上是链表。。用CE搜索谁指向了人物对象地址,找到4个常量指针

当然了,第一个是人物基址,我们看看第二个吧,也许就是实体对象列表基址呢?
(由于这些图不是一气呵成的,所以有写地址可能对不上号)
实际上是的是的。。看下面的图,此时游戏中就我一个对象:

我现在加入2个bot,看看看。。。

嗯,很明显啊,第一个就是我们的人物对象地址,300203D0,这个结构体的大小为16字节。。大概结构体描述下
struct EntityInfo
{
PVOID entityObj;
DWORD id;
EntityInfo *pPre;
EntityInfo *pNext;
};
下面就是遍历整个实体对象了。。。 一个双向链表是吧,结束的标志就是entity->pPre==entity->pNext(这个是因为根据只有一个对象的时候 观察出来的)
so,实体对象列表的基址为client.dll+4a5c9c4
0x3 寻找发光基址
到这里,又回到开头了,我这里已经搜到1了。。。用CE搜索谁访问了这个地址,可以得到如下代码段:
client.dll+39E8AA - 51 - push ecx
client.dll+39E8AB - E8 E0E1F5FF - call client.dll+2FCA90
client.dll+39E8B0 - 8B 87 60A80000 - mov eax,[edi+0000A860]
client.dll+39E8B6 - 8D B7 58A80000 - lea esi,[edi+0000A858]
client.dll+39E8BC - 80 88 B0030000 02 - or byte ptr [eax+000003B0],02
client.dll+39E8C3 - 8B 4E 08 - mov ecx,[esi+08]
client.dll+39E8C6 - 85 C9 - test ecx,ecx
client.dll+39E8C8 - 74 13 - je client.dll+39E8DD
client.dll+39E8CA - 56 - push esi
client.dll+39E8CB - 81 C1 A0030000 - add ecx,000003A0
client.dll+39E8D1 - E8 BA67E1FF - call client.dll+1B5090
client.dll+39E8D6 - C7 46 08 00000000 - mov [esi+08],00000000
client.dll+39E8DD - 8B B7 00A30000 - mov esi,[edi+0000A300]
client.dll+39E8E3 - E8 C8B1F0FF - call client.dll+2A9AB0
client.dll+39E8E8 - 8D 14 F5 00000000 - lea edx,[esi*8+00000000]
client.dll+39E8EF - 89 45 D0 - mov [ebp-30],eax
client.dll+39E8F2 - 2B D6 - sub edx,esi
client.dll+39E8F4 - 8B 08 - mov ecx,[eax]
client.dll+39E8F6 - 8B 45 F8 - mov eax,[ebp-08]
client.dll+39E8F9 - 88 44 D1 24 - mov [ecx+edx*8+24],al
client.dll+39E8FD - 8B 45 D0 - mov eax,[ebp-30]
client.dll+39E900 - 8B 00 - mov eax,[eax]
client.dll+39E902 - C6 44 D0 25 00 - mov byte ptr [eax+edx*8+25],00
client.dll+39E907 - 8B B7 00A30000 - mov esi,[edi+0000A300]
client.dll+39E90D - E8 9EB1F0FF - call client.dll+2A9AB0
client.dll+39E912 - 8D 0C F5 00000000 - lea ecx,[esi*8+00000000]
client.dll+39E919 - 2B CE - sub ecx,esi
client.dll+39E91B - 8B 00 - mov eax,[eax]
client.dll+39E91D - C7 44 C8 2C 00000000 - mov [eax+ecx*8+2C],00000000
client.dll+39E925 - 8B B7 00A30000 - mov esi,[edi+0000A300]
client.dll+39E92B - E8 80B1F0FF - call client.dll+2A9AB0
client.dll+39E930 - F3 0F10 45 F4 - movss xmm0,[ebp-0C]
client.dll+39E935 - 8D 0C F5 00000000 - lea ecx,[esi*8+00000000]
client.dll+39E93C - 2B CE - sub ecx,esi
client.dll+39E93E - 80 7D F8 00 - cmp byte ptr [ebp-08],00
client.dll+39E942 - 8B 00 - mov eax,[eax]
client.dll+39E944 - F3 0F11 44 C8 04 - movss [eax+ecx*8+04],xmm0
client.dll+39E94A - F3 0F10 45 F0 - movss xmm0,[ebp-10]
client.dll+39E94F - F3 0F11 44 C8 08 - movss [eax+ecx*8+08],xmm0
client.dll+39E955 - F3 0F10 45 EC - movss xmm0,[ebp-14]
client.dll+39E95A - F3 0F11 44 C8 0C - movss [eax+ecx*8+0C],xmm0
client.dll+39E960 - 74 0F - je client.dll+39E971
client.dll+39E962 - F3 0F10 45 E8 - movss xmm0,[ebp-18]
client.dll+39E967 - F3 0F59 05 2CE4261B - mulss xmm0,[client.dll+9FE42C]
client.dll+39E96F - EB 03 - jmp client.dll+39E974
client.dll+39E971 - 0F57 C0 - xorps xmm0,xmm0
client.dll+39E974 - 8B B7 00A30000 - mov esi,[edi+0000A300]
client.dll+39E97A - F3 0F11 45 E8 - movss [ebp-18],xmm0
client.dll+39E97F - E8 2CB1F0FF - call client.dll+2A9AB0
client.dll+39E984 - F3 0F10 45 E8 - movss xmm0,[ebp-18]
client.dll+39E989 - 8D 0C F5 00000000 - lea ecx,[esi*8+00000000]
client.dll+39E990 - 2B CE - sub ecx,esi
client.dll+39E992 - 8B 00 - mov eax,[eax]
client.dll+39E994 - F3 0F11 44 C8 10 - movss [eax+ecx*8+10],xmm0
client.dll+39E99A - 5F - pop edi
client.dll+39E99B - 5E - pop esi
client.dll+39E99C - 8B E5 - mov esp,ebp
client.dll+39E99E - 5D - pop ebp
client.dll+39E99F - C3 - ret
请观察上述蓝色表明出:
1.mov [ecx+edx*8+24],al 这条语句,若al为1,则开启人物发光,为0则关闭,sososososo
这里搜索ecx,可以找到指向ecx的指针,我这里就叫做发光基址吧。。
edx是一个人物的类似ID的玩意儿,向上看,可以知道 lea edx,[esi*8+00000000]
sub edx,esi
而esi是在这里赋值的mov esi,[edi+0000A300] ,这个edi其实就是实体对象地址,我们之前已经找到过了是吧
那很好搞了,也就是说 (发光对象地址+[实体对象地址 + 0xa300]*0x8-发光对象地址+[实体对象地址 + 0xa300])*0x8+0x24 处
化简下,就是发光对象地址+[实体对象地址 + 0xa300]*0x38+0x24
的内容修改为1,就好了喽??
但是实际上并没有,因为这个只是一个开关,但是颜色的画还是不会画出来的,颜色的ARGB分别是这4条代码:
movss [eax+ecx*8+04],xmm0
movss [eax+ecx*8+08],xmm0
movss [eax+ecx*8+0C],xmm0
movss [eax+ecx*8+10],xmm0
然后。。。xmm明显是float对吧,写上你喜欢的颜色就好了。。。
最后有个问题就是,上面修改后,只能看到敌方,虽说已经够了,其实要看到我方的话,修改这调语句:
mov byte ptr [eax+edx*8+25],00
强制为0就好了,虽然这里是0,但是可能其他敌方的代码改了这个数值。。。。。
0x4 检测机制
这个比较简单,国外的游戏不会很坑爹,找到kernel32的那条线程,暂停或结束都可以,然后就OK了。。。对了,顺便说下,被人举报的话,是不会立马封号的。。。有个类似审核期,大概再作弊被发现后的1-2个月内会把你处理。。为什么我这么清楚,因为我被ban id了。。。。哈哈哈哈哈哈
[注意]看雪招聘,专注安全领域的专业人才平台!