Hi,

I have a big problem. I have mad a little Debugger witch trace taget with CreateProcess, WaitForDebugEvent, ContinueDebugEvent... fonctions.
But some progs send it and 'EXCEPTION 01H' and that's stop my debugger. (Asprotect for example)


Can I Send You my source ? to see it... I have'nt any solution

(At this time, my prog keep EIP of each lines and find the last EIP of the .LOADER section and find Entry-Point of the real .TEXT section, so I'll could do a dump for progs compressed)
(it works with ASPAK but not with ASPROTECT due to EXCEPTION 01h)






.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\user32.lib



.data
AppName db "BPMB_EMULATION (Morgatte)",0 ;<-- Titre de mon unique fen?tre (une MessageBox)
ofn OPENFILENAME <> ;<-- Structure pour cr?er la DialogBox qui sert ?
FilterString db "Executable Files",0,"*.exe",0 ;choisir un fichier (et son filtre de type de fichiers)
db "All Files",0,"*.*",0,0
;??????????
;??????????
;??????????
resultat db "COMPTE RENDU :",0Dh,0Ah
db "La derni?re instruction du loader est : %lxh",0dh
db "Et elle saute vers l'Entry-Point du programme",0dh
db "D?compress? qui se trouve en : %lxh",0d,0ah
ADRESSEDEBUTLOADER dd 0040D000h
ADRESSEFINLOADER dd 0040F000h
sortie_du_loader db 0 ; sert ? compter combien de lignes ne font pas parti du Loader
; si il y en a plus qu'une alors c'est qu'on est bien
; en dehors du loader





.data?
buffer db 512 dup(?)
startinfo STARTUPINFO <> ;<-- Structure pour la fonction GetStartUpInfo
pi PROCESS_INFORMATION <> ;<-- Structure pour les fonctions Get&SetThreadContext
DBEvent DEBUG_EVENT <> ;<-- Structure pour receuillir le Debugging ?v?nement (WaitForDebugEvent)
context CONTEXT <> ;<-- Stucture pour recup?rer le context (en particulier regEip)
EipMoinsUn dd ?
EipMoinsDeux dd ?
LOADER dd ?





.code
start:
mov ofn.lStructSize,SIZEOF ofn
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buffer
mov ofn.nMaxFile,512
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER \
or OFN_HIDEREADONLY ;Dans un premier temps on ouvre la DialogBox permettant
invoke GetOpenFileName, ADDR ofn ;de s?lectionner le programme cible qui sera debugg?
.if eax==TRUE
invoke GetStartupInfo,addr startinfo ;On r?cup?re des infos sur lui (pour son demarrage)
invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, \ ;Cr?e le Process et le
DEBUG_PROCESS+ DEBUG_ONLY_THIS_PROCESS, \ ;lien primaire de la cible
NULL, NULL, addr startinfo, addr pi ;puis la d?marre.
;??????????
;??????????
;??????????


.while TRUE
invoke WaitForDebugEvent, addr DBEvent, INFINITE ;Attend qu'un Debugging ?v?nement ne se
;produise

;--------------ICI-mettre-la-valeur-de-regEip-(Donc de la ligne suspecte)-------



;-------------------------------------------------------------------------------


.if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
.break
.elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
.if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT ; (80000003h)
mov context.ContextFlags, CONTEXT_CONTROL
invoke GetThreadContext, pi.hThread, addr context
or context.regFlag,100h
invoke SetThreadContext,pi.hThread, addr context
invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
.continue
.elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP ; (80000004h)
;-----------ICI-mettre-la-lecture-du-contenu-de-l'adresse---------------------

mov eax, context.regEip ; Regarde si le EIP actuel
.if (ADRESSEDEBUTLOADER<=eax && eax<=ADRESSEFINLOADER && LOADER!=TRUE) ; appartient au LOADER
mov LOADER, TRUE ; si oui, on met
.endif ; LOADER ? TRUE

.if ((ADRESSEDEBUTLOADER>eax || eax>ADRESSEFINLOADER) && LOADER==TRUE) ;
inc sortie_du_loader ; Si on est d?j? pass? par le LOADER
.if (sortie_du_loader < 2) ; Et que maintenant EIP est en-dehors
mov eax, EipMoinsUn ; Alors c'est qu'on en est sorti
mov EipMoinsDeux, eax ; On est dans le prog D?compress?
.else ;
invoke wsprintf, addr buffer, addr resultat, EipMoinsDeux, EipMoinsUn
invoke MessageBox, 0, addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION
.break ;
.endif ; Et EipMoinUn est l'EntryPoint du
.else ; prog d?compress?.
mov sortie_du_loader,0 ; EipMoinsDeux est la derni?re
.endif ; instruction du LOADER




;-----------------------------------------------------------------------------



mov eax, context.regEip ;------------On garde en m?moire la valeur
mov EipMoinsUn, eax ;------------du EIP pr?c?dant

invoke GetThreadContext,pi.hThread,addr context ; on rappelle le context
or context.regFlag,100h ; on remet le Trap Bit ? 1
invoke SetThreadContext,pi.hThread, addr context ; Et on r?injecte le new context
invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId,DBG_CONTINUE
.continue
.endif
.endif
invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, \
DBG_EXCEPTION_NOT_HANDLED
.endw
.endif
invoke CloseHandle,pi.hProcess ;Quand on termine totalement le d?bugger on DOIT refermer le Process et le Lien
invoke CloseHandle,pi.hThread ;primaire de la cible, sinon la fonction CreateProcess n'appr?cie pas du tout, et l?
invoke ExitProcess, 0 ;votre ordi plante.
end start
Posted on 2001-09-05 11:09:49 by Morgatte