为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

逆向NP之注入npggNT2

2017-12-01 7页 doc 26KB 28阅读

用户头像

is_079973

暂无简介

举报
逆向NP之注入npggNT2逆向NP之注入npggNT2 欢迎访问《黑蚂蚁网络中心》www.heimayi123.com 00C102E6 |8BE5 mov esp, ebp 00C102E8 |C2 0C00 retn 0C 00C10092 BC 9CFFE100 mov esp, 0E1FF9C ;还记得这里么,忘了请回头看00C10048处代码 00C10097 64:8F05 0000000>pop dword ptr fs:[0] ;SEH异常返回这里 00C1009E 59 pop ecx 00C1009F 8A4C24 02 ...
逆向NP之注入npggNT2
逆向NP之注入npggNT2 欢迎访问《黑蚂蚁网络中心》www.heimayi123.com 00C102E6 |8BE5 mov esp, ebp 00C102E8 |C2 0C00 retn 0C 00C10092 BC 9CFFE100 mov esp, 0E1FF9C ;还记得这里么,忘了请回头看00C10048处代码 00C10097 64:8F05 0000000>pop dword ptr fs:[0] ;SEH异常返回这里 00C1009E 59 pop ecx 00C1009F 8A4C24 02 mov cl, [esp+2] 00C100A3 5A pop edx 00C100A4 8AF1 mov dh, cl 00C100A6 59 pop ecx 00C100A7 5F pop edi 00C100A8 5E pop esi 00C100A9 5D pop ebp 00C100AA 5B pop ebx 00C100AB F6C6 40 test dh, 40 00C100AE 75 16 jnz short 00C100C6 00C100B0 F6C6 20 test dh, 20 00C100B3 74 07 je short 00C100BC 00C100BC F6C2 04 test dl, 4 00C100BF 5A pop edx 00C100C0 58 pop eax 00C100C1 58 pop eax 00C100C2 74 2E je short 00C100F2 00C100F2 6A 00 push 0 00C100F4 8BC4 mov eax, esp 00C100F6 51 push ecx 00C100F7 8BCC mov ecx, esp 00C100F9 56 push esi 00C100FA 6A FE push -2 00C100FC 52 push edx 00C100FD 68 00800000 push 8000 00C10102 50 push eax 00C10103 51 push ecx 00C10104 6A FF push -1 00C10106 52 push edx 00C10107 E8 AAFFFFFF call 00C100B6 00C1010C E8 04000000 call 00C10115 00C10111 03D0 add edx, eax 00C10113 FFE2 jmp edx ; ntdll.ZwFreeVirtualMemory ->这个函数执行完毕后,这段代 码就消失了 00C10115 8B15 043C927C mov edx, [7C923C04] 00C1011B C3 retn 数据: 00C10374 47 65 74 4D 6F 64 75 6C 65 48 61 6E 28 2C 80 7C GetModuleHan(,? 00C10384 58 2F 80 7C 14 2A 80 7C B0 2C 80 7C 03 00 00 00 X/? *??? ... 00C10394 01 00 00 01 09 00 02 00 44 3A 5C 47 61 6D 65 5C .. .. .D:\Game\ 00C103A4 BE AA CC EC B6 AF B5 D8 43 61 62 61 6C 20 4F 6E 惊天动地Cabal On 00C103B4 6C 69 6E 65 5C 47 61 6D 65 47 75 61 72 64 5C 6E line\GameGuard\n 00C103C4 70 67 67 4E 54 2E 64 65 73 pggNT.des ********************************************************************************************************** 2,精彩地方 看完上面代码后,不知你有没有失望的感觉。但我是有的,因为以前一直觉得神秘的 东西一下子变得不神秘,而且不是自己想象中那样, 真的有点失望。但是代码里面也有一些精彩的地方值得学习。 2.1,自定位 在远程进程里面我们不能象在本地进程那样方便地使用数据,当 我们不得已需要用到某数据时,就需要定位数据。数据COPY到远程进程后,怎么把它找出来 呢,上面可以看到npggNT.des路径地址在00C1039C,但是本地线程一般不知道有个00C1039C, 我们看看NP怎么把它找出来。00C10009 E8 00000000 call 00C1000E00C1000E 5B pop ebx ; ebx=00C100E ->自定 位函数入口地址00C1000F 64:8B51 30 mov edx, fs:[ecx+30] ; [ecx+30]=[30]00C10013 83C3 F2 add ebx, -0E ; EBX-E=00C10000 ->线程起始地址 我们知道 call指令执行完毕之后,当前esp保存了函数返回地址,call指令下一条指令执行的地址, 看看上面 call 00C1000E 00C1000E: pop ebx ;ebx->call指令下一条 指令的地址,那正好就是pop ebx的地址 哈哈,定位了一条指令的地址后,原理上 我们就可以把整一段代码定位了,比如上面通过 add ebx, -0E 就把ebx指向线程的起始 位置,这样通过ebx相对寻址的话,整段代码的位置都可以确定了。 上面还有一个自 定位的地方00C101A8 E8 00000000 call 00C101AD00C101AD 5F pop edi ; EDI=00C101AD ->函数入口地址 原理就跟上面分析的一 样了。 2.2找系统函数 略一看上面代码,不知道你会不会决定奇怪, GetModuleHandleA,LoadLibraryA,FreeLibrary,GetProcAddress这些kernel32.dll里面的 函数是怎么来的呢, 为什么00C101F2 FF57 E4 call [edi-1C] 就是GetModuleHandleA呢,我们先分析一下这段代码:00C101A8 E8 00000000 call 00C101AD00C101AD 5F pop edi ; EDI=00C101AD ->函数入口地址00C101AE 8B5424 0C mov edx, [esp+C] ; EDX=kernel32.dll HANDLE00C101B2 81C7 EF010000 add edi, 1EF ; EDI=00C1039C ->npggNT.des路径00C101B8 8D77 E4 lea esi, [edi-1C] ; ESI=00C1038000C101BB 6A 04 push 400C101BD 59 pop ecx ; ECX=400C101BE AD lods dword ptr [esi] ;从00C10380开始依次4个字节地取出某数据,循环四次00C101BF 8B28 mov ebp, [eax] ;根据数据寻址,将其指向的数据拿出来保 存到ebp 00C101C1 03EA add ebp, edx ; ebp+=edx,上面可以看到edx=kernel32.dll的句柄也就是 装00C101C3 896E FC mov [esi-4], ebp ; 载 基地址了,基地址+偏移(基地址+RVA),想到了么, 好了,我们先看看00C10380跟其 后面的数据是什么 dword ptr [00C10380]=7C802C28 dword ptr [00C10384]=7C802F58 dword ptr [00C10388]=7C802A14 dword ptr [00C1038C]=7C802CB0 然后找到这些数据所指向的地址再看看 [7C802C28]=B529 [7C802F58]=1D77 [7C802A14]=AA66 [7C802CB0]=AC28 然后把他们加上 kernel32.dll的基地址也就是handle(如果你忘了的话,请看00C10085行) 7C800000+B529->GetModuleHandleA 7C800000+1D77->LoadLibraryA 7C800000+AA66->FreeLibrary 7C800000+AC28->GetProcAddress 到这里我们终于 可以明白了,原来这些函数是这样来的。然后这些函数地址分别保存到00C10380、00C10384、 00C10388及00C1038C中 2.3自修改代码 不知你有没有留意,上面有一个小小的 自修改。00C10048 89A3 93000000 mov [ebx+93], esp ; SMC [ebx+93]=[00C10093]->保存SEH返回的ESP00C10092 BC 9CFFE100 mov esp, 0E1FF9C ; 在mov [ebx+93], esp 指令执行前00C10092处的代码是mov esp,0 执行后就变成上面这个样子了。这里是把ESP数值直接写入代码里,呵呵,可以省了 一个变量。 ************************************************************************************************************ 3,逆向代码(C) 根据上面的分析,我们已经可以理 解NP装入npggNT.des的主要方法了,下面是代码,忽略了各种判断跳转。而且由于是用C 来写,所以这里没有用到自定位,而是直接把数据的地址当参数传递给线程函数(更详细代 码请看附件InjectDll.cpp)。 //////////////////////////////////声明 API////////////////////////////////typedef HMODULE (WINAPI*GETMODULEHANDLEA)(LPCSTR lpModuleName); //GetModuleHandleAtypedef HMODULE (WINAPI*LOADLIBRARYA)(LPCSTR lpLibFileName); //LoadLibraryAtypedef BOOL (WINAPI*FREELIBRARY)(HMODULE hLibModule); //FreeLibrarytypedef FARPROC (WINAPI*GETPROCADDRESS)(HMODULE hModule,LPCSTR lpProcName); //GetProcAddress//////////////////////////////////定义数据结构 //////////////////////////////typedef struct _INJECTDATA{ BYTE bName[12]; //12 bytes="GetModuleHan"; GETMODULEHANDLEA _GetModuleHandleA; //4 bytes=hKernel32+0x2C28 ,>输出函数地址 表 LOADLIBRARYA _LoadLibraryA; //4 bytes=hKernel32+0x2F58 FREELIBRARY _FreeLibrary; //4 bytes=hKernel32+0x2A14 GETPROCADDRESS _GetProcAddress; //4 bytes=hKernel32+0x2CB0 BYTE someNumber[12]; //12 bytes TCHAR szLibraryPath[MAX_PATH]; //MAX_PATH }INJECTDATA,*PINJECTDATA;///////////////////////////////////定义远 程线程////////////////////////////////////////////static VOID WINAPI RemoteThread(LPVOID lpParam){ PINJECTDATA myData=(PINJECTDATA)lpParam; DWORD dwGetModuleHandleA, dwLoadLibraryA, dwFreeLibrary, dwGetProcAddress, hKernel32; dwGetModuleHandleA= (DWORD)myData->_GetModuleHandleA; dwLoadLibraryA = (DWORD)myData->_LoadLibraryA; dwFreeLibrary = (DWORD)myData->_FreeLibrary; dwGetProcAddress = (DWORD)myData->_GetProcAddress; hKernel32 = myData->hKernel32; ///////////////////////下面的汇编代码是根据输出函数地址表 找到相应的函数地址的RVA值//////////// _asm{ mov ebx,hKernel32 // <--- 这个是kernel32.dll的句柄,NP直接硬编码到这里 mov eax,dwGetModuleHandleA mov edx,[eax] // <--- 根据地址表找 出相应函数的RVA值 add edx,ebx // <--- 函数地址=模块加载 基地址(即handle)+相应RVA值 mov dwGetModuleHandleA,edx mov eax,dwLoadLibraryA mov edx,[eax] add edx,ebx mov dwLoadLibraryA,edx mov eax,dwFreeLibrary mov edx,[eax] add edx,ebx mov dwFreeLibrary,edx mov eax,dwGetProcAddress mov edx,[eax] add edx,ebx mov dwGetProcAddress,edx } /////////////////////////////////////////////////////////////////// myData->_GetModuleHandleA= (GETMODULEHANDLEA)dwGetModuleHandleA; myData->_LoadLibraryA = (LOADLIBRARYA) dwLoadLibraryA; myData->_FreeLibrary = (FREELIBRARY) dwFreeLibrary; myData->_GetProcAddress = (GETPROCADDRESS) dwGetProcAddress; myData->_LoadLibraryA(myData->szLibraryPath); // 加载DLL //////////////////////////////////////////////////// //你可以在这里添加其他代 码 //////////////////////////////////////////////////} ********************************************************************************************************** 4,总结 还有什么想说呢,你是不是想说“我hook了 LoadLibraryA后npggNT.des是不是就无法载入了?” ,我想理论上是。上面的代码没有对 LoadLibraryA进行任何的检校,但是我们别忘了还有一个NP主进程GameMon.des,这些事应 该是它来干的。从反npggNT.des注入来说,我想这里并没有比上一篇文章《反NP监视原理》 更有价值,只是我们可以学习一点东西,明白一点东西而已。 最后是废话,我只是一 个小菜鸟,跟我真正交流过的人都会非常认同这个观点,千万别来找我做挂,我只是对技术 感兴趣。反NP监视、读写游戏内存(NP保护下)这两个工具在两个月前就已经发布在我所 加入的所有技术Q群了,比两篇文章出现还早很多。我想既然文章都出来了,就更没必要拿 到看雪上面来浪费空间了,看看文章就知道怎么回事。实际上它们不会给你更大的惊喜,用 过的朋友都知道。
/
本文档为【逆向NP之注入npggNT2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索