Differentes
techniques de compression:
| PKLITE 1.20 (COM File) |
0100 B8BDE2 MOV AX,E2BD 0103 BA2284 MOV DX,8422 0106 3BC4 CMP AX,SP 0108 7367 JNB 0171 010A 8BC4 MOV AX,SP 010C 2D4403 SUB AX,0344 010F 25F0FF AND AX,FFF0 0112 8BF8 MOV DI,AX 0114 B9A200 MOV CX,00A2 0117 BE7C01 MOV SI,017C 011A FC CLD 011B F3 REPZ 011C A5 MOVSW 011D 8BD8 MOV BX,AX 011F B104 MOV CL,04 0121 D3EB SHR BX,CL 0123 8CD9 MOV CX,DS 0125 03D9 ADD BX,CX 0127 53 PUSH BX 0128 33DB XOR BX,BX 012A 53 PUSH BX 012B CB RETF > Instruction RETF 012C 0C01 OR AL,01 012E 50 PUSH AX 012F 4B DEC BX 0130 4C DEC SP 0134 20436F AND [BP+DI+6F],AL 0137 7072 JO 01AB 0139 2E CS: |
| LZEXE 0.91 (EXE File) |
000F 0E PUSH CS 0010 1F POP DS 0011 8B0E0C00 MOV CX,[000C] 0015 8BF1 MOV SI,CX 0017 4E DEC SI 0018 89F7 MOV DI,SI 001A 8CDB MOV BX,DS 001C 031E0A00 ADD BX,[000A] 0020 8EC3 MOV ES,BX 0022 FD STD 0023 F3 REPZ 0024 A4 MOVSB 0025 53 PUSH BX 0026 B82B00 MOV AX,002B 0029 50 PUSH AX 002A CB RETF > Instruction RETF 002B 2E CS: 002C 8B2E0800 MOV BP,[0008] |
| EXEPACK (EXE File) |
0010 8BE8 MOV BP,AX 0012 8CC0 MOV AX,ES 0014 051000 ADD AX,0010 0017 0E PUSH CS 0018 1F POP DS 0019 A30400 MOV [0004],AX 001C 03060C00 ADD AX,[000C] 0020 8EC0 MOV ES,AX 0022 8B0E0600 MOV CX,[0006] 0026 8BF9 MOV DI,CX 0028 4F DEC DI 0029 8BF7 MOV SI,DI 002B FD STD 002C F3 REPZ 002D A4 MOVSB 002E 50 PUSH AX 002F B83400 MOV AX,0034 0032 50 PUSH AX 0033 CB RETF > Instruction RETF 0034 8CC3 MOV BX,ES 0036 8CD8 MOV AX,DS 0038 48 DEC AX 0039 8ED8 MOV DS,AX |
* Notez l'instruction RETF. Cette instruction est rencontrée au début de codess comme ceux ci, et indiquent presque toujours que le fichier est compressé.
| DIET 1.10a (COM File) |
0100 BE5409 MOV SI,0954 0103 BFDC13 MOV DI,13DC 0106 B91404 MOV CX,0414 0109 3BFC CMP DI,SP 010B 7204 JB 0111 010D B44C MOV AH,4C 010F CD21 INT 21 > ici 0111 FD STD 0112 F3 REPZ 0113 A5 MOVSW 0114 FC CLD 0115 8BF7 MOV SI,DI 0117 BF0001 MOV DI,0100 011A AD LODSW 011B AD LODSW 011C 8BE8 MOV BP,AX 011E B210 MOV DL,10 0120 E96D12 JMP 1390 |
| D'autres méthodes de compression (EXE File) |
000C 8CD3 MOV BX,SS 000E 8EC3 MOV ES,BX 0010 8CCA MOV DX,CS 0012 8EDA MOV DS,DX 0014 8B0E0800 MOV CX,[0008] 0018 8BF1 MOV SI,CX 001A 83EE02 SUB SI,+02 001D 8BFE MOV DI,SI 001F D1E9 SHR CX,1 0021 FD STD 0022 F3 REPZ 0023 A5 MOVSW 0024 53 PUSH BX 0025 B82E00 MOV AX,002E 0028 50 PUSH AX 0029 8B2E0A00 MOV BP,[000A] 002D CB RETF > Instruction RETF 002E B80010 MOV AX,1000 0031 3BC5 CMP AX,BP 0033 7602 JBE 0037 0035 8BC5 MOV AX,BP 0037 2BE8 SUB BP,AX 0039 2BD0 SUB DX,AX 003B 2BD8 SUB BX,AX 003D 8EDA MOV DS,DX 003F 8EC3 MOV ES,BX 0041 B103 MOV CL,03 0043 D3E0 SHL AX,CL 0045 8BC8 MOV CX,AX 0047 D1E0 SHL AX,1 0049 48 DEC AX 004A 48 DEC AX 004B 8BF0 MOV SI,AX 004D 8BF8 MOV DI,AX 004F F3 REPZ 0050 A5 MOVSW 0051 0BED OR BP,BP 0053 75D9 JNZ 002E 0055 FC CLD 0056 8EC2 MOV ES,DX 0058 8EDB MOV DS,BX |
Voici qui devrait vous donner une idée de la manière dont les compresseurs
fonctionnent.
La première chose à faire, quand on rencontre une instruction RETF, et de tracer autour. Egalement
significatifs, vous avez les PUSHAD (sauvegarde de l'état des registres), les POPAD (restauration des registres,
que l'on trouve en général avant que le compresseur passe le relais), et les REPZ MOVSB qui "traitent"
la zone à décompresser. Vous ne trouverez souvent qu'un seul RETF dans le programme, par contre,
dans la partie compressée, l'algorithme utilisé peut avoir généré des codes
qui seront assimilé à des opcodes, et une recherche dans le Dead Listing doit être fait avec
prudence, sans sauter aux conclusions hâtives. L'étape suivante est simple, Une fois le RETF trouvé,
partez à la rechercher de l'instruction qui va brancher sur l'Entry point du programme d'origine, du genre:
JMP FAR [BX]
Call EAX
Push EAX/RET etc...
Rappelez vous qu'un fichier peut avoir été compressé plusieurs fois, et par des compresseurs
différents. Vous trouverez alors plusieurs signatures significatives d'une compression.