depack.cod

来自「一些初级的网络编程」· COD 代码 · 共 587 行

COD
587
字号
	TITLE	C:\Documents and Settings\Administrator\桌面\病毒原理\加壳\bambam004_source\Stub\depack.c
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
;	COMDAT _aP_getbit
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _aP_getgamma
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _aP_depack
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC	_aP_depack
;	COMDAT _aP_depack
_TEXT	SEGMENT
_source$ = 8
_destination$ = 12
_ud$ = -20
_offs$ = 8
_R0$ = 8
_done$ = -4
_aP_depack PROC NEAR					; COMDAT

; 54   : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp
  00003	83 ec 14	 sub	 esp, 20			; 00000014H

; 55   :     APDEPACKDATA ud;
; 56   :     unsigned int offs, len, R0, LWM;
; 57   :     int done;
; 58   :     int i;
; 59   : 
; 60   :     ud.source = (const unsigned char *) source;
; 61   :     ud.destination = (unsigned char *) destination;
; 62   :     ud.bitcount = 0;
; 63   : 
; 64   :     LWM = 0;
; 65   :     done = 0;
; 66   : 
; 67   :     /* first byte verbatim */
; 68   :     *ud.destination++ = *ud.source++;

  00006	8b 55 08	 mov	 edx, DWORD PTR _source$[ebp]
  00009	53		 push	 ebx
  0000a	56		 push	 esi
  0000b	8b 4d f4	 mov	 ecx, DWORD PTR _ud$[ebp+8]
  0000e	8a 02		 mov	 al, BYTE PTR [edx]
  00010	57		 push	 edi
  00011	8b 7d 0c	 mov	 edi, DWORD PTR _destination$[ebp]
  00014	33 db		 xor	 ebx, ebx
  00016	33 f6		 xor	 esi, esi
  00018	89 5d fc	 mov	 DWORD PTR _done$[ebp], ebx
  0001b	88 07		 mov	 BYTE PTR [edi], al
  0001d	47		 inc	 edi
  0001e	89 7d f0	 mov	 DWORD PTR _ud$[ebp+4], edi
  00021	42		 inc	 edx
$L128:

