八达网

标题: 星际争霸存录像卡死原理和解决办法 [打印本页]

作者: tgpxyx    时间: 2009-8-7 11:54
标题: 星际争霸存录像卡死原理和解决办法
现在有星际作弊外挂为了作弊现象不给看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
作者: GSF_QQ    时间: 2009-8-7 11:54
好牛X啊同志
作者: tgpxyx    时间: 2009-8-7 11:56
转自前VCHELP 论坛 冷星客 朋友
作者: Springsun    时间: 2009-8-7 11:57
可以贴出来么,我没有ID,下载不了。
如果这个是广告贴,就当我前面没说。
作者: [JXSA].Zerglin    时间: 2009-8-7 11:57
看不懂啊。
作者: TM.MaRine.Z    时间: 2009-8-7 11:59
1.14以后修复了。
作者: tgpxyx    时间: 2009-8-7 12:02
我冷老大还是很牛逼的  做游戏开发  外号PKLANG
作者: artofsexy    时间: 2009-8-7 13:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 嗯哪    时间: 2009-8-7 13:35
SB520更新到1.74了?
我还在用1.6呢,赶紧换
作者: new111    时间: 2009-8-7 13:39
这么麻烦啊  还是然他卡死算了
作者: Aphrodite    时间: 2009-8-7 13:58
1.16???
作者: 黑晶晶    时间: 2009-8-7 15:24
还是不会,我看不懂
作者: FS_AnewTry    时间: 2009-8-7 16:32
这个。。。。
能简单说下怎么弄,然后别人无法卡死你或者存死你吗?
作者: tgpxyx    时间: 2009-8-7 16:55
居然加分了 饿
作者: nomm    时间: 2009-8-7 17:09
。。。那个显apm的读数 我一直按1 2 自己往上加 加到无穷大
作者: 毛片小王子    时间: 2009-8-7 18:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: 毛片小王子    时间: 2009-8-7 18:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 毛片小王子    时间: 2009-8-7 20:34
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 八达网 (https://www.8-da.com/) Powered by Discuz! X2.5