Поскольку у вас есть доступ к исходному коду wine, я бы предложил просто изменить код wine SEH и / или реализовать функцию IsDebuggerPresent()
.
Еще один вариант - изменить приложение так, чтобы оно приостанавливалось, вызывая сигнал SIGSTOP. Приложения для Windows в Wine по-прежнему могут получать доступ к API-интерфейсам Linux, вызывая 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
или что-то еще, чтобы тут же вызвать дамп ядра (при условии, что у Wine не установлен обработчик SIGQUIT
- но с правильными системными вызовами, которые также можно преодолеть). 1014 *