2010-08-29 57 views
1

我想从一个程序强制一个coredump(或以其他方式在特定时间查看其内存)。有几个问题,但:通过忽略SEH强制一个coredump

  • 我在酒运行它(不能通过winedbg运行,因为应用程序检测到它)
  • 应用程序使用的例外/ SEH /其他处理程序,捕捉非标准事件
  • 即使附加使用strace从工作
  • 停止程序我想闲逛,所以有没有,我可以打印
  • 嗯...我没有源
  • 特定区域

我试过的代码更改为两个:

xor eax, eax 
call eax 

和一些随机的东西,这是不是一个真正的指令 - 无论时间SEH踢救出的应用。

我该如何获取信息?我需要特定时间的记忆图像,并可以修补它发生的确切位置。

回答

3

由于您有权访问葡萄酒的源代码,因此我建议您只更改葡萄酒SEH代码和/或执行IsDebuggerPresent()函数。

另一种选择是修改应用程序以通过引发SIGSTOP信号来挂起自己。 Windows应用程序中的葡萄酒可以通过调用int $0x80仍然爱可信Linux的API,所以你可以注入像下面的一些代码:

mov %eax, $20 ;; sys_getpid 
int $0x80 
mov %ebx, %eax ;; load pid parameter 
mov %eax, $37 ;; sys_kill 
mov %ecx, $19 ;; sig = SIGSTOP 
int $0x80  ;; after executing this instruction, execution will halt 

然后你可以从/proc/(pid)/memmmap范围内读出过程的记忆,甚至附上gdb和使用其命令generate-core-file。或者,您可以更改此设置,以简单地提高SIGQUIT或触发核心转储(假设酒没有安装SIGQUIT处理程序 - 但具有可以克服的正确系统调用)。

+0

有趣...我可以做到这一点。不过,我以前从来没有编写过“葡萄酒” - 而且可能需要很长时间才能找到所有正确的地方。我希望别人能想出更容易的东西(...说那个人试图在一个半正确的模拟器下重新启动一个受保护的应用程序......,是的,我看到了讽刺) – viraptor 2010-08-29 04:36:43

+0

添加了替代方法 – bdonlan 2010-08-29 04:49:59

+0

不幸的是,似乎照顾了SIGSTOP,因为我只在日志中看到更多的SEH消息。 – viraptor 2010-08-29 16:26:18

0

试着像MSVC那样做。他们直接调用UnhandledExceptionFilter来绕过应用程序的异常处理程序。 从gs_report.c(一些的#ifdefs跳过):

/* Make sure any filter already in place is deleted. */ 
SetUnhandledExceptionFilter(NULL); 
UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers); 
TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN); 

另一种可能性是把一个空的处理程序在列表的头部。这样的事情:

#include <stdio.h> 
#include <excpt.h> 
#include <intrin.h> 
int main() 
{ 
    __try 
    { 
    __writefsdword(0, -1); // put chain end marker (-1) in fs:0 
    *(int*)9 = 0;   // trigger the exception 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
    printf("Exception!\n"); // this does not appear 
    } 
} 

编辑:对不起,我没有注意到“没有源”,直到现在。但是如果你可以修补代码,你可以添加“mov fs:[0],-1”。