什么是NP
NP 即 nProtect GameGuard 
(简称GameGuardGG,其驱动程序为GameMon.des)是由韩国INCA互联网(INCA Internet)开发的游戏反作弊的软件。随着网络游戏的兴起,愈来愈多人利用外挂从中作弊,这促使GameGuard等反作弊软件的诞生,GameGuard开发完成后,很快就被日本及韩国网络游戏商引入。随后开设“网络游戏用户通报中心”,能传送关于不正当或作弊工具之信息。

NP的主要功能

  nProtect GameGuard含有即时变换侦测规则、可置于游戏执行档前使用,利用动态加密的方式达到防止外挂的目的,有效防堵作弊程式(如加速器),以及侦测玩家电脑有没有使用插件等。nProtect GameGuard具有多种功能,例如:
  透过持续扫描任何事先有登入过的程式码、系统内部时间器运作等方式,侦测玩家电脑有没有使用插件;
  检测及阻挡恶意程式码;
  自动扫描工具;
  即时变换侦测;
  可停止鼠标及键盘的驱动程序及侧录程式;
  可阻挡玩家及双重核心中央处理器(CPU)之不正当的操作;
  占用甚少CPU,不会拖慢电脑及游戏;及
  监视玩家之操作环境,以及一举一动。

突破NP防线

要去掉NP的注入是很容易的事,但是去掉npggNT.des并不是说我们想对游戏怎么样都可以了,NP还挂钩了很多内核函数,所以很多关键系

统函数就算我们在用户层能用也对游戏没有什么效果。
   如果我们想在不破解NP前提下读写游戏内存该怎么办呢,我想办法至少有两个
一、用驱动
    在驱动下读写游戏内存是没问题,但是由于我不懂驱动,所以也没什么可说。
二、进入游戏进程
    在用户层,如果我们想在不破解NP的前提下读写游戏内存的话,大概就只能进入游戏进程了。因为很简单,我们的程序无法对游戏使用OpenProcess、ReadProcessMemoery及

WriteProcessMemory这些函数(就算是去掉了NP监视模块npggNT.des),而NP又不可能限制游戏自身使用这些函数,所以只要我们能够进入游戏进程就能够读写游戏的内存。怎么

进入游戏呢?下面介绍两种方法:

1,最简单的办法 ―全局消息钩子(WH_GETMESSAGE)
      看似很复杂的东西原来很简单就可以实现,大道至易啊。使用消息钩子进入游戏进程无疑是最简单的一种方法,具体编程大概象这样:一个消息钩子的DLL,里面包含一个消

息回调函数(什么都不用做),读写内存过程,跟主程序通讯过程或操作界面过程,当然在DLL_PROCESS_ATTACH要判断当前的进程是不是游戏的,是的话就做相应的处理;一个安

装全局消息钩子的主程序。大概这样就可以了。使用全局消息钩子的好处是简单易用,但是不足之处是要在游戏完全启动(NP当然也启动啦)后才能进入,如果想在NP启动前做一

些什么事的话是不可能的。
     另外也简单介绍一下防全局钩子的办法,Windows是通过调用LoadLibraryExW来向目标进程注入钩子DLL的,所以只要我们在钩子安装前挂钩了这个函数,全局钩子就干扰不了

了。

2,更麻烦的办法 ― 远程注入
       知道远程注入方法和原理的人可能会说“有没有搞错,OpenProcess、WriteProcessMemory这些必备函数都不能用,怎么注入?”,当然啦,NP启动后是不能干这些事情,所

以我们要在NP启动前完成。这样一来,时机就很重要了。
       游戏启动的流程大概是这样:游戏Main->GameGuard.des->GameMon.des(NP进程)。这里的做法是这样:游戏Main->GameGuard.des(暂停)->注入DLL->GameGuard.des(继

续)->GameMon.des。关键点就是让GameGuard.des暂停,有什么办法?我想到一个是全局消息钩子(还是少不了它啊)。要实现大概需要做下面的工作:一个全局消息钩子DLL,里面只

要一个消息回调函数(什么都不用做),DLL_PROCESS_ATTACH下进行当前进程判断找GameGuard.des,找到的话就向主程序SendMessage;主程序,负责安装钩子,接收钩子DLL发来的

