Protection
   Cryption er Anti-XXX  

Les Protections Renforcées

  Outils
   SoftIce ProcDump    
  Cible
   DCeSS  

By Pulsar & Christal

Bye Bye Peshield....

Le combat


(toute ressemblance avec des personnes ayant existés, ou existantes, ou qui existeront ne serait pas tout à fait le fruit du hasard!)

A ma droite, tout dans les muscles, rien dans la tête: Le Titandestuts dit Goliath

A ma gauche, le challenger, Davidroidelasm, champion du Ring0!

Le combat opposera les deux adversaires en 4 rounds, suivant les règles du marquis de Qwennsburry

Et c'est Titandestuts qui engage le combat:

A l'initiative de Cmos, qui proposait un petit programme de 30 ko tout mouillé, DeCSS, mais protégé par PESHIELD version 0.2 d'ANAKIN [Da Vinci], j'ai voulu attaquer le programme à la loyale:
Lancement de DeCSS.exe via le Symbol Loader de SoftIce. No Break!
Premier coup bas!
Pas de problème, un p'tit uppercut signé ProcDump, et la first section de DeCSS passe de C0000040 à E0000020

PESHiELD RVA: 00001000 Offset: 00000400 Size: 00005600 Flags: C0000040
PESHiELD RVA: 0001D000 Offset: 00005A00 Size: 00000800 Flags: C0000040
ANAKIN98 RVA: 0003B000 Offset: 00006200 Size: 00001400 Flags: C0000040

Puis je suis reparti à la charge, toujours avec SoftIce.
Deuxième coup bas!
"Files was altered! Maybe it is infected by a virus".
Ca, c'est un message typique de checksum, mais comme en dehors du flags d'une section je n'ai encore rien fait, c'est que PESHIELD va contrôler l'état du PE Header, et les modifications qui lui ont été faite.

Pao grave! il suffit pour le moment de reprendre l'exe non modifié, et de bricoler sa première instruction:

Entry point

:0043B000  60                  PUSHAD   à remplacer par CC
:0043B001  E800000000          CALL    0043B006
:0043B006  41                  INC     ECX
:0043B007  4E                  DEC     ESI
:0043B008  41                  INC     ECX
:0043B009  4B                  DEC     EBX
:0043B00A  49                  DEC     ECX
:0043B00B  4E                  DEC     ESI
:0043B00C  5D                  POP     EBP
:0043B00D  83ED06              SUB     EBP,06
:0043B010  EB02                JMP     0043B014

Maintenant, on peut prendre la main, sans être em... poisonné par le Checksum qui ne porte que sur les modifications du Pe header.

La réplique de Davidroidelasm,

Ces modifications sont dans le header de l'exe qui commence en 400000 (pour plus d'infos documentez-vous la dessus)
On fait bpr 400000 401000 RW et on lance le prog....
Et là, on le fait breaker jusqu'à ce qu'on tombe sur un lodsd

:0043B400  AD                  LODSD            > là!
:0043B401  03D0                ADD     EDX,EAX
:0043B403  EB01                JMP     0043B406
:0043B405  68AD03D0EB          PUSH    EBD003AD
:0043B40A  01C8                ADD     EAX,ECX

on fait d edi et on doit trouver le nom de la première section...

:d edi
0003B000 00 29 47 3E 89 76 F8 B8-9E 07 BA 27 17 89 56 FE  .)G>.v.....'..V.
0003B010 89 46 FC 8B F0 EB 1B 26-8B 04 2B DB 8E C0 26 39  .F.....&..+...&9
0003B020 1E 00 00 74 18 8E 46 FE-26 8B 04 2B C9 8B F1 89  ...t..F.&..+....

Bon on est bien la!
On commence à tracer jusqu'à tomber sur:

dec ecx
jnz XXX
jmp XXX

0043B41D  EB02                 JMP     0043B421
0043B41F  C78B03D0C1C202EB01C7 MOV     DWORD PTR [EBX+C2C1D003],C701EB02
0043B429  49                   DEC     ECX
0043B42A  75D1                 JNZ     0043B3FD
0043B42C  EB01                 JMP     0043B42F
0043B42E  CA3B95               RETF    953B
0043B431  6D                   INSD    > hep, un coup d'œil ici!

