我想从程序中强制一个核心程序(或者在某个特定的时间以其他方式看到它的内存)。不过,有几个问题:
我试过将代码改为两种:
xor eax, eax
call eax和一些随机的东西,这不是一个真正的指导-两次SEH启动和拯救应用程序。
我怎样才能得到这些信息?我需要一个特定时间的记忆图像,并可以修补它发生的确切地点。
发布于 2010-08-29 04:27:43
由于您可以访问葡萄酒的源代码,所以我建议您只修改wine代码和/或IsDebuggerPresent()函数的实现。
另一种选择是通过引发SIGSTOP信号来修改应用程序以挂起自己。葡萄酒中的Windows应用程序仍然可以通过调用int $0x80访问linux,因此您可以注入如下代码:
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处理程序--但也可以使用可以克服的正确的系统)。
发布于 2010-08-30 09:35:55
试着像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:,-1“。
https://stackoverflow.com/questions/3593511
复制相似问题