1
+ //
2
+ // 04简单DLL注入游戏(注入器EXE部分)
3
+ // C/C++
4
+ //
5
+ // Created by luguanxing.
6
+ // Copyright @2016 LGX. All rights reserved.
7
+ //
8
+ #include < windows.h>
9
+ #include < string.h>
10
+ #include < string>
11
+ #include < iostream>
12
+ using namespace std ;
13
+
14
+ HWND hwnd = NULL ;
15
+ DWORD processid = NULL ;
16
+ HANDLE hprocess = NULL ;
17
+ PVOID procdlladdr = NULL ;
18
+
19
+ char dllname[25 ] = " cheatDLL" ;
20
+ char loadfunc[25 ] = " LoadLibraryA" ;
21
+ FARPROC loadfuncaddr = NULL ;
22
+ HANDLE hfile;
23
+
24
+ void getwindow () {
25
+ hwnd = ::FindWindow (NULL , " Super Mario XP" );
26
+ if (hwnd == NULL )
27
+ MessageBox (NULL , " 找不到游戏" , " 错误" , MB_OK);
28
+ GetWindowThreadProcessId (hwnd, &processid);
29
+ hprocess = OpenProcess (PROCESS_ALL_ACCESS,FALSE ,processid);
30
+ if (hprocess == NULL )
31
+ MessageBox (NULL , " 打开游戏失败" , " 错误" , MB_OK);
32
+ }
33
+
34
+
35
+ void inject () {
36
+ int size = strlen (dllname)+5 ;
37
+ procdlladdr = ::VirtualAllocEx (hprocess, NULL , size, MEM_COMMIT, PAGE_READWRITE); // 向目标申请空间,得到新空间地址
38
+ if (procdlladdr == NULL )
39
+ MessageBox (NULL , " 申请空间失败" , " 错误" , MB_OK);
40
+ DWORD writenum;
41
+ ::WriteProcessMemory (hprocess, procdlladdr, dllname, size, &writenum); // 向新空间写入要注入的DLL名称
42
+ loadfuncaddr = ::GetProcAddress (::GetModuleHandle (" kernel32.dll" ), loadfunc); // 获得LoadLibraryA的地址,在任何进程空间都一样
43
+ HANDLE hthread = ::CreateRemoteThread (hprocess, NULL , 0 , (LPTHREAD_START_ROUTINE)loadfuncaddr, (LPVOID)procdlladdr, 0 , NULL );
44
+ // 新建线程执行LoadLibrary参数是已在目标进程新空间写入的DLL名称,注意这个函数在64位下无法成功
45
+ ::WaitForSingleObject (hthread, INFINITE);
46
+ ::CloseHandle (hthread);
47
+ ::CloseHandle (hprocess);
48
+ }
49
+
50
+ int main () {
51
+ getwindow ();
52
+ inject ();
53
+ return 0 ;
54
+ }
0 commit comments