- UID
- 26146
- 帖子
- 8953
- 积分
- 23857
- 阅读权限
- 80
- 注册时间
- 2006-8-9
- 最后登录
- 2015-6-19
- 在线时间
- 6030 小时
|
现在有星际作弊外挂为了作弊现象不给看rep录像,而采用了一种垃圾数据包使存录像时会卡死住 ,只能用任务管理器终止进程,不知道切换的人还以为是电脑死机了呢(星际是全屏),这个功能真是太恶心了!当然,还有个更恶心的就是游戏中对方让你星际直接卡死,原理也是差不多,直接发个聊天数据里包含为0x0C的字节就会使星际卡死,解决办法就是hook到接收聊天信息的地方过虑到这个字节就行了.
现在我们来分析一下存rep卡死的原理(以下以1.08B星际版本为例)
通过跟踪分析知道存rep的函数地址
.text:0047BED4 inc esi
.text:0047BED5 mov ebx, [esp+1Ch+var_C]
.text:0047BED9 xor edi, edi
.text:0047BEDB and ebx, 0FFh
.text:0047BEE1 jle short loc_47BEF5
.text:0047BEE3
.text:0047BEE3 loc_47BEE3: ; CODE XREF: sub_47BE90+63j
.text:0047BEE3 inc esi
.text:0047BEE4 mov ecx, esi
.text:0047BEE6 call sub_474D60
.text:0047BEEB lea edi, [edi+eax+1]
.text:0047BEEF add esi, eax
.text:0047BEF1 cmp edi, ebx
.text:0047BEF3 jl short loc_47BEE3
.text:0047BEF5
.text:0047BEF5 loc_47BEF5: ; CODE XREF: sub_47BE90+51j
.text:0047BEF5 mov edx, [ebp+0Ch]
.text:0047BEF8 mov ecx, [ebp+8]
.text:0047BEFB add edx, ecx
.text:0047BEFD cmp esi, edx
.text:0047BEFF jb short loc_47BECA
.text:0047BF01 mov edi, [esp+1Ch+var_8]
.text:0047BF05
从汇编代码里在 0047BEE6 call sub_474D60 返回值里如果是-1
那么会陷入死循环,星际就出现卡死现象了.
解决办法我们可以在0047BEE6 里改成跳到我们修改的地方,不给它返回-1就行了
具体代码如下
DWORD offsetAntiSaveRep = 0x0047BEE6 //要修改的地方
__fastcall signed int MyChangeAntiSaveRep(DWORD a)
{
DWORD ret;
__asm
{
mov ecx,a //原函数的参数
mov eax,dwSaveAntiSaveRep; //保存原函数地址
add eax,5 //call 后面要加5个字节
call eax //调用原函数
mov ret,eax //保存返回值
}
if( ret==-1 ) //如果是是-1 就给它为0
ret=0;
return ret;
}
//修改
void ChangeAntiSaveRep()
{
DWORD dwNew***, dwOld***;
dwNew*** = PAGE_READWRITE;
VirtualProtect((LPVOID)offsetAntiSaveRep, 6, dwNew***, &dwOld***);
__asm
{
pushad
mov eax,[offsetAntiSaveRep]
mov edx,offset MyChangeAntiSaveRep
sub edx,eax
sub edx,5 //计算出MyChangeAntiSaveRep的偏移地址
mov ebx,[eax+1]
add ebx,eax
mov dwSaveAntiSaveRep,ebx //先保存原函数的偏移地址
mov [eax+1],edx //然后把原地址改成我们函数的地址 就变成call MyChangeAntiSaveRep
popad
}
VirtualProtect((LPVOID)offsetAntiSaveRep, 6, dwOld***, &dwNew***);
}
下载地址
http://bbs.pediy.com/showthread.php?t=94553 |
-
1
查看全部评分
-
|