2010-08-29 4 views
1

Я хотел бы заставить coredump из программы (или посмотреть его память в определенное время каким-то другим способом). Есть несколько проблем, хотя:Принуждение к выпуклой коробке с помощью Wine игнорируя SEH

  • Я бегу под вино (не может работать через winedbg, так как приложение обнаруживает его)
  • Приложение использует исключения/SEH/другие обработчики, которые захватывают не- стандартные события
  • Даже прикрепление Трассирования останавливает программу от работы
  • Я хотел бы копаться, так что нет каких-либо конкретных областей, которые я мог бы напечатать
  • Ну ... у меня нет источника

Я попытался изменить код как:

xor eax, eax 
call eax 

и некоторые случайные вещи, которые не настоящая инструкция - как раз SEH ногами, и спасли приложение.

Как я могу получить информацию? Мне нужно изображение памяти с определенного времени и можно запланировать точное место, где оно происходит.

ответ

3

Поскольку у вас есть доступ к исходному коду вина, я бы предложил просто изменить код SEH вина и/или реализацию функции IsDebuggerPresent().

Другой вариант - изменить приложение, чтобы приостановить его, подняв сигнал SIGSTOP. приложения для Windows в Wine еще может получить доступ к Linux API, вызвав int $0x80, чтобы вы могли вводить код вроде следующего:

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 или что-то, чтобы вызвать ядро ​​ядра сразу и там (при условии, что в вине не установлен обработчик SIGQUIT, но с правильными системными вызовами, которые также можно преодолеть).

+0

Интересно ... Я мог бы это сделать. Однако я никогда не собирал «вино» раньше - и, вероятно, потребуется много времени, чтобы найти все нужные места. Я надеюсь, что кто-то еще может придумать что-нибудь более простое (... сказал, что человек пытается rev-eng защищенное приложение под полуправильным эмулятором ..., да, я вижу иронию) – viraptor

+0

Добавлен альтернативный подход – bdonlan

+0

К сожалению, похоже, заботится о SIGSTOP, потому что я просто вижу больше сообщений SEH в журналах. – viraptor

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» к нему.

 Смежные вопросы

  • Нет связанных вопросов^_^