【问题标题】:Forcing a coredump via Wine ignoring SEH通过 Wine 强制核心转储忽略 SEH
【发布时间】:2010-08-29 04:25:53
【问题描述】:

我想从程序中强制执行核心转储(或以其他方式在特定时间查看其内存)。但是有几个问题:

  • 我在 wine 下运行它(不能通过 winedbg 运行,因为应用程序检测到它)
  • 应用程序使用异常/SEH/其他处理程序,它们捕获非标准事件
  • 即使附加 strace 也会阻止程序运行
  • 我想四处看看,所以没有可以打印的特定区域
  • 嗯...我没有来源

我尝试将代码更改为两者:

xor eax, eax
call eax

还有一些不是真正指令的随机内容 - SEH 介入并拯救了应用程序。

如何获取信息?我需要特定时间的内存映像,并且可以修补它发生的确切位置。

【问题讨论】:

    标签: exception reverse-engineering coredump seh


    【解决方案1】:

    由于您可以访问 wine 的源代码,我建议只更改 wine SEH 代码和/或 IsDebuggerPresent() 函数的实现。

    另一种选择是修改应用程序以通过发出 SIGSTOP 信号来暂停自身。 Wine 中的 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
    

    然后你可以mmap范围从/proc/(pid)/mem读出进程的内存,甚至附加gdb并使用它的generate-core-file命令。或者,您可以将其更改为简单地引发SIGQUIT 或立即触发核心转储(假设wine 尚未安装SIGQUIT 处理程序 - 但也可以使用正确的系统调用)。

    【讨论】:

    • 有趣...我能做到。然而,我以前从未编译过wine——而且可能需要很长时间才能找到所有正确的地方。我希望其他人能想出一些更简单的东西(......那个人说试图在一个半正确的模拟器下修改一个受保护的应用程序......,是的,我看到了讽刺意味)
    • 不幸的是 wine 似乎可以处理 SIGSTOP,因为我只是在日志中看到更多的 SEH 消息。
    • SIGSTOP 无法被捕获。不过,我会检查该代码是否真的正常工作 - 我没有测试它:) 尝试将它放入一个独立的 linux 程序中,看看它是否正常工作......
    【解决方案2】:

    尝试像 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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多