Om een aantal functies binnen een 3rd party applicatie (32bit) aan te roepen ben ik genoodzaakt om native code in het process te injecteren. Ik heb hier geen ervaring mee en na een tijd zoeken en lezen op het internet is het mij gelukt om een DLL injector te maken. Om dit te testen heb ik een eenvoudige dll gemaakt die enkel een system beep uitvoert zodat ik weet of het inladen van de code gelukt is of niet.
Nu werk ik op mijn primaire machine met Windows 7 64bit. Het injecteren de code lijkt allemaal goed te gaan, ik krijg geen errors terug en er crasht ook niets alleen ik hoor geen system beep
Ik heb daarom een virtuele machine geïnstalleerd met XP 32bit en daarop werkt het injecteren/laden van de code wel gewoon goed. De DLL zelf is 32bit, mijn injector is geschreven in C# en het process waarin ik de test dll injecteer is ook een native 32bit applicatie. UAC staat uit op mijn Windows 7 systeem.
Wat doe ik fout? Ik heb op het internet gezocht maar er lijken alleen verschillen te zijn wanneer de dll en de applicatie waarin het geïnjecteerd moet worden 64bit applicaties zijn, maar dat is niet het geval.
Injector:
Test DLL:
Nu werk ik op mijn primaire machine met Windows 7 64bit. Het injecteren de code lijkt allemaal goed te gaan, ik krijg geen errors terug en er crasht ook niets alleen ik hoor geen system beep
Ik heb daarom een virtuele machine geïnstalleerd met XP 32bit en daarop werkt het injecteren/laden van de code wel gewoon goed. De DLL zelf is 32bit, mijn injector is geschreven in C# en het process waarin ik de test dll injecteer is ook een native 32bit applicatie. UAC staat uit op mijn Windows 7 systeem.
Wat doe ik fout? Ik heb op het internet gezocht maar er lijken alleen verschillen te zijn wanneer de dll en de applicatie waarin het geïnjecteerd moet worden 64bit applicaties zijn, maar dat is niet het geval.
Injector:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| hProcess = WinApi.OpenProcess( WinApi.PROCESS_VM_READ | WinApi.PROCESS_VM_WRITE | WinApi.PROCESS_VM_OPERATION | WinApi.PROCESS_QUERY_INFORMATION | WinApi.PROCESS_CREATE_THREAD, false, (uint) targetProcess.Id); if (hProcess == IntPtr.Zero || Marshal.GetLastWin32Error() != 0) throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to open process"); IntPtr llAddr = WinApi.GetProcAddress(WinApi.GetModuleHandle("kernel32.dll"), "LoadLibraryA"); if (llAddr == IntPtr.Zero || Marshal.GetLastWin32Error() != 0) throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to find address of LoadLibraryA function"); byte[] dllPathBytes = Encoding.ASCII.GetBytes(dllPath); IntPtr dllAddr = WinApi.VirtualAllocEx(hProcess, IntPtr.Zero, (uint) dllPathBytes.Length + 1, WinApi.MEM_RESERVE | WinApi.MEM_COMMIT, WinApi.PAGE_EXECUTE_READWRITE); if (dllAddr == IntPtr.Zero || Marshal.GetLastWin32Error() != 0) throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to allocate memory for the dll path"); int bytesWritten; WinApi.WriteProcessMemory(hProcess, dllAddr, dllPathBytes, (uint) dllPathBytes.Length + 1, out bytesWritten); if (dllPathBytes.Length + 1 != bytesWritten || Marshal.GetLastWin32Error() != 0) throw new Win32Exception(Marshal.GetLastWin32Error(), String.Format( "Unable to write data to allocated memory ({0} of {1} bytes written)", bytesWritten, dllPathBytes.Length)); uint tId; IntPtr ipThread = WinApi.CreateRemoteThread(hProcess, IntPtr.Zero, 0, llAddr, dllAddr, 0, out tId); if (ipThread == IntPtr.Zero || Marshal.GetLastWin32Error() != 0) throw new Win32Exception("Unable to load dll"); |
Test DLL:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL, "This is a message from your injected DLL!", "Dll Injection Test", MB_OK); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } |
[ Voor 30% gewijzigd door IceM op 03-08-2009 10:53 ]
...