GPK保护下LG注入龙之谷分析
本帖最后由 iso9001 于 2010-8-28 14:32 编辑LG纯R3注入龙之谷
注入的最大特点是, DragonNest.exe 找不到注入的模块
因为LG是使用自己的方法动态加载加载(非系统加载) InLG.dll 的资源dll INDNLG
如果龙之谷要扫描自身进程中的非法模块是难扫描到LG的注dll的
LG注入DLL的具体流程是
1 首先在登陆器 Hook CreateProcessW
7C802336 >/$- E9 D9F72084 jmp 00A11B14 ;Hook CreateProcessW
7C80233B|.6A 00 push 0
7C80233D|.FF75 2C push
7C802340|.FF75 28 push
7C802343|.FF75 24 push
7C802346|.FF75 20 push
7C802349|.FF75 1C push
修复完被Hook的头五字节后,以挂起模式 CREATE_SUSPENDED 启动游戏 , 游戏启动后会暂停在那里
2读取INDNLG ,申请内存,写入游戏
图:InLG.dll的资源显示
写入到游戏后的内存
3初始化0x48的内存(主要获取API地址)
00A1188>50 push eax
00A1188>E8 F4FEFFFF call 00A11788 ; 读取自身资源 写入到目标
00A1189>8BF0 mov esi, eax
00A1189>85F6 test esi, esi
00A1189>75 0D jnz short 00A118A7
00A1189>53 push ebx
00A1189>E8 D8E70100 call 00A30078 ; jmp 到 kernel32.CloseHandle
00A118A>33C0 xor eax, eax
00A118A>E9 61020000 jmp 00A11B08
00A118A>6A 48 push 48
00A118A>57 push edi ; 获取地址,全部写入到 EDI
00A118A>E8 49E90100 call 00A301F8 ; 初始化 0x48 大小的结构体
00A118A>8B55 FC mov edx, dword ptr ss: ; 获取这些函数地址,保存到一个结构体中
00A118B>8917 mov dword ptr ds:, edx
00A118B>8977 08 mov dword ptr ds:, esi ; 存放写入资源的首地址
00A118B>8B0D 3C4DA300 mov ecx, dword ptr ds:
00A118B>8B41 50 mov eax, dword ptr ds:
00A118C>8947 04 mov dword ptr ds:, eax ; 下面是获取一系列函数地址
00A118C>68 7411A300 push 0A31174 ; UNICODE "kernel32.dll"
00A118C>E8 5FE80100 call 00A3012C ; jmp 到 kernel32.GetModuleHandleW
00A118C>8BF0 mov esi, eax
00A118C>68 8E11A300 push 0A3118E ; ASCII "VirtualAllocEx"
00A118D>56 push esi
00A118D>E8 5EE80100 call 00A30138 ; jmp 到 kernel32.GetProcAddress
00A118D>8947 14 mov dword ptr ds:, eax
00A118D>68 9D11A300 push 0A3119D ; ASCII "VirtualFreeEx"
00A118E>56 push esi
00A118E>E8 50E80100 call 00A30138 ; jmp 到 kernel32.GetProcAddress
00A118E>8947 18 mov dword ptr ds:, eax
00A118E>68 AB11A300 push 0A311AB ; ASCII "RtlMoveMemory"
00A118F>56 push esi
4 写入 0x400 函数
0013D92C 0000023C|hProcess = 0000023C (窗口)
0013D930 001D0000|Address = 1D0000
0013D934 00A11578|Buffer = 00A11578
0013D938 00000400|BytesToWrite = 400 (1024.)
0013D93C 00000000\pBytesWritten = NULL
00A11578 55 push ebp
00A11579 8BEC mov ebp, esp
00A1157B 83C4 D0 add esp, -30
00A1157E 53 push ebx
00A1157F 56 push esi
00A11580 57 push edi
00A11581 8B75 08 mov esi, dword ptr ss:
00A11584 85F6 test esi, esi
00A11586 74 0C je short 00A11594
00A11588 837E 08 00 cmp dword ptr ds:, 0
00A1158C 74 06 je short 00A11594
00A1158E 837E 14 00 cmp dword ptr ds:, 0
00A11592 75 07 jnz short 00A1159B
00A11594 33C0 xor eax, eax
00A11596 E9 E1010000 jmp 00A1177C
00A1159B 8B56 08 mov edx, dword ptr ds:
00A1159E 8955 FC mov dword ptr ss:, edx
00A115A1 8B4D FC mov ecx, dword ptr ss:
00A115A4 8B41 3C mov eax, dword ptr ds:
00A115A7 0345 FC add eax, dword ptr ss:
00A115AA 8945 F8 mov dword ptr ss:, eax
00A115AD 8B55 F8 mov edx, dword ptr ss:
00A115B0 8B5A 50 mov ebx, dword ptr ds:
5 再写入 0x200函数
0013D92C 0000023C|hProcess = 0000023C (窗口)
0013D930 001E0000|Address = 1E0000
0013D934 00A11528|Buffer = 00A11528
0013D938 00000200|BytesToWrite = 200 (512.)
00A11528 55 push ebp ; +0x200函数
00A11529 8BEC mov ebp, esp
00A1152B 53 push ebx
00A1152C 8B5D 08 mov ebx, dword ptr ss:
00A1152F 85DB test ebx, ebx
00A11531 74 2A je short 00A1155D
00A11533 837B 08 00 cmp dword ptr ds:, 0
00A11537 74 24 je short 00A1155D
00A11539 53 push ebx
00A1153A FF53 0C call dword ptr ds:
00A1153D 68 00400000 push 4000
00A11542 6A 00 push 0
00A11544 8B43 08 mov eax, dword ptr ds:
00A11547 50 push eax
00A11548 6A FF push -1
00A1154A FF53 18 call dword ptr ds:
00A1154D 68 00400000 push 4000
00A11552 6A 00 push 0
00A11554 8B53 0C mov edx, dword ptr ds:
6 写入0x48 带有API地址的结构体,修改Context改变游戏执行流程,
00A11AF8 E8 25E70100 call 00A30222 ; SetThreadContext
00A11AFD 53 push ebx
00A11AFE E8 75E50100 call 00A30078 ;
00A11B03 B8 01000000 mov eax, 1
00A11A5F E8 30E80100 call 00A30294 ; 写入 0x48 结构体 信息(API地址)
00A11A64 C785 28FDFFFF 0>mov dword ptr ss:, 10001
00A11A6E 8D8D 28FDFFFF lea ecx, dword ptr ss:
00A11A74 51 push ecx
00A11A75 8B45 0C mov eax, dword ptr ss:
00A11A78 50 push eax
00A11A79 E8 DEE60100 call 00A3015C ; 获取Context
00A11A7E 6A 32 push 32
00A11A80 68 6415A100 push 0A11564 ; ASCII "h33"
00A11A85 8D95 F4FCFFFF lea edx, dword ptr ss:
00A11A8B 52 push edx
00A11A8C E8 5BE70100 call 00A301EC ; jmp 到 ntdll.RtlMoveMemory
00A11A91 8D8D F5FCFFFF lea ecx, dword ptr ss:
00A11A97 8B85 E0FDFFFF mov eax, dword ptr ss:
00A11A9D 8901 mov dword ptr ds:, eax
00A11A9F 8D95 FBFCFFFF lea edx, dword ptr ss:
00A11AA5 8B4D F4 mov ecx, dword ptr ss:
00A11AA8 890A mov dword ptr ds:, ecx ; API 结构0x48
00A11AAA 8D85 00FDFFFF lea eax, dword ptr ss:
00A11AB0 8B55 F8 mov edx, dword ptr ss: ; 0X200函数地址
00A11AB3 8910 mov dword ptr ds:, edx
00A11AB5 6A 40 push 40
00A11AB7 68 00100000 push 1000
14 >55 push ebp
15 >8BEC mov ebp, esp
17 >83C4 D0 add esp, -30
1A >53 push ebx
1B >56 push esi
1C >57 push edi
1D >8B75 08 mov esi, dword ptr ss:
20 >85F6 test esi, esi
22 >74 0C je short 0013D97C
24 >837E 08 00 cmp dword ptr ds:, 0
28 >74 06 je short 0013D97C
00A11ABC 6A 32 push 32
写入入口点函数代码,
$ ==>>68 0507817C push 7C810705 ; 返回地址
5 >60 pushad
6 >68 00001F00 push 1F0000
B >B8 00001E00 mov eax, 1E0000
10 >FFD0 call eax
12 >61 popad
13 >C3 retn ; push jmp
2A >837E 14 00 cmp dword ptr ds:, 0
2E >75 07 jnz short 0013D983
30 >33C0 xor eax, eax
登陆器在写入全部数据修改Context后
先 pushad保存现场
然后调用 call 0x1e0000 初始化自己的dll
最后popad还原
ret 交还游戏
如果要写挂注入GPK保护下的龙之谷,可以直接在Hook CreateProcessW 后注入 ,
当然隐藏性就没LG的好了
本帖最后由 iso9001 于 2010-8-28 14:34 编辑
排版不太好看,可以看word
有个问题就是,我用OD附加到目标程序后, ResumeThread 重新让程序跑进来后,窗口建立不起来,
但是线程是活动的,在入口处断点也没有反应,
我试图将入口处 push 7C810705 改成 int 3
但是程序还是跑不起来 .无法跟初始化函数
还望大牛小生指导12345 我只能看懂一点点! 看到这个就知道高人在现!看不懂啊! 我完全看不到... 过来学习学习! 看不懂 纯阅读=.=
等待高手.......... 看不懂,但先赞一个