On met un bpx sur le jmp ,on enlève le bpr précèdent, et on lance...
Au break, il est préférable d'enlever le bpx, car si Peshield regarde, il pourrait ne pas aimer trouver un 0CCh!
Et on trace un peu jusqu'à tomber sur cmp edx,[ebp+xxx]

0043B429  49                  DEC     ECX
0043B42A  75D1                JNZ     0043B3FD
0043B42C  EB01                JMP     0043B42F
0043B42E  CA3B95              RETF    953B
0043B42F  3B956D110000        CMP     EDX,[EBP+0000116D] le code a changé!
0043B435  EB01                JMP     0043B438
0043B437  C80F855D            ENTER   850F,5D
0043B43B  0200                ADD     AL,[EAX]

et deux F10 plus tard:

0043B437  C80F855D            ENTER     850F,5D
0043B438  0F855D020000        JNZ       0043B69B (NO JUMP si PE Header intègre)
0043B43E  8B85C9110000        MOV       EAX,[EBP+000011C9]
0043B444  EB03                JMP       0043B449

Checksum pas Glop

:d edx
013F:00845904 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 
013F:00845914 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 
013F:00845924 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 

On met un bpm X sur l'offset de cette instruction, on ferme le prog, et on enlève les modifs des sections
Puis on relance le prog et il breake sur le bpm x.
Là, on a le bon checksum dans edx car on a rien modifié...

Checksum Glop Glop

:d edx
013F:0084610D ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 
013F:0084611D ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 
013F:0084612D ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? 

C'est pas nécessaire de faire ça mais je vous montre un peu les protections que Peshield utilise, comme ca....

Titandestuts contre attaque,

ANAKIN est un Reverser, et comme beaucoup d'entre eux, sa logique est d'abord d'expliquer comment casser une protection, pas de garder pour soit les contre-mesures qu'il a pu "inventer"...
Aimablement, il explique dans l'un des fichiers trouvable sur le site de Sudden Discharge (ou sur Http://www.multimania.com/christalpage/protec.htm):

I got a lot of mails in the last days concerning peshield.
(Why now? PESHIELD is out since months...)
Some guys were asking how i defeated the PROCDUMP dump function,
maybe this source will help...
The basic idea behind the anti procdump code is, to make procdump
think, the process it wants to dump is longer than it really is.
Therefore I get my hands on the internal windows variable that stores
the process size. For windows 95 and windows NT two different ways
are necessary. (look at the code for it)
When I have changed this variable, PROCDUMP's full dump function tries
to access pages that are not in memory. Windows returns dump not possible
and you will see the nice MessageBox "Dumping this process is not possible"

I saw other protections that are based on VirtualProtect... but I wasn't
able to see any effect, neither under Windows 95 nor under Windows NT...
Maybe I have the wrong service pack... ;)

anakin@bigfoot.de

          ANTIPDD.ASM - example program against PROCDUMP FULL DUMP
                   (C) Copyright 1998 by ANAKiN [DaVinci]

fire_up_the_anti_procdump_full_dump_wall:

        MOV     EAX, fs:[30h]
        TEST    EAX, EAX
        JS      fuapfdw_is9x     ; detected Win 9x
fuapfdw_isNT:
        MOV     EAX, [EAX+0Ch]
        MOV     EAX, [EAX+0Ch]
        ADD     DWORD PTR [EAX+20h], 2000h ; increase size variable
        JMP     fuapfdw_finished

fuapfdw_is9x:
        PUSH    0
        CALL    GetModuleHandleA
        TEST    EDX, EDX
        JNS     fuapfdw_finished      ; Most probably incompatible!!!
        CMP     DWORD PTR [EDX+8], -1
        JNE     fuapfdw_finished      ; Most probably incompatible!!!
        MOV     EDX, [EDX+4]          ; get address of internaly used
                                      ; PE header
        ADD     DWORD PTR [EDX+50h], 2000h ; increase size variable

fuapfdw_finished:
        ; return it
        ret

Main:
        cinit   ; init the console

        CALL    fire_up_the_anti_procdump_full_dump_wall;    :) ;)

        cwrites <trytodump>
        cread   <test> <1>

        push    0                  ; Exit to win
        CALL    ExitProcess

end Main

