|
@@ -28,8 +28,9 @@
|
|
# define USE_PTRACE
|
|
# define USE_PTRACE
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifdef HL_MAC
|
|
|
|
|
|
+#if defined(HL_MAC) && defined(__x86_64__)
|
|
# include <mdbg/mdbg.h>
|
|
# include <mdbg/mdbg.h>
|
|
|
|
+# define MAC_DEBUG
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#if defined(HL_WIN)
|
|
#if defined(HL_WIN)
|
|
@@ -66,7 +67,7 @@ HL_API bool hl_debug_start( int pid ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
last_pid = -1;
|
|
last_pid = -1;
|
|
return (bool)DebugActiveProcess(pid);
|
|
return (bool)DebugActiveProcess(pid);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_session_attach(pid);
|
|
return mdbg_session_attach(pid);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return ptrace(PTRACE_ATTACH,pid,0,0) >= 0;
|
|
return ptrace(PTRACE_ATTACH,pid,0,0) >= 0;
|
|
@@ -80,7 +81,7 @@ HL_API bool hl_debug_stop( int pid ) {
|
|
BOOL b = DebugActiveProcessStop(pid);
|
|
BOOL b = DebugActiveProcessStop(pid);
|
|
CleanHandles();
|
|
CleanHandles();
|
|
return (bool)b;
|
|
return (bool)b;
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_session_detach(pid);
|
|
return mdbg_session_detach(pid);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return ptrace(PTRACE_DETACH,pid,0,0) >= 0;
|
|
return ptrace(PTRACE_DETACH,pid,0,0) >= 0;
|
|
@@ -92,7 +93,7 @@ HL_API bool hl_debug_stop( int pid ) {
|
|
HL_API bool hl_debug_breakpoint( int pid ) {
|
|
HL_API bool hl_debug_breakpoint( int pid ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
return (bool)DebugBreakProcess(OpenPID(pid));
|
|
return (bool)DebugBreakProcess(OpenPID(pid));
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_session_pause(pid);
|
|
return mdbg_session_pause(pid);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return kill(pid,SIGTRAP) == 0;
|
|
return kill(pid,SIGTRAP) == 0;
|
|
@@ -104,7 +105,7 @@ HL_API bool hl_debug_breakpoint( int pid ) {
|
|
HL_API bool hl_debug_read( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
HL_API bool hl_debug_read( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
return (bool)ReadProcessMemory(OpenPID(pid),addr,buffer,size,NULL);
|
|
return (bool)ReadProcessMemory(OpenPID(pid),addr,buffer,size,NULL);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_read_memory(pid, addr, buffer, size);
|
|
return mdbg_read_memory(pid, addr, buffer, size);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
while( size ) {
|
|
while( size ) {
|
|
@@ -128,7 +129,7 @@ HL_API bool hl_debug_read( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
HL_API bool hl_debug_write( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
HL_API bool hl_debug_write( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
return (bool)WriteProcessMemory(OpenPID(pid),addr,buffer,size,NULL);
|
|
return (bool)WriteProcessMemory(OpenPID(pid),addr,buffer,size,NULL);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_write_memory(pid, addr, buffer, size);
|
|
return mdbg_write_memory(pid, addr, buffer, size);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
while( size ) {
|
|
while( size ) {
|
|
@@ -153,7 +154,7 @@ HL_API bool hl_debug_write( int pid, vbyte *addr, vbyte *buffer, int size ) {
|
|
HL_API bool hl_debug_flush( int pid, vbyte *addr, int size ) {
|
|
HL_API bool hl_debug_flush( int pid, vbyte *addr, int size ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
return (bool)FlushInstructionCache(OpenPID(pid),addr,size);
|
|
return (bool)FlushInstructionCache(OpenPID(pid),addr,size);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return true;
|
|
return true;
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return true;
|
|
return true;
|
|
@@ -162,7 +163,7 @@ HL_API bool hl_debug_flush( int pid, vbyte *addr, int size ) {
|
|
# endif
|
|
# endif
|
|
}
|
|
}
|
|
|
|
|
|
-#ifdef HL_MAC
|
|
|
|
|
|
+#ifdef MAC_DEBUG
|
|
static int get_reg( int r ) {
|
|
static int get_reg( int r ) {
|
|
switch( r ) {
|
|
switch( r ) {
|
|
case 0: return REG_RSP;
|
|
case 0: return REG_RSP;
|
|
@@ -243,7 +244,7 @@ HL_API int hl_debug_wait( int pid, int *thread, int timeout ) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
return 4;
|
|
return 4;
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_session_wait(pid, thread, timeout);
|
|
return mdbg_session_wait(pid, thread, timeout);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
int status;
|
|
int status;
|
|
@@ -268,7 +269,7 @@ HL_API int hl_debug_wait( int pid, int *thread, int timeout ) {
|
|
HL_API bool hl_debug_resume( int pid, int thread ) {
|
|
HL_API bool hl_debug_resume( int pid, int thread ) {
|
|
# if defined(HL_WIN)
|
|
# if defined(HL_WIN)
|
|
return (bool)ContinueDebugEvent(pid, thread, DBG_CONTINUE);
|
|
return (bool)ContinueDebugEvent(pid, thread, DBG_CONTINUE);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_session_resume(pid);
|
|
return mdbg_session_resume(pid);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return ptrace(PTRACE_CONT,pid,0,0) >= 0;
|
|
return ptrace(PTRACE_CONT,pid,0,0) >= 0;
|
|
@@ -340,7 +341,7 @@ HL_API void *hl_debug_read_register( int pid, int thread, int reg, bool is64 ) {
|
|
return (void*)*(int_val*)&c.ExtendedRegisters[10*16];
|
|
return (void*)*(int_val*)&c.ExtendedRegisters[10*16];
|
|
#endif
|
|
#endif
|
|
return (void*)*GetContextReg(&c,reg);
|
|
return (void*)*GetContextReg(&c,reg);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_read_register(pid, thread, get_reg(reg), is64);
|
|
return mdbg_read_register(pid, thread, get_reg(reg), is64);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
void *r = get_reg(reg);
|
|
void *r = get_reg(reg);
|
|
@@ -391,7 +392,7 @@ HL_API bool hl_debug_write_register( int pid, int thread, int reg, void *value,
|
|
else
|
|
else
|
|
*GetContextReg(&c,reg) = (REGDATA)value;
|
|
*GetContextReg(&c,reg) = (REGDATA)value;
|
|
return (bool)SetThreadContext(OpenTID(thread),&c);
|
|
return (bool)SetThreadContext(OpenTID(thread),&c);
|
|
-# elif defined(HL_MAC)
|
|
|
|
|
|
+# elif defined(MAC_DEBUG)
|
|
return mdbg_write_register(pid, thread, get_reg(reg), value, is64);
|
|
return mdbg_write_register(pid, thread, get_reg(reg), value, is64);
|
|
# elif defined(USE_PTRACE)
|
|
# elif defined(USE_PTRACE)
|
|
return ptrace(PTRACE_POKEUSER,thread,get_reg(reg),value) >= 0;
|
|
return ptrace(PTRACE_POKEUSER,thread,get_reg(reg),value) >= 0;
|