能力值:
( LV7,RANK:110 )
|
-
-
26 楼
用不着VM这么高级,我们可以模拟它的反外挂客户端,直接让服务器于我的外挂模拟的反外挂客户端通讯,把真的反外挂客户端晾在一边,不就可以了么?
如果得到回复包的格式的话,直接在网卡处拦截网络数据包,修改之后再发给服务器,那你的客户端检测不就作废啦?从源码上看,发送给服务器的消息并没有加密,导致我可以发动用外挂发起中间人攻击,去欺骗你的外挂检测系统!这样当你的客户端检测到外挂,并且发消息给服务器的时候,我就可以拦截你的消息,然后我发一个消息欺骗服务器,
换句话说,你的数据结构是没有加密的,那我的外挂可以在客户端处模仿你的反外挂客户端,这样的话,你的服务器发给我,并且要你的反外挂客户端执行的代码,不就作废了么?
|
能力值:
( LV7,RANK:110 )
|
-
-
27 楼
NP的保护有驱动成分在那里的,我前段时间无聊,简单的看了一下NP的保护,奶奶的,居然在驱动下注册了回调函数,和DPC,以及定时器函数,并且检查了加载进入NP保护的进程的模块程序,更加无语的是在32位的系统中NP保护启动时,会拒绝所有的驱动的加载,还有一点我比较郁闷的是,NP安装进入系统之后,不知道修改了什么地方,居然使得VS无法启动调试功能,我去,这个保护系统连VS的IDE都给我废了,我真无语,不仅如此,NP启动之后,OD也无法启动它的调试功能,我晕,NP不仅反外挂,就连制造外挂用的调试器都给我废了,也真是无语了
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
支持楼主!!!!!!!!!!1
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
他的驱动保护是可以停的,要不怎么分析NP是怎么算包的。
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
唉,这个怎么是乱搞的代码,今天是我心情好,发点GAMEMON的代码出来给你看看,识货的人,用这个研究下就可以回包了。还有一点需要更正下,NP对INCA来说,不是一个反外挂系统,这个系统的设计目标人家写的很清楚=> "NO1 Global Game Security Solution "。
|
能力值:
( LV5,RANK:70 )
|
-
-
32 楼
兄台你理解错我的意思啦
我不是说你发的是乱搞的代码,我的意思是在不理解np的情况下,不知道有cs模块这个东西,想搞定np,才是乱搞啊。另外在游戏的封包处理函数中找到cs的处理点也不是个容易的事情,尤其是被加vm的时候。
|
能力值:
( LV4,RANK:40 )
|
-
-
33 楼
每个看官的水准不一样,有的觉得太浅,有得觉得太简单,有的还是看不懂,觉得太难的也大有人在。
|
能力值:
( LV7,RANK:110 )
|
-
-
34 楼
我比较郁闷的是,我停了很久都没有停掉驱动保护
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
哥们,研究下GAMEMON.DES的实现就可以的.类似如下的功能代码.
bool SetDriverDisable()
{
__try
{
__try
{
#if 0
DWORD SetDriverDisable = 0x004242F0;
DWORD FunctionA = *(DWORD*)0x0053A52C;
DWORD FunctionB = *(DWORD*)0x0053D300;
DWORD nDataA = 0;
DWORD nDataB = 0;
DWORD nDataC = 0;
DWORD nDataD = 0x0052C610;
bool bResult = false;
__asm
{
pushf
pusha
call FunctionA
mov nDataA,eax
mov ebx,nDataD
mov ebx,[ebx]
sub ebx,eax
mov eax,nDataD
mov [eax],ebx
push 0x04
lea eax,nDataB
push eax
push 0x04
lea eax,nDataA
push eax
push 0x84020024
lea eax,nDataC
push eax
push 0
push 0
push 0
mov eax,0x0052C60C
mov eax,[eax]
push eax
call FunctionB
test eax,eax
jnz _out
mov eax,nDataB
mov ebx,nDataD
mov ebx,[ebx]
sub ebx,eax
mov eax,nDataD
mov [eax],ebx
mov al,1
mov bResult,al
_out:
popa
popf
}
#else
DWORD SetDriverDisable = 0x00424450;
bool bResult = false;
__asm
{
pushf
pusha
call SetDriverDisable
mov bResult,al
popa
popf
}
#endif
return bResult;
}
__finally
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
return false;
}
bool SetDriverEnable()
{
__try
{
__try
{
#if 1
DWORD SetDriverEnable = 0x004242F0;
DWORD FunctionA = *(DWORD*)0x0053A52C;
DWORD FunctionB = *(DWORD*)0x0053D300;
DWORD FunctionC = *(DWORD*)0x00503384;
DWORD FunctionD = *(DWORD*)0x00503380;
DWORD nDataA = 0;
DWORD nDataB = 0;
DWORD nDataC = 0;
DWORD nDataD = 0x0052C610;
bool bResult = false;
__asm
{
pushf
pusha
push 0x0053D5CC
call FunctionC
call FunctionA
mov nDataA,eax
mov ebx,nDataD
mov ebx,[ebx]
add ebx,eax
mov eax,nDataD
mov [eax],ebx
push 0x04
lea eax,nDataB
push eax
push 0x04
lea eax,nDataA
push eax
push 0x84020030
lea eax,nDataC
push eax
push 0
push 0
push 0
mov eax,0x0052C60C
mov eax,[eax]
push eax
call FunctionB
test eax,eax
jnz _out
mov eax,nDataB
mov ebx,nDataD
mov ebx,[ebx]
add ebx,eax
mov eax,nDataD
mov [eax],ebx
mov al,1
mov bResult,al
_out:
push 0x0053D5CC
call FunctionD
popa
popf
}
#else
DWORD SetDriverEnable = 0x004242F0;
bool bResult = false;
__asm
{
pushf
pusha
call SetDriverEnable
mov bResult,al
popa
popf
}
#endif
return bResult;
}
__finally
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
return false;
}
void RestoreKernelPatch()
{
__try
{
__try
{
DWORD RestoreKernelPatch = 0x0048A730;
DWORD nFunctionA = 0x004297D0;
__asm
{
pushf
pusha
call RestoreKernelPatch
call nFunctionA
popa
popf
}
//char * pFlag = (char*)0x0053D2FD;
//*pFlag = 0;
}
__finally
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
甚至还可以要求NP帮你隐藏和保护进程
bool DoHideProcess(DWORD nPID)
{
__try
{
__try
{
DWORD FunctionA = *(DWORD*)0x0053A52C;
DWORD FunctionB = *(DWORD*)0x0053D300;
DWORD FunctionC = *(DWORD*)0x00503384;
DWORD FunctionD = *(DWORD*)0x00503380;
DWORD nDataA = 0;
DWORD nDataB = 0;
DWORD nDataC = 0;
DWORD nDataE = (*(DWORD*)0x0052C610) * nPID * 0x01FF;
DWORD * nDataD = (DWORD*)0x0052C610;
*nDataD = nDataE;
bool bResult = false;
__asm
{
pushf
pusha
//push 0x0053D5CC
//call FunctionC
push 0x04
lea eax,nDataB
push eax
push 0x04
lea eax,nPID
push eax
push 0x84020000
lea eax,nDataC
push eax
push 0
push 0
push 0
mov eax,0x0052C60C
mov eax,[eax]
push eax
call FunctionB
test eax,eax
jnz _out
mov al,1
mov bResult,al
_out:
//push 0x0053D5CC
//call FunctionD
popa
popf
}
return bResult;
}
__finally
{
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
return false;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
虽然看不懂,但是觉得挺厉害的样子
|
能力值:
( LV7,RANK:110 )
|
-
-
37 楼
这个代码不是很完善的,首先,现在的都是64位的系统但是你给的值都是32位的,这个能正确的找到内核地址么?
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
这个不是内核驱动的代码,是和驱动通讯的GAMEMON的代码,无所谓64位的问题.64位下,他这个驱动用处还没这么大,但是有另一个64位的GAMEMON需要搞定,所以你只需要在32位系统中把GAMEMON分析清楚就OK了.对一般的需求来讲,能搞清楚GAMEMON内部的代码结构及运行时状态,比如检测线程的数量,分别的作用,搞清楚这些,足够你玩了,想要去NP回包这些都是小菜.
|
能力值:
( LV7,RANK:110 )
|
-
-
39 楼
另外,我想知道,在NP启动时如何去掉NP对IDE的限制?
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
帖子很好 大部分时间我都是知道 但不知道别人的代码到底是如何的 不管如何 参考价值是值得肯定的, 希望继续努力....
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
这个我也没有太好的方法,一般分析清楚后,就直接取消NP的启动,然后自己算包了.因为NP的话,其实做的活非常细的,光是对一个CE的判断,大概就有10种以上的方法,所以,过IDE这类的进程扫描,其实有2个思路,一是关掉他的进程扫描的线程,一个是改特征码了.反正韩国人做事的态度我非常佩服,的确在质量上比国内的质量好太多.
|
能力值:
( LV7,RANK:110 )
|
-
-
42 楼
那就郁闷了,没有IDE的话,就不容易编写外挂啦!不过,我觉得它应该是替换了系统调试器的某个关键部位
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
好文要顶 我觉得 对于 这些 细节 楼主讲得还是不错的。 源码或许有人有 但是那又如何呢。。。。问题是有源码有的人 也未必能够理清思路。
|
能力值:
( LV2,RANK:10 )
|
-
-
44 楼
另外 @xiaofuy 求教 此 文中分析的 是什么游戏的源码?希望 知道的大神指点一下 ,不求分享源码,只求说一下名字。 我自己去找。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
45 楼
第3弹呢?期望中
|