; 72   :     {
; 73   :         if (aP_getbit(&ud))

  00022	8b c6		 mov	 eax, esi
  00024	4e		 dec	 esi
  00025	85 c0		 test	 eax, eax
  00027	75 0a		 jne	 SHORT $L169
  00029	33 c9		 xor	 ecx, ecx
  0002b	be 07 00 00 00	 mov	 esi, 7
  00030	8a 0a		 mov	 cl, BYTE PTR [edx]
  00032	42		 inc	 edx
$L169:
  00033	8b c1		 mov	 eax, ecx
  00035	c1 e8 07	 shr	 eax, 7
  00038	83 e0 01	 and	 eax, 1
  0003b	d1 e1		 shl	 ecx, 1
  0003d	85 c0		 test	 eax, eax
  0003f	0f 84 3b 02 00
	00		 je	 $L130

; 74   :         {
; 75   :             if (aP_getbit(&ud))

  00045	8b c6		 mov	 eax, esi
  00047	4e		 dec	 esi
  00048	85 c0		 test	 eax, eax
  0004a	75 0a		 jne	 SHORT $L174
  0004c	33 c9		 xor	 ecx, ecx
  0004e	be 07 00 00 00	 mov	 esi, 7
  00053	8a 0a		 mov	 cl, BYTE PTR [edx]
  00055	42		 inc	 edx
$L174:
  00056	8b c1		 mov	 eax, ecx
  00058	c1 e8 07	 shr	 eax, 7
  0005b	83 e0 01	 and	 eax, 1
  0005e	d1 e1		 shl	 ecx, 1
  00060	85 c0		 test	 eax, eax
  00062	0f 84 c3 00 00
	00		 je	 $L131

; 76   :             {
; 77   :                 if (aP_getbit(&ud))

  00068	8b c6		 mov	 eax, esi
  0006a	4e		 dec	 esi
  0006b	85 c0		 test	 eax, eax
  0006d	75 0a		 jne	 SHORT $L179
  0006f	33 c9		 xor	 ecx, ecx
  00071	be 07 00 00 00	 mov	 esi, 7
  00076	8a 0a		 mov	 cl, BYTE PTR [edx]
  00078	42		 inc	 edx
$L179:
  00079	8b c1		 mov	 eax, ecx
  0007b	c1 e8 07	 shr	 eax, 7
  0007e	83 e0 01	 and	 eax, 1
  00081	d1 e1		 shl	 ecx, 1
  00083	85 c0		 test	 eax, eax
  00085	74 50		 je	 SHORT $L132

; 78   :                 {
; 79   :                     offs = 0;

  00087	33 c0		 xor	 eax, eax
  00089	bb 04 00 00 00	 mov	 ebx, 4
$L133:

; 80   : 
; 81   :                     for (i = 4; i; i--) offs = (offs << 1) + aP_getbit(&ud);

  0008e	8b fe		 mov	 edi, esi
  00090	4e		 dec	 esi
  00091	85 ff		 test	 edi, edi
  00093	75 0a		 jne	 SHORT $L184
  00095	33 c9		 xor	 ecx, ecx
  00097	be 07 00 00 00	 mov	 esi, 7
  0009c	8a 0a		 mov	 cl, BYTE PTR [edx]
  0009e	42		 inc	 edx
$L184:
  0009f	8b f9		 mov	 edi, ecx
  000a1	c1 ef 07	 shr	 edi, 7
  000a4	83 e7 01	 and	 edi, 1
  000a7	d1 e1		 shl	 ecx, 1
  000a9	4b		 dec	 ebx
  000aa	8d 04 47	 lea	 eax, DWORD PTR [edi+eax*2]
  000ad	75 df		 jne	 SHORT $L133

; 82   : 
; 83   :                     if (offs)

  000af	85 c0		 test	 eax, eax
  000b1	74 15		 je	 SHORT $L136

; 84   :                     {
; 85   :                         *ud.destination = *(ud.destination - offs);

  000b3	8b 7d f0	 mov	 edi, DWORD PTR _ud$[ebp+4]
  000b6	8b df		 mov	 ebx, edi
  000b8	2b d8		 sub	 ebx, eax

; 86   :                         ud.destination++;

  000ba	47		 inc	 edi
  000bb	89 7d f0	 mov	 DWORD PTR _ud$[ebp+4], edi
  000be	8a 03		 mov	 al, BYTE PTR [ebx]
  000c0	88 47 ff	 mov	 BYTE PTR [edi-1], al

; 87   :                     } else {

  000c3	e9 c4 01 00 00	 jmp	 $L137
$L136:

; 88   :                         *ud.destination++ = 0x00;

  000c8	8b 45 f0	 mov	 eax, DWORD PTR _ud$[ebp+4]
  000cb	c6 00 00	 mov	 BYTE PTR [eax], 0
  000ce	40		 inc	 eax
  000cf	89 45 f0	 mov	 DWORD PTR _ud$[ebp+4], eax

; 89   :                     }
; 90   : 
; 91   :                     LWM = 0;
; 92   : 
; 93   :                 } else {

  000d2	e9 b5 01 00 00	 jmp	 $L137
$L132:

; 94   : 
; 95   :                     offs = *ud.source++;

  000d7	33 c0		 xor	 eax, eax
  000d9	8a 02		 mov	 al, BYTE PTR [edx]
  000db	42		 inc	 edx

; 96   : 
; 97   :                     len = 2 + (offs & 0x0001);

  000dc	8b f8		 mov	 edi, eax
  000de	83 e7 01	 and	 edi, 1
  000e1	83 c7 02	 add	 edi, 2

; 98   : 
; 99   :                     offs >>= 1;

  000e4	d1 e8		 shr	 eax, 1

; 100  : 
; 101  :                     if (offs)

  000e6	74 2f		 je	 SHORT $L139

; 102  :                     {
; 103  :                         for (; len; len--)

  000e8	85 ff		 test	 edi, edi
  000ea	74 32		 je	 SHORT $L143
  000ec	89 7d 08	 mov	 DWORD PTR 8+[ebp], edi
$L140:

; 104  :                         {
; 105  :                             *ud.destination = *(ud.destination - offs);

  000ef	8b 7d f0	 mov	 edi, DWORD PTR _ud$[ebp+4]
  000f2	2b f8		 sub	 edi, eax
  000f4	8a 1f		 mov	 bl, BYTE PTR [edi]
  000f6	8b 7d f0	 mov	 edi, DWORD PTR _ud$[ebp+4]
  000f9	88 1f		 mov	 BYTE PTR [edi], bl

; 106  :                             ud.destination++;

  000fb	8b df		 mov	 ebx, edi
  000fd	8b 7d 08	 mov	 edi, DWORD PTR 8+[ebp]
  00100	43		 inc	 ebx
  00101	4f		 dec	 edi
  00102	89 5d f0	 mov	 DWORD PTR _ud$[ebp+4], ebx
  00105	89 7d 08	 mov	 DWORD PTR 8+[ebp], edi
  00108	75 e5		 jne	 SHORT $L140

; 109  : 
; 110  :                     R0 = offs;

  0010a	89 45 08	 mov	 DWORD PTR _R0$[ebp], eax

; 111  :                     LWM = 1;

  0010d	bb 01 00 00 00	 mov	 ebx, 1

; 112  :                 }
; 113  : 
; 114  :             } else {

  00112	e9 77 01 00 00	 jmp	 $L158
$L139:

; 107  :                         }
; 108  :                     } else done = 1;

  00117	c7 45 fc 01 00
	00 00		 mov	 DWORD PTR _done$[ebp], 1
$L143:

; 109  : 
; 110  :                     R0 = offs;

  0011e	89 45 08	 mov	 DWORD PTR _R0$[ebp], eax

; 111  :                     LWM = 1;

  00121	bb 01 00 00 00	 mov	 ebx, 1

; 112  :                 }
; 113  : 
; 114  :             } else {

  00126	e9 63 01 00 00	 jmp	 $L158
$L131:

; 115  : 
; 116  :                 offs = aP_getgamma(&ud);

  0012b	b8 01 00 00 00	 mov	 eax, 1
$L199:
  00130	8b fe		 mov	 edi, esi
  00132	4e		 dec	 esi
  00133	85 ff		 test	 edi, edi
  00135	75 0a		 jne	 SHORT $L205
  00137	33 c9		 xor	 ecx, ecx
  00139	be 07 00 00 00	 mov	 esi, 7
  0013e	8a 0a		 mov	 cl, BYTE PTR [edx]
  00140	42		 inc	 edx
$L205:
  00141	8b f9		 mov	 edi, ecx
  00143	c1 ef 07	 shr	 edi, 7
  00146	83 e7 01	 and	 edi, 1
  00149	d1 e1		 shl	 ecx, 1
  0014b	8d 04 47	 lea	 eax, DWORD PTR [edi+eax*2]
  0014e	8b fe		 mov	 edi, esi
  00150	4e		 dec	 esi
  00151	85 ff		 test	 edi, edi
  00153	75 0a		 jne	 SHORT $L209
  00155	33 c9		 xor	 ecx, ecx
  00157	be 07 00 00 00	 mov	 esi, 7
  0015c	8a 0a		 mov	 cl, BYTE PTR [edx]
  0015e	42		 inc	 edx
$L209:
  0015f	8b f9		 mov	 edi, ecx
  00161	c1 ef 07	 shr	 edi, 7
  00164	83 e7 01	 and	 edi, 1
  00167	d1 e1		 shl	 ecx, 1
  00169	85 ff		 test	 edi, edi
  0016b	75 c3		 jne	 SHORT $L199

; 117  : 
; 118  :                 if ((LWM == 0) && (offs == 2))

  0016d	85 db		 test	 ebx, ebx
  0016f	75 72		 jne	 SHORT $L150
  00171	83 f8 02	 cmp	 eax, 2
  00174	75 68		 jne	 SHORT $L273

; 119  :                 {
; 120  :                     offs = R0;
; 121  : 
; 122  :                     len = aP_getgamma(&ud);

  00176	b8 01 00 00 00	 mov	 eax, 1
$L224:
  0017b	8b fe		 mov	 edi, esi
  0017d	4e		 dec	 esi
  0017e	85 ff		 test	 edi, edi
  00180	75 0a		 jne	 SHORT $L230
  00182	33 c9		 xor	 ecx, ecx
  00184	be 07 00 00 00	 mov	 esi, 7
  00189	8a 0a		 mov	 cl, BYTE PTR [edx]
  0018b	42		 inc	 edx
$L230:
  0018c	8b f9		 mov	 edi, ecx
  0018e	c1 ef 07	 shr	 edi, 7
  00191	83 e7 01	 and	 edi, 1
  00194	d1 e1		 shl	 ecx, 1
  00196	8d 04 47	 lea	 eax, DWORD PTR [edi+eax*2]
  00199	8b fe		 mov	 edi, esi
  0019b	4e		 dec	 esi
  0019c	85 ff		 test	 edi, edi
  0019e	75 0a		 jne	 SHORT $L234
  001a0	33 c9		 xor	 ecx, ecx
  001a2	be 07 00 00 00	 mov	 esi, 7
  001a7	8a 0a		 mov	 cl, BYTE PTR [edx]
  001a9	42		 inc	 edx
$L234:
  001aa	8b f9		 mov	 edi, ecx
  001ac	c1 ef 07	 shr	 edi, 7
  001af	83 e7 01	 and	 edi, 1
  001b2	d1 e1		 shl	 ecx, 1
  001b4	85 ff		 test	 edi, edi
  001b6	75 c3		 jne	 SHORT $L224

; 123  : 
; 124  :                     for (; len; len--)

  001b8	85 c0		 test	 eax, eax
  001ba	0f 84 b9 00 00
	00		 je	 $L149
$L146:

; 125  :                     {
; 126  :                         *ud.destination = *(ud.destination - offs);

  001c0	8b 7d f0	 mov	 edi, DWORD PTR _ud$[ebp+4]
  001c3	8b df		 mov	 ebx, edi
  001c5	2b 5d 08	 sub	 ebx, DWORD PTR _R0$[ebp]

; 127  :                         ud.destination++;

  001c8	47		 inc	 edi
  001c9	48		 dec	 eax
  001ca	89 7d f0	 mov	 DWORD PTR _ud$[ebp+4], edi
  001cd	8a 1b		 mov	 bl, BYTE PTR [ebx]
  001cf	88 5f ff	 mov	 BYTE PTR [edi-1], bl
  001d2	75 ec		 jne	 SHORT $L146

; 150  :                 }
; 151  : 
; 152  :                 LWM = 1;

  001d4	bb 01 00 00 00	 mov	 ebx, 1

; 153  :             }
; 154  : 
; 155  :         } else {

  001d9	e9 b0 00 00 00	 jmp	 $L158
$L273:

; 128  :                     }
; 129  : 
; 130  :                 } else {
; 131  : 
; 132  :                     if (LWM == 0) offs -= 3; else offs -= 2;

  001de	8d 78 fd	 lea	 edi, DWORD PTR [eax-3]
  001e1	eb 03		 jmp	 SHORT $L151
$L150:
  001e3	8d 78 fe	 lea	 edi, DWORD PTR [eax-2]
$L151:

; 133  : 
; 134  :                     offs <<= 8;
; 135  :                     offs += *ud.source++;

  001e6	33 c0		 xor	 eax, eax
  001e8	8a 02		 mov	 al, BYTE PTR [edx]
  001ea	c1 e7 08	 shl	 edi, 8
  001ed	03 f8		 add	 edi, eax
  001ef	42		 inc	 edx
  001f0	89 7d 08	 mov	 DWORD PTR _offs$[ebp], edi

; 136  : 
; 137  :                     len = aP_getgamma(&ud);

  001f3	b8 01 00 00 00	 mov	 eax, 1
$L249:
  001f8	8b fe		 mov	 edi, esi
  001fa	4e		 dec	 esi
  001fb	85 ff		 test	 edi, edi
  001fd	75 0a		 jne	 SHORT $L255
  001ff	33 c9		 xor	 ecx, ecx
  00201	be 07 00 00 00	 mov	 esi, 7
  00206	8a 0a		 mov	 cl, BYTE PTR [edx]
  00208	42		 inc	 edx
$L255:
  00209	8b f9		 mov	 edi, ecx
  0020b	c1 ef 07	 shr	 edi, 7
  0020e	83 e7 01	 and	 edi, 1
  00211	d1 e1		 shl	 ecx, 1
  00213	8d 04 47	 lea	 eax, DWORD PTR [edi+eax*2]
  00216	8b fe		 mov	 edi, esi
  00218	4e		 dec	 esi
  00219	85 ff		 test	 edi, edi
  0021b	75 0a		 jne	 SHORT $L259
  0021d	33 c9		 xor	 ecx, ecx
  0021f	be 07 00 00 00	 mov	 esi, 7
  00224	8a 0a		 mov	 cl, BYTE PTR [edx]
  00226	42		 inc	 edx
$L259:
  00227	8b f9		 mov	 edi, ecx
  00229	c1 ef 07	 shr	 edi, 7
  0022c	83 e7 01	 and	 edi, 1
  0022f	d1 e1		 shl	 ecx, 1
  00231	85 ff		 test	 edi, edi
  00233	75 c3		 jne	 SHORT $L249

; 138  : 
; 139  :                     if (offs >= 32000) len++;

  00235	81 7d 08 00 7d
	00 00		 cmp	 DWORD PTR _offs$[ebp], 32000 ; 00007d00H
  0023c	72 01		 jb	 SHORT $L152
  0023e	40		 inc	 eax
$L152:

; 140  :                     if (offs >= 1280) len++;

  0023f	8b 7d 08	 mov	 edi, DWORD PTR _offs$[ebp]
  00242	81 ff 00 05 00
	00		 cmp	 edi, 1280		; 00000500H
  00248	72 01		 jb	 SHORT $L153
  0024a	40		 inc	 eax
$L153:

; 141  :                     if (offs < 128) len += 2;

  0024b	81 ff 80 00 00
	00		 cmp	 edi, 128		; 00000080H
  00251	73 03		 jae	 SHORT $L154
  00253	83 c0 02	 add	 eax, 2
$L154:

; 142  : 
; 143  :                     for (; len; len--)

  00256	85 c0		 test	 eax, eax
  00258	74 1c		 je	 SHORT $L157
  0025a	89 45 08	 mov	 DWORD PTR 8+[ebp], eax
$L155:

; 144  :                     {
; 145  :                         *ud.destination = *(ud.destination - offs);

  0025d	8b 45 f0	 mov	 eax, DWORD PTR _ud$[ebp+4]
  00260	8b d8		 mov	 ebx, eax
  00262	2b df		 sub	 ebx, edi

; 146  :                         ud.destination++;

  00264	40		 inc	 eax
  00265	89 45 f0	 mov	 DWORD PTR _ud$[ebp+4], eax
  00268	8a 1b		 mov	 bl, BYTE PTR [ebx]
  0026a	88 58 ff	 mov	 BYTE PTR [eax-1], bl
  0026d	8b 45 08	 mov	 eax, DWORD PTR 8+[ebp]
  00270	48		 dec	 eax
  00271	89 45 08	 mov	 DWORD PTR 8+[ebp], eax
  00274	75 e7		 jne	 SHORT $L155
$L157:

; 147  :                     }
; 148  : 
; 149  :                     R0 = offs;

  00276	89 7d 08	 mov	 DWORD PTR _R0$[ebp], edi
$L149:

; 150  :                 }
; 151  : 
; 152  :                 LWM = 1;

  00279	bb 01 00 00 00	 mov	 ebx, 1

