April 11, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | On Wednesday, 11 April 2012 at 13:26:23 UTC, maarten van damme wrote:
> I went ahead and went back to as far as 2.045 and I still couldn't get a
> working dll. This would suggest something is wrong with my dll injection
> code but I've tested with a few other random dll's and that appears to
> work. according to my debugger the problem is an access violation while
> executing the main function of the D dll.
How do you initialize runtime and GC?
|
April 11, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | On Wednesday, 11 April 2012 at 13:26:23 UTC, maarten van damme wrote: > the code I use for injecting is > > /** > * injectDLL injects a dll in a given process using the CreateRemoteThread > function. > * > * arguments: > * HANDLE proc = A HANDLE to the process > * string dllName = A string containting the name of the dll > **/ > void injectDLL(HANDLE proc,string dllName) > { > //first we need to get a pointer to the loadlibrary function > LPVOID LoadLibAddy = > cast(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); > //The problem is that we need to pass an argument(string) but that string > is in our memory space > //so we have to allocate space to write our dllName to using > writeprocessmemory > LPVOID RemoteString = VirtualAllocEx(proc,null,dllName.length,MEM_COMMIT | > MEM_RESERVE,PAGE_READWRITE); > //write the dllName > WriteProcessMemory(proc,RemoteString,toStringz(dllName),dllName.length,null); > //create a thread in the remote process loading the dll > CreateRemoteThread(proc, null, 0, cast(LPTHREAD_START_ROUTINE)LoadLibAddy, > cast(LPVOID)RemoteString, 0, null); > } Try to run a simple C program like --- #include <windows.h> void main() { LoadLibraryA("mydll.dll"); } --- And check whether it fails and how. |
April 11, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin Attachments:
| "How do you initialize runtime and GC?" I don't... it should simply call loadlibraryA on the target dll. your C example works however. There must be something wrong with both my method and that injector. My example is used by a number of different sources and works for them. I don't know why it suddenly stopped working for me. it used to work in the past... |
April 12, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Attachments:
| I tried again with a few other random C dll's stolen around my system and they all work perfectly. it's only the D dll that gives me trouble. |
April 12, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | #include <windows.h> void main() { LPTHREAD_START_ROUTINE LoadLibAddy = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); CreateThread(NULL,0,LoadLibAddy,"mydll.dll",0,NULL); } ? |
April 12, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin Attachments:
| works and GetLastError() returns 0 in both cases.
Op 12 april 2012 16:13 schreef Kagamin <spam@here.lot> het volgende:
> #include <windows.h>
> void main()
> {
> LPTHREAD_START_ROUTINE LoadLibAddy = (LPTHREAD_START_ROUTINE)**
> GetProcAddress(**GetModuleHandle("kernel32.dll"**), "LoadLibraryA");
> CreateThread(NULL,0,**LoadLibAddy,"mydll.dll",0,**NULL);
> }
>
> ?
>
|
May 12, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | On Thursday, 12 April 2012 at 14:43:01 UTC, maarten van damme
wrote:
> works and GetLastError() returns 0 in both cases.
>
> Op 12 april 2012 16:13 schreef Kagamin <spam@here.lot> het volgende:
>
>> #include <windows.h>
>> void main()
>> {
>> LPTHREAD_START_ROUTINE LoadLibAddy = (LPTHREAD_START_ROUTINE)**
>> GetProcAddress(**GetModuleHandle("kernel32.dll"**), "LoadLibraryA");
>> CreateThread(NULL,0,**LoadLibAddy,"mydll.dll",0,**NULL);
>> }
>>
>> ?
Any news about the Problem with D ?
I really would like to use D for that.
|
May 13, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gyron Attachments:
| I found a couple of errors in my code but couldn't get it to work. |
May 14, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | Try to make C dll, which loads D dll, and inject the C dll :) |
May 15, 2012 Re: D Dll injection problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin | On Monday, 14 May 2012 at 09:53:55 UTC, Kagamin wrote: > Try to make C dll, which loads D dll, and inject the C dll :) I made a bootstrapper (a c DLL which loads the D Dll) and it works fine (the D entrypoint get called (a made a msgbox test) but then the Process freezes after it displayed the MsgBox. C Dll: #include <windows.h> bool _stdcall DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved) { if(_Reason == DLL_PROCESS_ATTACH) { MessageBox(NULL,L"test",L"test",MB_OK); LPTHREAD_START_ROUTINE LoadLibAddy = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA"); CreateThread(NULL,0,LoadLibAddy,"C:\\Users\\Moritz\\Documents\\Visual Studio 11\\Projects\\D_Projects\\D_BootStrapper\\Debug\\DAstral.dll",0,NULL); } return true; } D Dll: import std.c.windows.windows; import core.sys.windows.dll; __gshared HINSTANCE g_hInst; extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) { final switch (ulReason) { case DLL_PROCESS_ATTACH: g_hInst = hInstance; MessageBoxA(null,"test2","test2",MB_OK); dll_process_attach( hInstance, true ); break; case DLL_PROCESS_DETACH: dll_process_detach( hInstance, true ); break; case DLL_THREAD_ATTACH: MessageBoxA(null,"test","test",MB_OK); dll_thread_attach( true, true ); break; case DLL_THREAD_DETACH: dll_thread_detach( true, true ); break; } return true; } Any help ? |
Copyright © 1999-2021 by the D Language Foundation