Executable memory

Adam D. Ruppe destructionator at gmail.com
Fri Oct 4 13:18:23 PDT 2013


On Friday, 4 October 2013 at 19:58:54 UTC, Alan wrote:
> fault) I've seen ways to do this in Linux and Windows in C/C++ 
> but I have no clue where to start with this in D.

You can often almost copy+paste code from C into D and get it 
working. My guess is the C examples use mmap on Linux and 
VirtualAlloc to do it on Windows.

You can call those same functions from D as well. Most you might 
have to do is copy some declarations from C, but these are in 
druntime so you'll be ok.

For example, a working Linux program would be like this:

import core.sys.posix.sys.mman;

void main()
{
        // the operating system mmap call lets us set the 
executable flag
         uint* opcodes = cast(uint*) mmap(null, 4096, PROT_EXEC | 
PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0);
	scope(exit)
		munmap(opcodes, 4096); // free when we're done - scope(exit) rox
         opcodes[0] = 0xCC;
        // you did a delegate before, but you really should use a 
function
        // because delegates expect more state that won' really be 
here
         void* function() func = cast(void* function()) opcodes;
         func();
}


and you get the breakpoint trap when you run it, which is what 
opcode 0xcc is supposed to do.



And a working Windows program would look like this:

import core.sys.windows.windows;
void main() {
        // VirtualAlloc and mmap are very similar functions...
	uint* opcodes = cast(uint*) VirtualAlloc(null, 4096, MEM_COMMIT, 
PAGE_EXECUTE_READWRITE);
	scope(exit)
	VirtualFree(opcodes, 4096, MEM_RELEASE);

         // and the rest is the same
         opcodes[0] = 0xCC;
         void* function() func = cast(void* function()) opcodes;
         func();
}


More information about the Digitalmars-d-learn mailing list