nProtect的保护原理如下
nProtect GameGuard在启动后使用SetWindowsHookEx(Inject DLL)方式进入所有的进程,并且在
OpenProcess()
ReadProcessMemory()
WriteProcessMemory()
PostMessage()
......等等
函数的头部加入JMP XXXXXX的代码跳入监测程序进行监测,如发现对游戏进行操作便拦截该操作。所以以上函数均无法正常工作。于是我们便针对它的原理来考虑对付的办法
方法一:
运行时将要使用的动态连接库(如:user32.dll kernel32.dll等)复制后改名,使用LoadLibrary和GetProcAddress载入函数。
要使用LoadLibrary和GetProcAddress载入函数,你需要有Visual Studio .NET,或者其中的Visual Basic和Visual C++,当然,你还要会使用他们,而且你还要知道nProtect GameGuard运行时到底调用了哪些动态连接库(这时候大家就八仙过海各显神通吧,想尽一切办法,如果你搞错了的话。。。。。后果自己负责咯。。。。。。。。。)
方法二:
既然硬的不行。。我们就来玩玩软的。嘿嘿
跳过nProtect
首先要清楚,nProtect通过连接其更新服务器获得当前最新文件内容,然后与本地文件作比较,如发现服务器端的文件与本地的不一致,则从更新服务器重新下载文件更新本地的nProtect文件。如果nProtect更新成功,而新版nProtect又拦截外挂,那么理所当然地nProtect每更新一次外挂就失效一次了。
通过分析游戏客户端用于解析该游戏各程序与其对应远端连接的IP列表文件,找出nProtect更新服务器的地址,并分析出nProtect官方更新服务器上的目录文件结构。
目录文件结构一般为: "更新服务器的名称//GameGuard"先自己构建一台模拟nProtect更新服务器,服务器上目录文件结构与官方的相同,更新下载文件内容使用旧版nProtect的内容(旧的客户端先别忙着删除。。。。。)
将真实nProtect更新服务器的地址,解析到你构建的模拟nProtect更新服务器的IP地址.
例: 127.0.0.1gg.muchina.com
写入到 system32//drivers//etc 的 host 文件中
这个 host 文件为系统TCP/IP协议配置IP解析服务, 没有后缀名,可用记事本或UE32打开编辑。
通常一个网游的顺利运行,是要连接服务器端多个IP的("nProtect服务","连接服务","数据服务","登陆服务","主服务"。。。。。。。)
而这一系列的服务都是由一个游戏主程序的启动运行来完成(如"命运"的"WYDLaucher.exe","奇"的"Main.exe",“冒险岛”的“MapleStory.exe”)由于host文件已被修改过,其中nProtect更新的连接IP被解析为指向自己模拟的更新服务器,而模拟服务器上的"更新文件"是旧版本的,所以nProtect不但不会被更新为新版,反而会版本倒退。并且往后都不会再更新。
另一个方法,则是直接修改游戏主程序代码内容,就是暴力修改了。
由于nProtect的功能是附在游戏主程序的开头独立执行的,所以,通过对游戏主程序进行破解处理后,将游戏主程序关于nProtect的执行部分的代码打上无效化标记,就很自然地跳过了nProtect了。
补充一下,构建模拟nProtect更新服务器可用本地机器完成(nProtect更新IP:127.0.0.1 有的安全软件会屏蔽掉此个本地自连接IP);用VM虚拟机完成(VM虚拟的多系统可各自设置不同IP);或者。。。。。另外组一台机器来做也可以。
下面附一个高手的破解nProtect的过程。给大家参考。
代码级破解。
首先看导入函数,用到了IoAttachDeviceToDeviceStack,似乎走的还是设备栈的老路。于是祭出WinDbg查看KeyboardClass0/1的设备栈,居然没有异常,那八成就是挂键盘中断了,导入的函数HalGetInterruptVector就是用来干这个的。列出所有中断向量(WinDbg没有类似SoftICE的idt命令,不爽的很),一眼就发现n个80开头的地址中有个f7开头的,哈,就是它。
再次重启系统,先列出原先的IDT,启动QQ后还原被修改的条目,然后尝试键盘记录,无效。再看IDT,又被改回去了!在这个中断向量的地址上设内存读写断点,只断到了读操作,却没有写操作。但明明就被改回去了啊。郁闷了一分钟之后,我开始看驱动的反汇编代码。从被断到的读操作开始跟踪,我发现读到的值被保存在全局变量里,而所有对这个变量的操作中,几乎都是赋值,只有一个cmp指令,比较保存的值和读取的值,如果不同就关中断,然后修改成QQ自己的中断服务地址(难怪断不到,关中断了嘛)。
到这里问题就算解决了,把紧随cmp之后的jz改为jnz,中断向量再也不会被改回去啦,键盘记录(不管是哪种)当然也有效了,金锁还是老样子。所谓的“国际先进技术”原来只是从DOS时代就被大玩特玩的中断挂钩,钩住键盘中断后直接把ScanCode传给应用程序。如果QQ能绕过Windows的中断映射机制,控制PIC或APIC重新映射键盘中断,那还有点看头。
至此破解完毕。
下面说一说一字节补丁的位置:npkcrypt.sys驱动模块(文件版本2005.6.22.1,大小20,386字节)加载基址偏移0x14b3,从0x74(jz)改为0x75(jnz),当然键盘中断向量也要还原。还有一种改法更简单,直接在QQ的键盘中断服务入口添加跳转指令,跳回到原服务地址。注意,这些都只是内存补丁,文件补丁比较麻烦,QQ似乎会在加载驱动前先对文件做校验。
补充: QQ密码输入框失去键盘焦点后,会还原中断向量。再次得到焦点时,又会修改IDT。这个修改不判断原中断向量,与前文说的jz指令无关。具体代码位置是基址偏移0x1e06(cli)至0x1e26(sti)这一段。用jmp指令跳过这段代码,IDT终于不会再被改了。实际破解时,还是在QQ的中断服务入口加jmp的办法简便易行。
| Vista+谷歌拼音输入法重现输入法 | 04-06 | |
| 45种可以拿到Webshell的技巧 | 04-02 | |
| 0起步接触黑客--实用价值相当高 | 04-02 | |
| 普通文件的欺骗手法 | 03-21 | |
| 黑客技术-ARP欺骗 | 03-19 | |
| 跨站Script攻击和防范 | 03-19 | |
| 超级兔子+WinRAR轻松破解收费加密 | 03-16 | |
| 浏览器执行exe文件的探讨 | 03-15 | |
| 菜鸟"搜"大量Web Shell的思路 | 03-14 | |
| 轻松录制在线网络电视的方法 | 03-14 | |
| 突破单位网管封杀QQ、MSN 端口的 | 03-14 | |
| 菜鸟找漏洞—渗透网站的“反思” | 02-06 | |