ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[AVP4SRU.CPP]ÄÄÄ #include #include #include #include #include #include #pragma hdrstop extern "C" void __cdecl decrypt(void* xz_struct, BYTE* data_ptr, DWORD data_size); #include "unpack.cpp" BYTE tmp[65536]; void main(int argc, char* argv[]) { if (argc!=2) { printf("AVP4SRU - Secret Resources Unpacker - (x) 2001 - right toolz for the right job\n\n"); printf("syntax:\n AVP4SRU avpfile.exe/dll/ppl/klr\n"); return; } FILE*f=fopen(argv[1],"rb"); assert(f); DWORD len = filelength(fileno(f)); BYTE* buf = new BYTE[ len+65536 ]; BYTE* buf2 = new BYTE[ len+65536 ]; assert(fread(buf,1,len,f)==len); fclose(f); f = NULL; DWORD offs=0, count=0; for(;;) // for each KLsw4000 { for(;;) { if (buf[offs+0]=='K') if (buf[offs+1]=='L') if (buf[offs+2]=='s') if (buf[offs+3]=='w') if (buf[offs+4]==4) if (buf[offs+5]==0) if (buf[offs+6]==0) if (buf[offs+7]==0) { offs += 8; break; } offs++; if (offs>=len) break; } if (offs>=len) break; DWORD size = len - offs; struct xz_stuct { DWORD key; DWORD size; } xz; xz.key = 0; xz.size = 0; memcpy(buf2,buf,len+65536); decrypt((void*)&xz, &buf2[offs], size); //f=fopen("_decr","wb"); //assert(f); //assert(fwrite(&buf2[offs],1,size,f)==size); //fclose(f); #define DELTA 0x1E memset(tmp,0,sizeof(tmp)); DWORD usize = unpack((void*)&buf2[offs+DELTA],(void*)&tmp[0],size,sizeof(tmp)); DWORD psize = __nextBYTEptr - (DWORD)&buf2[offs+DELTA]; char s[260]; strcpy(s, argv[1]); if (strchr(s,'.')) *strchr(s,'.')=0; strcat(s,".sru"); printf("%s[%08X]-->%s, %i-->%i\n", argv[1], offs-8, s, psize, usize); if (f==NULL) { f=fopen(s,"wb"); assert(f); } assert(fwrite(&tmp[0],1,usize,f)==usize); count++; offs += psize; }//main cycle if (f!=NULL) fclose(f); if (count==0) printf("ERROR:no KLsw\\x04\\x00\\x00\\x00 signature found\n"); /* DWORD i=0x13; for(;;) { DWORD a = *(DWORD*)&tmp[i]; i+=4; printf("type=%08X ",a); if ((a&0xFF)==0xFF) { printf("end\n"); break; } else if ( (a==0x09000001) || ((a>>24)==0x01) ) { printf("\n"); } else if ((a>>24)==0x00) { WORD v = *(WORD*)&tmp[i]; i+=2; printf("w=%04X\n", v); } else if ( ((a>>24)==0x0A) || ((a>>24)==0x08) ) { BYTE v = *(BYTE*)&tmp[i]; i+=1; printf("b=%02X\n", v); } else if ((a>>24)==0x09) { DWORD v = *(DWORD*)&tmp[i]; i+=4; printf("d=%08X\n", v); } else if ((a>>24)==0x0B) { DWORD v1 = *(DWORD*)&tmp[i]; i+=4; DWORD v2 = *(DWORD*)&tmp[i]; i+=4; printf("d1=%08X d2=%08X\n", v1,v2); } else if ((a>>24)==0x28) { DWORD c = *(WORD*)&tmp[i]; i+=2; printf("c=%04X",c); if (c!=0xFFFF) { printf(" str=["); while (c--) printf("%c", tmp[i++]); printf("]"); } printf("\n"); } else { printf("ERROR:unknown id\n"); exit(0); } if (i>=usize) break; } */ }//main ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[AVP4SRU.CPP]ÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[DECRYPT.ASM]ÄÄÄ .386 .model flat .code public decrypt public _decrypt _decrypt: decrypt proc near ; CODE XREF: .text:00434D05p ; sub_436410+11Ap xor_key = dword ptr -8 xz_ptr = dword ptr 4 data_ptr = dword ptr 8 data_size = dword ptr 0Ch sub esp, 8 push ebx mov ebx, [esp+0Ch+xz_ptr] push ebp push esi mov eax, [ebx] push edi test eax, eax mov ebp, 1 jz short loc_436D7D mov esi, [eax] mov eax, [eax+4] test eax, eax mov [esp+18h+xor_key], esi jnz short @@for mov ecx, [esp+18h+data_ptr] mov al, byte ptr [esp+18h+xor_key+1] mov dl, [ecx] xor dl, al mov [ecx], dl mov edx, [esp+18h+data_size] dec edx inc ecx mov [esp+18h+data_size], edx jmp short @@cycle ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_436D7D: ; CODE XREF: decrypt+14j mov ecx, [esp+18h+data_ptr] mov word ptr [esp+18h+xor_key], 3B38h mov esi, [esp+18h+xor_key] jmp short @@cycle ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ @@for: ; CODE XREF: decrypt+21j mov ecx, [esp+18h+data_ptr] @@cycle: ; CODE XREF: decrypt+3Bj ; decrypt+4Cj mov edx, [esp+18h+data_size] sar edx, 1 jz short loc_436DCA mov di, word ptr [esp+18h+xor_key] loc_436D9F: ; CODE XREF: decrypt+88j xor [ecx], di and esi, 1 shr di, 1 mov eax, esi mov word ptr [esp+18h+xor_key], di mov esi, [esp+18h+xor_key] add ecx, 2 xor eax, esi shl eax, 0Fh or di, ax dec edx mov word ptr [esp+18h+xor_key], di mov esi, [esp+18h+xor_key] jnz short loc_436D9F loc_436DCA: ; CODE XREF: decrypt+58j mov edi, [esp+18h+data_size] and edi, 80000001h jns short loc_436DDB dec edi or edi, 0FFFFFFFEh inc edi loc_436DDB: ; CODE XREF: decrypt+94j neg edi sbb edi, edi inc edi jnz short loc_436DEC mov dl, byte ptr [esp+18h+xor_key] mov al, [ecx] xor al, dl mov [ecx], al loc_436DEC: ; CODE XREF: decrypt+A0j cmp dword ptr [ebx], 0 jnz short loc_436DFE ; push 8 ; call dword_443988 ; add esp, 4 ; mov [ebx], eax loc_436DFE: ; CODE XREF: decrypt+AFj mov eax, [ebx] test eax, eax jz short loc_436E13 mov [eax], esi mov [eax+4], edi pop edi mov eax, ebp pop esi pop ebp pop ebx add esp, 8 retn ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_436E13: ; CODE XREF: decrypt+C2j pop edi pop esi pop ebp xor eax, eax pop ebx add esp, 8 retn decrypt endp end ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[DECRYPT.ASM]ÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[UNPACK.CPP]ÄÄÄ // taken from AVPX sources DWORD __nextBYTEptr; WORD __bits; BYTE __len; DWORD __maxin; DWORD __maxout; DWORD __cdecl unpack(void* s, void* d, DWORD ssize, DWORD dmax) { asm { mov eax, s mov __nextBYTEptr, eax add eax, ssize mov __maxin, eax mov edi, d mov eax, edi add eax, dmax mov __maxout, eax call __unp sub edi, d xchg edi, eax jmp __quit __unp: call __getBYTE cmp eax, -1 // je __e // push eax call __getBYTE pop ebx cmp eax, -1 // je __e // mov ah, bl xchg ah, al mov __bits, ax mov __len, 16 __loc_0_D20: call __get_bit cmp eax, -1 // je __e // or ax, ax jz __loc_0_D53 call __getBYTE cmp eax, -1 // je __e // mov [edi], al inc edi cmp edi, __maxout jne __loc_0_D20 jmp __e __loc_0_D53: call __get_bit cmp eax, -1 // je __e // or ax, ax jnz __loc_0_D8F call __get_bit cmp eax, -1 // je __e // shl ax, 1 mov si, ax call __get_bit cmp eax, -1 // je __e // or si, ax add si, 2 call __getBYTE cmp eax, -1 // je __e // or ax, 0FF00h mov dx, ax jmp __loc_0_E19 __loc_0_D8F: call __getBYTE cmp eax, -1 // je __e // __loc_0_DAD: mov ah, 0 mov dx, ax call __getBYTE cmp eax, -1 // je __e // mov ah, 0 mov si, ax and ax, 0FFF8h mov cl, 5 shl ax, cl or ax, 0E000h or dx, ax and si, 7 add si, 2 cmp si, 2 jnz __loc_0_E19 call __getBYTE cmp eax, -1 // je __e // __loc_0_E08: mov ah, 0 mov si, ax or si, si jz __e cmp si, 1 jnz __loc_0_E18 jmp __loc_0_D20 __loc_0_E18: inc si __loc_0_E19: movsx edx, dx add edx, edi cmp edx, d // added in AVP_SRU jb __e // cmp edx, __maxout // ja __e // jmp __loc_0_E33 __loc_0_E21: mov ebx, edx mov al, [ebx] mov [edi], al inc edi dec si inc edx cmp edi, __maxout ja __e __loc_0_E33: or si, si jg __loc_0_E21 jmp __loc_0_D20 __e: retn __getBYTE: push ebx mov ebx, __nextBYTEptr cmp ebx, __maxin jae __sucks mov al, [ebx] pop ebx inc __nextBYTEptr retn __sucks: mov eax, -1 pop ebx retn __get_bit: mov dx, __bits and dx, 1 mov al, __len add al, -1 mov __len, al jnz __shr_XXX call __getBYTE cmp eax, -1 // je __e2 // push ax call __getBYTE pop bx cmp eax, -1 // je __e2 // mov ah, bl xchg ah, al mov __bits, ax mov __len, 16 jmp __c1 __shr_XXX: shr __bits, 1 __c1: mov ax, dx retn __e2: mov eax, -1 retn __quit: } return _EAX; }//unpack() ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[UNPACK.CPP]ÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MAKE.BAT]ÄÄÄ @echo off bcc32.exe -lap -5 -C -pr -ff -O2 avp4sru.cpp decrypt.asm del avp4sru.tds del avp4sru.obj del decrypt.obj move avp4sru.exe .. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MAKE.BAT]ÄÄÄ