Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void unpack_file(char* data_in, char* data_out)
- {
- __asm {
- mov esi, data_in //pointer for pack body
- mov edi, data_out //pointer for unpack body
- cld
- mov dl, 0x80
- loop99: mov al, byte ptr ds : [esi]
- inc esi
- mov byte ptr ds : [edi], al
- inc edi
- loop111 : add dl, dl
- jne loop1
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop1 : jae loop99
- add dl, dl
- jne loop2
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop2 : jae loop3
- xor eax, eax
- add dl, dl
- jne loop4
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop4 : jae loop5
- add dl, dl
- jne loop6
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop6 : adc eax, eax
- add dl, dl
- jne loop7
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop7 : adc eax, eax
- add dl, dl
- jne loop8
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop8 : adc eax, eax
- add dl, dl
- jne loop10
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop10 : adc eax, eax
- je loop11
- push edi
- sub edi, eax
- mov al, byte ptr ds : [edi]
- pop edi
- loop11 : mov byte ptr ds : [edi], al
- inc edi
- jmp loop111
- loop3 : mov eax, 1
- loop23 : add dl, dl
- jne loop25
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop25 : adc eax, eax
- add dl, dl
- jne loop24
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop24 : jb loop23
- sub eax, 2
- jne loop22
- mov ecx, 1
- loop19 : add dl, dl
- jne loop21
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop21 : adc ecx, ecx
- add dl, dl
- jne loop20
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop20 : jb loop19
- push esi
- mov esi, edi
- sub esi, ebp
- rep movsb
- pop esi
- jmp loop111
- loop22 : dec eax
- shl eax, 8
- mov al, byte ptr ds : [esi]
- inc esi
- mov ebp, eax
- mov ecx, 1
- loop15 : add dl, dl
- jne loop16
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop16 : adc ecx, ecx
- add dl, dl
- jne loop17
- mov dl, byte ptr ds : [esi]
- inc esi
- adc dl, dl
- loop17 : jb loop15
- cmp eax, 0x7D00
- jae loop18
- cmp eax, 0x500
- jb loop12
- inc ecx
- push esi
- mov esi, edi
- sub esi, eax
- rep movsb
- pop esi
- jmp loop111
- loop12 : cmp eax, 0x7F
- ja loop13
- loop18 : add ecx, 2
- loop13 : push esi
- mov esi, edi
- sub esi, eax
- rep movsb
- pop esi
- jmp loop111
- loop5 : mov al, byte ptr ds : [esi]
- inc esi
- xor ecx, ecx
- shr al, 1
- je loop14
- adc ecx, 2
- mov ebp, eax
- push esi
- mov esi, edi
- sub esi, eax
- rep movsb
- loop1001 : pop esi
- jmp loop111
- loop14 : sub edi, dword ptr ss : [esp + 28]
- mov dword ptr ss : [esp + 0x1C], edi
- };
- }
- int main(int argc, char** argv)
- {
- std::ifstream file(argv[1], std::ios_base::in | std::ios_base::binary);
- if (!file)
- return -1;
- file.seekg(0, SEEK_END);
- int size = file.tellg();
- file.seekg(0, SEEK_SET);
- char* data = new char[size];
- file.read(&data[0], size);
- char* unpacked = new char[0x410];
- unpack_file(data, unpacked);
- std::ofstream out("out");
- out.write(unpacked, 0x410);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement