Jump to page: 1 2 3
Thread overview
D Dll injection problem
Mar 27, 2012
Gyron
Mar 27, 2012
maarten van damme
Mar 27, 2012
Gyron
Mar 27, 2012
Trass3r
Mar 27, 2012
Gyron
Mar 27, 2012
Trass3r
Mar 27, 2012
Gyron
Mar 28, 2012
maarten van damme
Mar 28, 2012
Trass3r
Apr 11, 2012
maarten van damme
Apr 11, 2012
Kagamin
Apr 11, 2012
Kagamin
Apr 11, 2012
maarten van damme
Apr 12, 2012
maarten van damme
Apr 12, 2012
Kagamin
Apr 12, 2012
maarten van damme
May 12, 2012
Gyron
May 13, 2012
maarten van damme
May 14, 2012
Kagamin
May 15, 2012
Gyron
May 16, 2012
Kagamin
March 27, 2012
Hey there, I want to inject a dll which was created in D into a c Program.

Informations:
DMD vs. 2.058
IDE: MonoDevelop with Mono-D
System: Windows 7 64bit

Program Informations:
32-bit
written in c

The Injector is working for sure, so thats not the Problem.

the Source of the 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;
	    dll_process_attach( hInstance, true );
	    break;

	case DLL_PROCESS_DETACH:
	    dll_process_detach( hInstance, true );
	    break;

	case DLL_THREAD_ATTACH:
	    dll_thread_attach( true, true );
	    break;

	case DLL_THREAD_DETACH:
	    dll_thread_detach( true, true );
	    break;
    }
    return true;
}

It builds fine, but If I inject it, the program (where the dll is injected) says that the dll is not a valid image.
screenshot: http://imagr.eu/up/4f72240329a846_Unbenannt.png

Maybe it's because I have no def file.
But i dont know how to link it with Mono-D.

March 27, 2012
when I tried the previous dmd compiler (have yet to try the curent one on this problem) I got the same problems while trying to compile a dll and use it. I have no clue as to why this is happening. worked in 2.54 I thought


March 27, 2012
On Tuesday, 27 March 2012 at 20:45:52 UTC, maarten van damme wrote:
> when I tried the previous dmd compiler (have yet to try the curent one on
> this problem) I got the same problems while trying to compile a dll and use
> it. I have no clue as to why this is happening. worked in 2.54 I thought

I thought D would be a good alternative for c++, but as it seems I need to stay with c++ :/
Thats really bad, a minus point on my "Why choose D" list.
March 27, 2012
> Maybe it's because I have no def file.

Very possible.
Just pass it to dmd like the other files.
Or try the new -shared flag.
March 27, 2012
On Tuesday, 27 March 2012 at 21:12:59 UTC, Trass3r wrote:
>> Maybe it's because I have no def file.
>
> Very possible.
> Just pass it to dmd like the other files.
> Or try the new -shared flag.

I have tried both now (shared and def file linking), but know it's crashing my App, lol.

I inject it but it returns nothing and the App(where the dll is injected) is hanging( not responding).

Could you try it maybe?
I would like to know whether it's a Problem with D or with me.
March 27, 2012
> I inject it but it returns nothing and the App(where the dll is injected) is hanging( not responding).
>
> Could you try it maybe?
> I would like to know whether it's a Problem with D or with me.

Are dlls without injection working?
March 27, 2012
On Tuesday, 27 March 2012 at 21:46:23 UTC, Trass3r wrote:
>> I inject it but it returns nothing and the App(where the dll is injected) is hanging( not responding).
>>
>> Could you try it maybe?
>> I would like to know whether it's a Problem with D or with me.
>
> Are dlls without injection working?

I don't know, haven't tested it.
Will test it when I'm back home, but I think they work( not sure).
March 28, 2012
I wrote my own injector and this makes the target exe call loadlibrary.
this works on every dll I try to inject apart from dll's written in D
(starting with dmd version 2,054 or something like that).
I'll try with D calling loadlibrary on D dll's this evening.


March 28, 2012
> this works on every dll I try to inject apart from dll's written in D
> (starting with dmd version 2,054 or something like that).

If this is a regression, please narrow it down to the exact version.
April 11, 2012
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.
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);
}

Op 28 maart 2012 13:13 schreef Trass3r <un@known.com> het volgende:

> this works on every dll I try to inject apart from dll's written in D
>> (starting with dmd version 2,054 or something like that).
>>
>
> If this is a regression, please narrow it down to the exact version.
>


« First   ‹ Prev
1 2 3