咳咳.这游戏虽然不是很火,但是也是一款老游戏了吧!我也算是个老玩家了。还是想分享一下自己逆这个游戏的经历
前言
首先这款游戏的引擎是GoldSrc 也就是说CS1.6的那些功能 透视 方框 之类的可以移植到这上面(我以前是这么想的)
这里我讲的都是游戏的检测.所以默认NGS保护默认是过掉的(CRC)
0x1 游戏引擎Hook的检测
如果你要写 透视 自瞄 显示武器名等这种肯定要挂钩引擎(其实也有其他办法,这里讲Hook引擎的办法 也是最直接的办法)
如果直接替换函数指针
Engine::g_pClient->HUD_PostRunCmd = HUD_PostRunCmd;
Engine::g_pClient->HUD_Redraw = HUD_Redraw;
Engine::g_pClient->HUD_Key_Event = HUD_Key_Event;
Engine::g_pClient->CL_CreateMove = CL_CreateMove;
Engine::g_pClient->HUD_GetStudioModelInterface = g_WallHack.HUD_GetStudioModelInterface;
替换后 进入游戏后 游戏直接闪退!
首先我想的是游戏循环访问判断,那好直接在函数指针 下访问断点.果不其然会有地址访问这里了.
我这个人比较懒 喜欢IDA 直接F5直观一点 :游戏判断 引擎地址判断是不是在client范围内
额呵呵 那简单了 直接返回上层Nop掉 或Jmp都可以
进游戏测试下 OK不掉了 完美
第二种Hook的办法当然是直接Hook函数头 但是并不是每个函数头部都是五个字节而且每个函数还要计算Hook几个字节非常麻烦
办法总会有的 可以把地址替换client代码段的空地址 jmp到自己函数这不就完美了 而且游戏检测也是在client代码段!
虽然有一点画蛇添足的敢接 但总归可以用
前面这两种方法过掉的前提是 你必须把NGS的CRC检测过掉 你TM都改游戏的代码段了 不检测你检测谁
那么第三种方法就是要规避NGS检测不能修改游戏的代码段且能Hook到游戏引擎
嘻嘻 前面第一种方法埋下的伏笔来了到调用检测CALL那里 eax!=0 就会跳走 那么想办法让他不等于0就好了
只要想办法让余数不等于0即可
//37486B0A - 69 0D FC7B9737 6D4EC641 - imul ecx, [37977BFC], 41C64E6D //取37977BFC内存地址的值 + 0x41C64E6D 结果放在ECX
//37486B14 - BE 64000000 - mov esi, 00000064
//37486B19 - 81 C1 39300000 - add ecx, 00003039 //值+=0x3039
//37486B1F - 8B C1 - mov eax, ecx
//37486B21 - 89 0D FC7B9737 - mov[37977BFC], ecx //值写到37977BFC
//37486B27 - C1 E8 10 - shr eax, 10 //值右移16位
//37486B2A - 25 FF7F0000 - and eax, 00007FFF // & 0x7FFF
//37486B2F - 99 - cdq
//37486B30 - F7 FE - idiv esi //eax / 0x64
//37486B32 - 8D 04 92 - lea eax, [edx + edx * 4] //余数+余数*4
//37486B35 - 85 C0 - test eax, eax
//37486B37 - 75 10 - jne 37486B49
所以直接把 0x37977BFC 的值一直锁定在0xFFFFFFFF就可以啦
第一次写这种文章 .有点不熟练 ,如果有你们的支持, 那就更好了.