View mode: basic / threaded / horizontal-split · Log in · Help
April 11, 2012
Re: D Dll injection problem
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
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
"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
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
#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
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
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
I found a couple of errors in my code but couldn't get it to work.
May 14, 2012
Re: D Dll injection problem
Try to make C dll, which loads D dll, and inject the C dll :)
May 15, 2012
Re: D Dll injection problem
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 ?
1 2 3
Top | Discussion index | About this forum | D home