Mais se fait immédiatement contre attaquer,

Pour virer les trucs anti-procdump, on met un bmp fs:30 R et on lance jusqu'à ce qu'il breake puis on trace un peu pour tomber sur js xxxxxx

0043B47A  C0EB01              SHR     BL,01
0043B47D  C77818EB01688B      MOV     DWORD PTR [EAX+18],8B6801EB
0043B47E  7818                JS      0043B498                  (JUMP)
0043B480  EB01                JMP     0043B483
0043B482  688B400CEB          PUSH    EB0C408B

Là, il devrait sauter...(suivant les versions de Win je pense). S'il saute pas quand il essaiera de modifier un truc, faites lui sauter l'instruction, pour arriver sur du code comme suit

mov eax,[ebp+xxxxx]
cmp [eax+08],edi

:0043B498  EB02                JMP     0043B49C
:0043B49A  0FFF8B              INVALID
:0043B49C  8B8561110000        MOV     EAX,[EBP+00001161]
:0043B4A2  397808              CMP     [EAX+08],EDI
:0043B4A5  EB03                JMP     0043B4AA
:0043B4A7  2BD2                SUB     EDX,EDX
mov eax,[eax+4]


:0043B4A9  E975108B40          JMP     40CEC523
:0043B4AC  8B4004              MOV     EAX,[EAX+04]
:0043B4AF  EB01                JMP     0043B4B2
:0043B4B1  EA895850EB03CD      JMP     CD03:EB505889
:0043B4B8  20048B              AND     [ECX*4+EBX],AL

mov [eax+50],ebx		<- c'est la le code anti-procdump

:0043B4A9  E975108B40          JMP     40CEC523
:0043B4AE  04EB                ADD     AL,EB
:0043B4B0  01EA                ADD     EDX,EBP
:0043B4B2  895850              MOV     [EAX+50],EBX
:0043B4B5  EB03                JMP     0043B4BA
:0043B4B7  CD20                INT     20 VXDJmp EBC8,0B04

et on saute cette instruction par un r eip next_instruction ...

Titandestuts essaye de prendre l'initiative par une attaque vicieuse pour contrer l'anti Sice:

"Numega SoftICE detected, execution stoppped."
Aie! Fait mal ça...
Parce qu'il ne se contente pas de détecter un débuggeur, mais SoftIce en particulier. Vous me direz que ce doit être un bête MeltIce (code 0B), mais le fait qu'il précise expressément NUMEGA, c'est inquiétant...
Il ne faut pas oublier qu'ANAKIN n'est pas un bricolo...
On verra plus tard ce qu'il en est!

