April 11, 2012
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
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
"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
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
#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
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
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
I found a couple of errors in my code but couldn't get it to work.


May 14, 2012
Try to make C dll, which loads D dll, and inject the C dll :)
May 15, 2012
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 ?