首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无视SEH,通过葡萄酒强迫核心

无视SEH,通过葡萄酒强迫核心
EN

Stack Overflow用户
提问于 2010-08-29 04:25:53
回答 2查看 890关注 0票数 1

我想从程序中强制一个核心程序(或者在某个特定的时间以其他方式看到它的内存)。不过,有几个问题:

  • I是在
  • 下运行的(不能通过winedbg运行,因为应用程序检测到了)
  • 应用程序使用异常/ SEH /其他处理程序,这些处理程序捕获非标准事件
  • ,甚至附加strace阻止程序运行
  • ,所以没有特定的区域可以打印
  • 好.我没有源

我试过将代码改为两种:

代码语言:javascript
复制
xor eax, eax
call eax

和一些随机的东西,这不是一个真正的指导-两次SEH启动和拯救应用程序。

我怎样才能得到这些信息?我需要一个特定时间的记忆图像,并可以修补它发生的确切地点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-29 04:27:43

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

另一种选择是通过引发SIGSTOP信号来修改应用程序以挂起自己。葡萄酒中的Windows应用程序仍然可以通过调用int $0x80访问linux,因此您可以注入如下代码:

代码语言:javascript
复制
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处理程序--但也可以使用可以克服的正确的系统)。

票数 3
EN

Stack Overflow用户

发布于 2010-08-30 09:35:55

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

代码语言:javascript
复制
/* Make sure any filter already in place is deleted. */
SetUnhandledExceptionFilter(NULL);
UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers);
TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN);

另一种可能是将一个空的处理程序放在列表的首位。就像这样:

代码语言:javascript
复制
#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:,-1“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3593511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档