消息,接收到消息就开始查找游戏进程,向游戏进程注入内存操作DLL,返回给SendMessage让GameGuard.des继续,卸载钩子(免得它继续钩来钩去);内存操作DLL,负责对游戏

内存进行操作。
        具体编写如下(有省略):

GameHook.cpp//
BOOL IsGameGuard();
//
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
  return (CallNextHookEx(m_hHook,nCode,wParam,lParam));//什么都不需要做
}
///
BOOL WINAPI DllMain(HINSTANCE hInst,DWORD dwReason,LPVOID lp)
{
  switch(dwReason){
  case DLL_PROCESS_ATTACH:    
    if(IsGameGuard())//判断当前进程是不是GameGuard.des
       SendMessage(m_hwndRecv,WM_HOOK_IN_GAMEGUARD,NULL,NULL);//向主窗体发送消息,SendMessage是等待接受窗体处理完毕才返回的,
    break;                               //所以进程就暂停在这里,我们有足够的时间去做事情
  case DLL_PROCESS_DETACH:
    break;
  }
  return TRUE;
}
///
GAMEHOOKAPI BOOL SetGameHook(BOOL fInstall,HWND hwnd)
{
  
}
////
BOOL IsGameGuard()
{
       TCHAR  szFileName[256];
       GetModuleFileName(NULL,szFileName,256);
       if(strstr(szFileName,"GameGuard.des")!=NULL){//这样的判断严格来说是有问题的,但实际操作也够用了。当然也可以进行更严格的判断,不过麻烦点
          return TRUE;
       }
  return FALSE;
}
//Main
void OnGameGuard(WPARAM wParam,LPARAM lParam)//处理消息钩子DLL发来的消息就是上面SendMessage的那个
{  
  DWORD dwProcessId=FindGameProcess(m_strGameName);//开始查找游戏进程
  if(dwProcessId==0){
    MessageBox(m_hWnd,"没有找到游戏进程","查找游戏进程",MB_OK);
    return;
  }

if(!InjectDll(dwProcessId)){//查找到就开始注入
    MessageBox(m_hWnd,"向游戏进程注入失败",注入",MB_OK);
    return;
     }
}
/
DWORD FindGameProcess(LPCSTR szGameName)//负责查找游戏进程
{
  HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if(hSnapshot==INVALID_HANDLE_VALUE)
    return 0;
  PROCESSENTRY32 pe={sizeof(pe)};
  DWORD dwProcessID=0;
  for(BOOL fOK=Process32First(hSnapshot,&pe);fOK;fOK=Process32Next(hSnapshot,&pe)){
    if(lstrcmpi(szGameName,pe.szExeFile)==0){
      dwProcessID=pe.th32ProcessID;
      break;
    }
  }
  CloseHandle(hSnapshot);
  return dwProcessID;
}
/
BOOL InjectDll(DWORD dwProcessId)//负责注入,参考自Jeffrey Richter《windows核心编程》
{
  CString strText;
  char* szLibFileRemote=NULL;

HANDLE hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwProcessId);
  if(hProcess==NULL){
  //  SetRecord("Open game process failed!");               
    return FALSE;
  }
  int cch=lstrlen(szDll)+1;
  int cb=cch*sizeof(char);
  szLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
  if(szLibFileRemote==NULL){
  //  SetRecord("Alloc memory to game process failed!");
    CloseHandle(hProcess);
    return FALSE;
  }

if(!WriteProcessMemory(hProcess,(LPVOID)szLibFileRemote,(LPVOID)szDll,cb,NULL)){
  //  SetRecord("Write game process memory failed!");
    CloseHandle(hProcess);
    return FALSE;
  }

PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)
     GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryA");
  if(pfnThreadRtn==NULL){
  //  SetRecord("Alloc memory to game process failed!");
    CloseHandle(hProcess);
    return FALSE;
  }

HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn, szLibFileRemote,0,NULL);
   if(!hThread)
   {
    //    SetRecord("Create remote thread failed!");
    CloseHandle(hProcess);
   return FALSE;
   }      
   if(hThread!=NULL)
     CloseHandle(hThread);  
   CloseHandle(hProcess);
    return TRUE;

}     
///操作游戏内存的DLL就不贴了,大家根据不同的需要各显神通吧///