Le type de codage utilisé par PEShield est un polymorphe, ou un CCA (Code Changeant d'Apparence) ou overlapping, mais pas un aphrodisiaque!
En face d'un tel codage, les BreakPoints on eXecution sont souvent inopérants, et il vaut mieux poser de Breakpoint Memory on eXecution, (des BPM X Koa!).
Un premier essai avec un Bpm CreateFileA X if *(esp->4+4)=='SICE', n'ayant rien donné, seconde tentative en faisant:

u CreateFileA, pour poser un BPM X sur le JMP

KERNEL32!CreateFileA
:BFF77817  57                  PUSH    EDI
:BFF77818  6827010000          PUSH    00000127
:BFF7781D  2BD2                SUB     EDX,EDX
:BFF7781F  687FDFF9BF          PUSH    BFF9DF7F
:BFF77824  64FF32              PUSH    DWORD PTR FS:[EDX]
:BFF77827  648922              MOV     FS:[EDX],ESP
:BFF7782A  8B7C2414            MOV     EDI,[ESP+14]
:BFF7782E  2BC0                SUB     EAX,EAX
:BFF77830  8D48FF              LEA     ECX,[EAX-01]
:BFF77833  F2AE                REPNZ SCASB
:BFF77835  8B4C2420            MOV     ECX,[ESP+20]
:BFF77839  E305                JECXZ   BFF77840
:BFF7783B  8A01                MOV     AL,[ECX]
:BFF7783D  8A410B              MOV     AL,[ECX+0B]
:BFF77840  648F02              POP     DWORD PTR FS:[EDX]
:BFF77843  83C408              ADD     ESP,08
:BFF77846  5F                  POP     EDI
:BFF77847  E9C7570000          JMP     BFF7D013  -> ici

POP!

Glop Glop, break en BFF77847.
F12 pour sortir de l'API, et retour dans PEShield:

43B7C7 E815050000          CALL    0043BCE1  > vers CreateFileA
43B7CC EB01                JMP     0043B7CF
43B7CE C783F8FFEB01EA0F85EEMOV     DWORD PTR [EBX+01EBFFF8],EE850FEA
43B7CF 83F8FF              CMP     EAX,-01   > si EAX <> de -1 Sice présent
43B7D2 EB01                JMP     0043B7D5
43B7D4 EA0F85EEFEFFFF      JMP     FFFF:FEEE850F
43B7DB EB01                JMP     0043B7DE
43B7DD E280                LOOP    0043B75F

Et le code Changeant d'Apparence, en traçant deux lignes de plus:

43B7C7  E815050000          CALL    0043BCE1
43B7CC  EB01                JMP     0043B7CF
43B7CE  C783F8FFEB01EA0F85EEMOV     DWORD PTR [EBX+01EBFFF8],EE850FEA
43B7D5  0F85EEFEFFFF        JNZ     0043B6C9  (JUMP) > Sice présent!
43B7DB  EB01                JMP     0043B7DE
43B7DD  E280                LOOP    0043B75F
43B7DF  BD3D110000          MOV     EBP,0000113D
43B7E4  01EB                ADD     EBX,EBP
43B7E6  01C8                ADD     EAX,ECX 


Il n'y a plus qu'à forcer le contenu de EAX à -1...

Eclats de rire de Davidroidelasm,

Arf!
C'est moi qui t'ai appris ce coup là!
Regarde voir:

PEShield va essayer de détecter Sice et de nous bouffer le PEheader par le biais de writeprocessmemory (il n'appelle pas directement les fonctions alors il faut attaquer par un autre moyen...).
Je reprends le principe, mes adresses sont différentes des tiennes:
On fait "u createfilea" et on pose un bpm x sur le jmp

KERNEL32!CreateFileA                                         
:BFF77ADF  57            PUSH      EDI             
:BFF77AE0  6827010000    PUSH      00000127        
:BFF77AE5  2BD2          SUB       EDX,EDX         
:BFF77AE7  681F19FABF    PUSH      BFFA191F        
:BFF77AEC  64FF32        PUSH      DWORD PTR FS:[EDX]
:BFF77AEF  648922        MOV       FS:[EDX],ESP      
:BFF77AF2  8B7C2414      MOV       EDI,[ESP+14]      
:BFF77AF6  2BC0          SUB       EAX,EAX           
:BFF77AF8  8D48FF        LEA       ECX,[EAX-01]      
:BFF77AFB  F2AE          REPNZ SCASB                 
:BFF77AFD  8B4C2420      MOV       ECX,[ESP+20]      
:BFF77B01  E305          JECXZ     BFF77B08          
:BFF77B03  8A01          MOV       AL,[ECX]          
:BFF77B05  8A410B        MOV       AL,[ECX+0B]       
:BFF77B08  648F02        POP       DWORD PTR FS:[EDX]
:BFF77B0B  83C408        ADD       ESP,08            
:BFF77B0E  5F            POP       EDI               
:BFF77B0F  E904790000    JMP       BFF7F418 <- ici on pose notre bpm x

Voilà pour le test anti-sice:
Il doit breaker sur le CreateFile...
Et il checke une première fois si le vxd de TRWin est loadé
(et oui, il ne s'inquiète pas uniquement de SoftIce, il existe d'autres débuggeurs...)

On fait F12 et si eax n'est pas égal a -1 (FFFFFFFFh), on fait r eax -1 (en tout cas si vous utilisez TRW!)

0043B5C3  83F8FF              CMP     EAX,-01           > TRW présent
0043B5C6  EB01                JMP     0043B5C9
0043B5C8  EA0F85E3000000      JMP     0000:00E3850F
0043B5CF  8D8585100000        LEA     EAX,[EBP+00001085]

F10

0043B5B3  858D110000EB        TEST    [EBP+EB000011],ECX
0043B5B9  01EA                ADD     EDX,EBP
0043B5BB  E821070000          CALL    0043BCE1
0043B5C0  EB01                JMP     0043B5C3
0043B5C2  C783F8FFEB01EA0F85E3MOV     DWORD PTR [EBX+01EBFFF8],E3850FEA
0043B5C9  0F85E3000000        JNZ     0043B6B2            NON -> (NO JUMP)
0043B5CF  8D8585100000        LEA     EAX,[EBP+00001085]

Puis on passe au même test pour Sice, avec les mêmes manips...

Maintenant viens le truc qui nous bouffe le PE-header, empêchant un full dump sous ProcDump, en recopiant des conneries dans notre beau PE Header!
On met donc un bpm 400004 W (si la base de l'exe est en 400000, pour voir se qui se passe au niveau de PE Header) et on lance sice...

Il devrait breaker sur un repz movsb...

_VWIN32_CopyMem
0028:C0297E81  56                  PUSH      ESI
0028:C0297E82  57                  PUSH      EDI
0028:C0297E83  8B74240C            MOV       ESI,[ESP+0C]
0028:C0297E87  8B7C2410            MOV       EDI,[ESP+10]
0028:C0297E8B  8B4C2414            MOV       ECX,[ESP+14]
0028:C0297E8F  8BD1                MOV       EDX,ECX
0028:C0297E91  33C0                XOR       EAX,EAX
0028:C0297E93  F3A4                REPZ MOVSB           > ICI
0028:C0297E95  40                  INC       EAX
0028:C0297E96  2BD1                SUB       EDX,ECX
0028:C0297E98  8B742418            MOV       ESI,[ESP+18]
0028:C0297E9C  0BF6                OR        ESI,ESI

On fait d edi et on voit le header de notre exe:

0078FC1C 4D 5A 00 00 01 00 00 00-02 00 00 00 03 00 00 00  MZ..............
0078FC2C 04 00 00 00 05 00 00 00-06 00 00 00 07 00 00 00  ................
0078FC3C 08 00 00 00 09 00 00 00-0A 00 00 00 0B 00 00 00  ................
0078FC4C 0C 00 00 00 0D 00 00 00-0E 00 00 00 DF D8 FF FF  ................
0078FC5C 01 00 00 00 02 00 00 00-03 00 00 00 04 00 00 00  ................


et dans esi, une table bidon...

00000000 00 01 00 00 00 DE 70 00-16 00 0B 00 00 00 70 00  ......p.......p.
00000010 65 04 70 00 54 FF 00 F0-79 EA 00 F0 21 EA 00 F0  e.p.T...y...!...
00000020 00 00 00 C8 D2 08 B3 0A-3A 00 D7 09 52 00 D7 09  ........:...R...
00000030 6A 00 D7 09 82 00 D7 09-9A 00 D7 09 65 04 70 00  j...........e.p.
00000040 07 00 70 C8 4D F8 00 F0-41 F8 00 F0 E2 24 60 FD  ..p.M...A....$`.

On fait r esi edi, et comme ca il copiera le header sur lui-même.

Maintenant Il ne reste plus qu'à sortir ProcDump, et faire un joli Full Dump sur le fichier exe....
Y marche quand même vachement bien procdump :)

Et vi, c'est bon!
On a une import table valide et tout...
Reste à modifier l'entry point pour que tout marche...

Titandestuts tente une diversion,

En traçant les CCA depuis l'Entry Point...

:0043B653  FF95A5100000        CALL    [EBP+000010A5]      POP!
:0043B659  8B859D110000        MOV     EAX,[EBP+0000119D]
:0043B65F  E97D060000          JMP     0043BCE1
:0043B664  8B85E0110000        MOV     EAX,[EBP+000011E0]
:0043B66A  E972060000          JMP     0043BCE1
:0043B66F  8B85E4110000        MOV     EAX,[EBP+000011E4]

Juste après le CALL [EBP+000010A5], l'écran de FrogIce surgit.
SoftIce est détecté...

:0043BC00  EB02                JMP     0043BC04
:0043BC02  EA046A3053EB02      JMP     02EB:53306A04
:0043BC09  EA04506A0052EB      JMP     EB52:006A5004
:0043BC10  01E9                ADD     ECX,EBP
:0043BC12  FFE1                JMP     ECX               Pas GLOP!
:0043BC14  56                  PUSH    ESI

Le JMP ECX va envoyer la message box "SoftIce detected" et filer en Exitprocess...
Après, c'est une affaire de feeling (avec un soupçon d'expérience) pour mettre la main sur l'OEP qui branchera vers le programme décrypté:

:0041DC47  FF9529704000        CALL    [EBP+00407029]
:0041DC4D  8D9D61724000        LEA     EBX,[EBP+00407261]
:0041DC53  6A30                PUSH    30
:0041DC55  6A00                PUSH    00
:0041DC57  53                  PUSH    EBX
:0041DC58  6A00                PUSH    00
:0041DC5A  FFD0                CALL    EAX              message d'erreur si Win 95
:0041DC5C  FFA52D704000        JMP     [EBP+0040702D]   et ExitProcess
:0041DC62  61                  POPAD                    haha!
:0041DC63  9D                  POPFD
:0041DC64  68DA3B4000          PUSH    00403BDA         Hoho!
:0041DC69  C3                  RET                      Bingo!
:0041DC6A  8BB592724000        MOV     ESI,[EBP+00407292]
:0041DC70  0BF6                OR      ESI,ESI
:0041DC72  7418                JZ      0041DC8C
:0041DC74  8B95DF6F4000        MOV     EDX,[EBP+00406FDF]

Mais za ressemble tout à fait à ze que je cherche ze Push 00403BDA!
Le POPAD est un classique de la récupération de l'état des registres avant un passage du relais vers le programme décrypté.
Le voilà mon Zoli OEP!

ll n'y a plus qu'à faire un DUMP avec ProcDump, ou écrire un Patch pour bidouiller tout ça!

Résumons:
Pour pouvoir créer un Dump fonctionnel, il faut se débarrasser de l'Anti Proc Dump, de l'anti-Sice, et se caler sur l'adresse qui passera la main au programme décrypté…

1- Prendre une version non modifiée de DCeSS
2- Placer un CC à la place de 60 en 0043B000
3- Lancer DCeSS.exe
4- Remplacer le CC par 60 (Pushad)
5- Poser un BPM [adresse_du_jump_dans_CreateFileA] X, puis F5
6- F12 une première fois pour passer l'anti-TRW, puis F5
7- F12 une seconde fois, et R RAX=-1 pour contrer l'anti-Sice
8- Désactiver le BPM X de CreateFileA et poser un BPM 40004 W, F5
9- Permuter les registres R ESI EDI, et poser un BPM [0041DC64] X, F5
A- Remplacer le PUSH 00403BDA par un JMP EIP, et F5
B- Créer un Dump Full (Rebuilt Import table)
C- Et changer la valeur de l'EP en 03BDA

Le résultat est un exécutable de 71 ko, au liei des 30 ko d'origine.
Succès garantie auprès des filles...

Mais Davidroidelasm esquive sans problème, et lance un coup terrible,

Il doit y avoir une méthode moins barbare pour trouver l'entry point que tracer dans ce putain de CCA (overlapping pour les puristes), mais c'est lourd...

Ma méthode:
On pose un bmpb GetModuleHandleA X et on avise ensuite :)
Ici (pour DCeSS) par exemple on tombe sur

:00403BDA  55                  PUSH      EBP  <- ca vous parait pas évident
                                                 que c'est l'entry point ????
:00403BDB  8BEC                MOV       EBP,ESP  
:00403BDD  6AFF                PUSH      FF               
:00403BDF  6850814000          PUSH      00408150 
:00403BE4  6854524000          PUSH      00405254 
:00403BE9  64A100000000        MOV       EAX,FS:[00000000]        
:00403BEF  50                  PUSH      EAX                      
:00403BF0  64892500000000      MOV       FS:[00000000],ESP        
:00403BF7  83EC58              SUB       ESP,58                   
:00403BFA  53                  PUSH      EBX                      
:00403BFB  56                  PUSH      ESI                      
:00403BFC  57                  PUSH      EDI                      
:00403BFD  8965E8              MOV       [EBP-18],ESP             
:00403C00  FF1594804000        CALL      [KERNEL32!GetVersion]    
:00403C06  33D2                XOR       EDX,EDX                  
:00403C08  8AD4                MOV       DL,AH                    
:00403C0A  891578B54100        MOV       [0041B578],EDX           
:00403C10  8BC8                MOV       ECX,EAX                  
:00403C12  81E1FF000000        AND       ECX,000000FF             
:00403C18  890D74B54100        MOV       [0041B574],ECX           
:00403C1E  C1E108              SHL       ECX,08                   
:00403C21  03CA                ADD       ECX,EDX                  
:00403C23  890D70B54100        MOV       [0041B570],ECX           
:00403C29  C1E810              SHR       EAX,10                   
:00403C2C  A36CB54100          MOV       [0041B56C],EAX           
:00403C31  33F6                XOR       ESI,ESI                  
:00403C33  56                  PUSH      ESI                      
:00403C34  E8E6140000          CALL      0040511F                 
:00403C39  59                  POP       ECX                      
:00403C3A  85C0                TEST      EAX,EAX                  
:00403C3C  7508                JNZ       00403C46                 
:00403C3E  6A1C                PUSH      1C                       
:00403C40  E8B0000000          CALL      00403CF5                 
:00403C45  59                  POP       ECX                      
:00403C46  8975FC              MOV       [EBP-04],ESI             
:00403C49  E826130000          CALL      00404F74                 
:00403C4E  FF15C0804000        CALL      [KERNEL32!GetCommandLineA]
:00403C54  A384CA4100          MOV       [0041CA84],EAX           
:00403C59  E8E4110000          CALL      00404E42                 
:00403C5E  A348B54100          MOV       [0041B548],EAX           
:00403C63  E88D0F0000          CALL      00404BF5                 
:00403C68  E8CF0E0000          CALL      00404B3C                 
:00403C6D  E8EC0B0000          CALL      0040485E                 
:00403C72  8975D0              MOV       [EBP-30],ESI             
:00403C75  8D45A4              LEA       EAX,[EBP-5C]             
:00403C78  50                  PUSH      EAX                      
:00403C79  FF15BC804000        CALL      [KERNEL32!GetStartupInfoA]
:00403C7F  E8600E0000          CALL      00404AE4                  
:00403C84  89459C              MOV       [EBP-64],EAX              
:00403C87  F645D001            TEST      BYTE PTR [EBP-30],01      
:00403C8B  7406                JZ        00403C93                  
:00403C8D  0FB745D4            MOVZX     EAX,WORD PTR [EBP-2C]     
:00403C91  EB03                JMP       00403C96                  
:00403C93  6A0A                PUSH      0A                        
:00403C95  58                  POP       EAX                       
:00403C96  50                  PUSH      EAX                       
:00403C97  FF759C              PUSH      DWORD PTR [EBP-64]        
:00403C9A  56                  PUSH      ESI                       
:00403C9B  56                  PUSH      ESI                       
:00403C9C  FF15B8804000        CALL      [KERNEL32!GetModuleHandleA]
:00403CA2  50                  PUSH      EAX
:00403CA3  E838E7FFFF          CALL      004023E0


et en remontant un peu on trouve l'entry point...bon je vous avoue que cette technique marchera pas toujours mais en étant un ptit peu malin c'est rapide :)
Il n'y a plus qu'à passer dans le PE-editor de ProcDump, et on met le bon EOP...
ici par exemple on met 3BDA (3BDA+400000=403BDA :))
Voila si PEshield vous embêtait vraiment, on peut dire que c'est finie :))

Coup fatal!
Titandestuts vacille, et s'écrase!

Davidroidelasm vainqueur par KO!

J'espère que vous aurez appris un ou deux trucs dans ce ptit manuel pour pe-shield...
Si vous voulez des précisions sur pourquoi le mov [eax+50],ebx est un anti-procdump, etc... mailez moi je vous répondrais....

Pulsar (David)
Christal (Goliath)
Janvier 2000

Greetz to:
Christal,Alsindor,Frog's Print,Spath,Acid_Burn,Stone,G-ROM,Elraizer,DXP,Fravia,ShroOm,Iczelion,ArseniK,Lucifer48,DXP,Nody,TeeJi,
TaMaMBoLo,TaiefOon,...and the others i've forgotten :)

Vous pouvez me joindre si vous avez des questions (ou si vous avez des sources asm a partager :))
pulsar_c@geocities.com UIN:13411849