2010-08-29 25 views
1

Je voudrais forcer un coredump à partir d'un programme (ou voir sa mémoire à un moment spécifique d'une autre manière). Il y a quelques problèmes cependant:Forcer un coredump via Wine en ignorant SEH

  • Je cours sous le vin (ne peut pas exécuter via winedbg, car l'application détecte)
  • L'application utilise des exceptions/SEH/autres gestionnaires, qui non capture événements standard
  • strace Même la fixation arrête le programme de travail
  • Je voudrais fouiller, donc il n'y a pas de zones spécifiques que je pouvais imprimer
  • Eh bien ... Je n'ai pas la source

J'ai essayé de changer le code à la fois:

xor eax, eax 
call eax 

et quelques trucs au hasard qui n'a pas été une vraie instruction - à la fois le temps SEH a lancé et a sauvé l'application.

Comment puis-je obtenir l'information? J'ai besoin de l'image de la mémoire à un moment précis et peut corriger l'endroit exact où il se produit.

Répondre

3

Puisque vous avez accès au code source du vin, je suggérerais simplement de modifier le code SEH du vin, et/ou l'implémentation de la fonction IsDebuggerPresent().

Une autre option serait de modifier l'application pour qu'elle se suspende elle-même en élevant un signal SIGSTOP. les applications Windows dans le vin peuvent encore accéder aux API linux en invoquant int $0x80, vous pouvez donc injecter un code comme ce qui suit:

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 

Ensuite, vous pouvez mmap va de /proc/(pid)/mem pour lire la mémoire du processus, ou même attacher gdb et de l'utilisation sa commande generate-core-file. Alternativement, vous pouvez changer cela pour simplement augmenter SIGQUIT ou quelque chose pour déclencher une décharge de base droite puis là (en supposant que le vin n'a pas installé un gestionnaire SIGQUIT - mais avec les bons appels système qui peuvent être surmontés ainsi).

+0

Intéressant ... Je pourrais le faire. Cependant, je n'ai jamais compilé de «vin» auparavant - et il faudrait probablement beaucoup de temps pour trouver tous les bons endroits. J'espère que quelqu'un d'autre peut trouver quelque chose de plus facile (... a dit l'homme qui essayait de ré-eng une application protégée sous un émulateur semi-correct ..., ouais je vois l'ironie) – viraptor

+0

Ajouté une approche alternative – bdonlan

+0

Malheureusement le vin semble prendre soin de SIGSTOP, parce que je vois juste plus de messages SEH dans les journaux. – viraptor

0

Essayez de le faire comme MSVC. Ils appellent UnhandledExceptionFilter directement qui contourne les gestionnaires d'exceptions de l'application. De gs_report.c (quelques #ifdefs sautées):

/* Make sure any filter already in place is deleted. */ 
SetUnhandledExceptionFilter(NULL); 
UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers); 
TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN); 

Une autre possibilité est de mettre un gestionnaire vide à la tête de la liste. Quelque chose comme ceci:

#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 
    } 
} 

Edit: désolé, je n'ai pas remarqué "ne pas avoir la source" jusqu'à maintenant. Mais si vous pouvez patcher le code, vous pouvez probablement ajouter "mov fs: [0], -1".