这种方法比一个全局消息钩子麻烦一点,但是优点是显然易见的:可以在NP启动前做事情,比如HOOK游戏函数或做游戏内存补丁。下面进入NP进程还要用到这种方法。

三、进入NP进程
    如果我们对NP有足够的了解,想对它内存补丁一下,来做一些事情,哪又怎样才可以进入NP的进程呢?嗯,我们知道游戏启动流程是这样的游戏Main->GameGuard.des-

>GameMon.des(NP进程),其中GameGuard.des跟GameMon.des进程是游戏Main通过调用函数CreateProcessA来创建的,上面我们说到有办法在NP进程(GameMon.des)启动前将我们的

DLL注入到游戏进程里,因此我们可以在GameMon.des启动前挂钩(HOOK)CreateProcessA,游戏创建NP进程时让NP暂停,但是游戏本来创建NP进程时就是让它先暂停的,这步我们

可以省了。下面是游戏启动NP(版本900)时传递的参数

ApplicationName:C:\惊天动地Cabal Online\GameGuard\GameMon.des
      CommandLine:\x01\x58\x6d\xae\x99\x55\x57\x5d\x49\xbe\xe4\xe1\x9b\x14\xe6\x88\x57\x68\x6d\x11\xb9\x36\x73\x38\x71\x1e\x88\x46\xa9\x97\xd4\x3a\x20\x90

\x62\xae\x15\xcd\x4b\xcd\x72\x82\xbd\x75\x0a\x54\xf0\xcc\x01\xad
      CreationFlags:4
      Directory:
      其中的CommandLine好长啊,它要传递的参数是:一个被保护进程的pid,两个Event的Handle,以及当前timeGetTime的毫秒数 (感谢JTR分享)。
      CreationFlags:4 查查winbase.h头文件,发现#define CREATE_SUSPENDED  0x00000004,所以NP进程创建时就是暂停的
    
      在我们替换的CreateProcessA中,先让游戏创建NP进程(由于游戏创建时NP进程本来就是暂停的,所以不用担心NP的问题),让游戏进程暂停(SendMessage就可以了),然后再

向NP进程注入DLL,最后让游戏进程继续。这样我们的DLL就进入NP进程了。实现起来大概是这样子

BOOL
WINAPI
MyCreateProcessA(//替换原来的CreateProcessA
    LPCSTR lpApplicationName,
    LPSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCSTR lpCurrentDirectory,
    LPSTARTUPINFOA lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
    )
{
  UnhookCreateProcessA();
  BOOL fRet=CreateProcessA(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,dwCreationFlags,
     lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);  
  RehookCreateProcessA();
        SendMessage(hwndRecv,//负责注入的窗体句柄
                   WM_HOOK_NP_CREATE,//自定义消息
                   (WPARAM)lpProcessInformation->dwProcessId,//把NP进程ID传给负责注入的主窗体
                   NULL);
  return fRet;
}

四、注意问题
    由于我们是在不破解NP的前提下对游戏内存进行操作,所以一不小心的话,很容易就死游戏。NP保护了游戏进程的代码段,所以在NP启动后就不要再对其代码段进行修改,要

补丁或HOOK系统函数这些都要在NP启动前完成。当然读写游戏的数据段是没问题的,因为游戏本身也不断进行这样的操作。

转载于:https://www.cnblogs.com/lixyvip/archive/2009/09/08/1562258.html

