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 + -
显示快捷键?