; 153  :             }
; 154  : 
; 155  :         } else {

  0027e	eb 0e		 jmp	 SHORT $L158
$L130:

; 156  : 
; 157  :             *ud.destination++ = *ud.source++;

  00280	8b 7d f0	 mov	 edi, DWORD PTR _ud$[ebp+4]
  00283	8a 02		 mov	 al, BYTE PTR [edx]
  00285	88 07		 mov	 BYTE PTR [edi], al
  00287	47		 inc	 edi
  00288	89 7d f0	 mov	 DWORD PTR _ud$[ebp+4], edi
  0028b	42		 inc	 edx
$L137:

; 158  :             LWM = 0;

  0028c	33 db		 xor	 ebx, ebx
$L158:

; 69   : 
; 70   :     /* main decompression loop */
; 71   :     while (!done)

  0028e	8b 45 fc	 mov	 eax, DWORD PTR _done$[ebp]
  00291	85 c0		 test	 eax, eax
  00293	0f 84 89 fd ff
	ff		 je	 $L128

; 159  :         }
; 160  :     }
; 161  : 
; 162  :     return ud.destination - (unsigned char *) destination;

  00299	8b 45 f0	 mov	 eax, DWORD PTR _ud$[ebp+4]
  0029c	8b 4d 0c	 mov	 ecx, DWORD PTR _destination$[ebp]
  0029f	5f		 pop	 edi
  002a0	5e		 pop	 esi
  002a1	2b c1		 sub	 eax, ecx
  002a3	5b		 pop	 ebx

; 163  : }

  002a4	8b e5		 mov	 esp, ebp
  002a6	5d		 pop	 ebp
  002a7	c3		 ret	 0
_aP_depack ENDP
_TEXT	ENDS
END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?