什么是游戏NP?如何在NP下读写游戏内存及如何进入NP进程相关推荐

  1. 如何在NP下读写游戏内存及如何进入NP进程

    标 题: [原创]如何在NP下读写游戏内存及如何进入NP进程 作 者: 堕落天才 时 间: 2007-01-04,13:28 链 接: http://bbs.pediy.com/showthread. ...

  2. 如何在xp下利用4G内存

    http://www.360doc.com/content/09/0317/20/88264_2838231.shtml

  3. 易语言编程-手把手教你解除游戏保护-让CE可搜索读写游戏进程内存数据

    1.  游戏进程为什么无法读写内存数据,CE工具为何不能搜索数据? 答案:因为被保护起来了 2.  游戏图标为什么不显示? 答案:因为被保护起来了 3.    如何解除游戏进程保护,从而CE工具 以及 ...

  4. 网易游戏2015年暑期实习生面试经历-游戏研发工程师

    首先,我还是先介绍一下网易游戏吧,引用别人的一段话 作者:王选易,出处: http://www.cnblogs.com/neverdie/ 欢迎转载 ,也请保留这段声明.如果你喜欢这篇文章,请点[推荐 ...

  5. 女朋友还是游戏?一起来分析下游戏的开发与销售情况!

    1.前言 你问我游戏重要还是女朋友重要? 你是不是傻?游戏没了可以再下! 要是女朋友没了-- 就没人会打扰你玩游戏了, 哈哈哈哈哈哈哈哈哈哈! 大部分男生都喜欢游戏,但对游戏的了解却不是很多,让我们来 ...

  6. np读取csv文件_pythonpandas读写csv数据

    官方介绍:pandas的官方手册:https://pandas.pydata.org/pandas-docs/stable/pandas官方读写数据文档:https://pandas.pydata.o ...

  7. 05、WITNESS-INDISTINGUISHABILITY and SZK ARGUMENTS for NP——Alone Rosen【witness的不可区分性以及对于NP问题的SZK论证】

    05.WITNESS-INDISTINGUISHABILITY and SZK ARGUMENTS for NP--Alone Rosen[witness的不可区分性以及对于NP问题的SZK论证] 这 ...

  8. linux卸载欧朋浏览器,如何在Centos下安装opera浏览器

    如何在Centos下安装opera浏览器 ,Opera目前是Linux平台上性能最优的浏览器,而且Opera中国团队本身即定位于Opera的研发中心,主要也是负责全球Linux平台项目的开发,这个版本 ...

  9. linux如何运行windows游戏,可运行在Linux下最好Windows软件和游戏

    下面这篇文章是为了告知我们的读者,在Wine软件的帮助下,流行的Windows原生软件和游戏,也可以安装并运行在基于Linux的操作系统上. 我们最近发现,许多人不知道,游戏如流行的魔兽世界,使命召唤 ...

最新文章

  1. [20180817]校内模拟赛
  2. PMCAFF | 用户体验中4个你不曾知晓的秘密
  3. 用eval在txt中存储list,dict,tuple
  4. 魅蓝android底层是什么,魅蓝E2的手机系统是什么
  5. 神清气爽,小妹妹,先给她示范了一遍红色警戒
  6. json数组传递到后台controller
  7. 预告 | 4月22日,CVPR 2021论文分享会详细介绍,学术新星云集!
  8. Windows 8 页面应用测试(2)
  9. 前端开发工程师应该关注什么?
  10. C++ 字符串 C#解析后 两个字符串无法连接
  11. kafka消息会不会丢失?为什么?看了这个你就清楚了
  12. 在线查服务器地址,工具|查询域名所在服务器的其他网站和IP
  13. svn如何退回软件版本_SVN版本控制工具的使用
  14. navicat的注册码
  15. 【图像分割】基于直觉模糊C均值聚类实现图像分割IFCMmatlab代码
  16. linux 中signal机制如何应用(一)
  17. revit常用机电工具,如何实现管线快速翻弯
  18. 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  19. python 泰勒展开式_python函数的Taylor级数sympy表达式
  20. 《变形金刚2》剧情细节大揭秘(100%剧透!)

热门文章

  1. epoll原理剖析以及reactor模型应用丨网络编程|网络IO|select|poll|socket|reactor多核实现丨c/c++linux服务器开发
  2. 嵌入式Linux下屏幕校准文件损坏问题
  3. php 中文朗读,能说会道 学生版 官方网站 | 功能最强大的语音朗读软件,支持全世界近30种语言...
  4. Spring Cloud构建微服务架构-Hystrix断路器
  5. 如何获取京东Cookie教程
  6. 《C程序员:从校园到职场》出版预告(5):一种情怀,几分感悟
  7. php分页无极类的讲解_一个完美php分页类,推荐给大家
  8. 专科非计算机专业用买笔记本吗,计算机专业要用什么样的笔记本, 我想知道
  9. ElementUI table标签展开行
  10. 如何关闭win10防火墙_[教程] 如何关闭win10自动更新?