; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/none @ 0x464fd0 */ | #include | ; (fcn) sym._anonymous_namespace_::u::Md5ChecksumAlgorithm::operator___void_const__unsigned_long_ () | uint64_t anonymous_namespace_::u::Md5ChecksumAlgorithm::operator_void_const_unsigned_long_ (int64_t arg3, uint32_t arg2, int64_t arg1) { | uint32_t var_8h; | void * s1; | int64_t var_20h; | int64_t var_30h; | int64_t var_40h; | int64_t var_50h; | void * var_58h; | uint32_t var_60h; | int64_t var_70h; | int64_t var_80h; | int64_t var_90h; | int64_t var_a0h; | int64_t var_b0h; | int64_t var_c0h; | void * s2; | int64_t var_e0h; | int64_t var_f0h; | int64_t var_100h; | int64_t var_110h; | uint32_t var_118h; | int64_t var_120h; | int64_t var_128h; | int64_t var_138h; | int64_t var_148h; | int64_t var_158h; | int64_t var_168h; | int64_t var_170h; | int64_t var_178h; | int64_t var_180h; | int64_t var_190h; | int64_t var_1a0h; | int64_t var_1b0h; | int64_t var_1c0h; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* (anonymous namespace)::u::Md5ChecksumAlgorithm::operator()(void const*, unsigned long) */ 0x00464fd0 push rbp | 0x00464fd1 push r15 | 0x00464fd3 push r14 | 0x00464fd5 push r13 | 0x00464fd7 push r12 | 0x00464fd9 push rbx | 0x00464fda sub rsp, 0x1c8 | 0x00464fe1 mov rbp, rdx | 0x00464fe4 mov r12, rdi | r12 = rdi; 0x00464fe7 lea rax, [rsi + rdx] | rax = rsi + rdx; 0x00464feb xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00464fee movaps xmmword [rsp + 0x100], xmm0 | *((rsp + 0x100)) = xmm0; 0x00464ff6 movaps xmmword [rsp + 0xf0], xmm0 | *((rsp + 0xf0)) = xmm0; 0x00464ffe movaps xmmword [rsp + 0xe0], xmm0 | *((rsp + 0xe0)) = xmm0; 0x00465006 movaps xmmword [rsp + 0xd0], xmm0 | *((rsp + 0xd0)) = xmm0; 0x0046500e mov byte [rsp + 0x110], 0 | *((rsp + 0x110)) = 0; 0x00465016 mov qword [rsp + 0x118], rsi | *((rsp + 0x118)) = rsi; 0x0046501e mov qword [rsp], rax | *(rsp) = rax; 0x00465022 mov qword [rsp + 0x120], rax | *((rsp + 0x120)) = rax; 0x0046502a test rdx, rdx | | if (rdx > 0) { 0x0046502d jle 0x465077 | 0x0046502f mov r14, rsi | r14 = rsi; 0x00465032 cmp rbp, 0x40 | 0x00465036 mov r15d, 0x40 | r15d = 0x40; | if (rbp < 0x40) { 0x0046503c cmovb r15, rbp | r15 = rbp; | } 0x00465040 lea rbx, [rsp + 0xd0] | rbx = rsp + 0xd0; 0x00465048 mov rdi, rbx | 0x0046504b xor esi, esi | 0x0046504d mov rdx, r15 | 0x00465050 call 0x404530 | memset (rbx, 0, r15); 0x00465055 mov byte [rsp + 0x110], r15b | *((rsp + 0x110)) = r15b; 0x0046505d mov rdi, rbx | 0x00465060 mov rsi, r14 | 0x00465063 mov rdx, r15 | 0x00465066 call 0x404d00 | memcpy (rbx, r14, r15); 0x0046506b xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0046506e mov al, byte [rsp + 0x110] | al = *((rsp + 0x110)); 0x00465075 jmp 0x465079 | | } else { 0x00465077 xor eax, eax | eax = 0; | } 0x00465079 lea rcx, [rbp + 0x3f] | rcx = rbp + 0x3f; 0x0046507d test rbp, rbp | 0x00465080 cmovns rcx, rbp | __asm ("cmovns rcx, rbp"); 0x00465084 and rcx, 0xffffffffffffffc0 | rcx &= 0xffffffffffffffc0; 0x00465088 sub rcx, rbp | rcx -= rbp; 0x0046508b mov rdx, qword [rsp] | rdx = *(rsp); 0x0046508f lea rcx, [rdx + rcx + 0x40] | rcx = rdx + rcx + 0x40; 0x00465094 movups xmmword [rsp + 0x158], xmm0 | __asm ("movups xmmword [rsp + 0x158], xmm0"); 0x0046509c movups xmmword [rsp + 0x148], xmm0 | __asm ("movups xmmword [rsp + 0x148], xmm0"); 0x004650a4 movups xmmword [rsp + 0x138], xmm0 | __asm ("movups xmmword [rsp + 0x138], xmm0"); 0x004650ac movups xmmword [rsp + 0x128], xmm0 | __asm ("movups xmmword [rsp + 0x128], xmm0"); 0x004650b4 mov byte [rsp + 0x168], 0 | *((rsp + 0x168)) = 0; 0x004650bc mov qword [rsp + 8], rcx | *((rsp + 8)) = rcx; 0x004650c1 mov qword [rsp + 0x170], rcx | *((rsp + 0x170)) = rcx; 0x004650c9 mov qword [rsp + 0x178], rdx | *((rsp + 0x178)) = rdx; 0x004650d1 movaps xmmword [rsp + 0x40], xmm0 | *((rsp + 0x40)) = xmm0; 0x004650d6 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x004650db movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x004650e0 movaps xmmword [rsp + 0x10], xmm0 | *((rsp + 0x10)) = xmm0; 0x004650e5 mov byte [rsp + 0x50], al | *((rsp + 0x50)) = al; 0x004650e9 test al, al | | if (al != 0) { 0x004650eb je 0x465102 | 0x004650ed movzx edx, al | edx = (int32_t) al; 0x004650f0 lea rdi, [rsp + 0x10] | 0x004650f5 lea rsi, [rsp + 0xd0] | 0x004650fd call 0x404d00 | memcpy (rsp + 0x10, rsp + 0xd0, rdx); | } 0x00465102 mov rcx, qword [rsp + 0x118] | rcx = *((rsp + 0x118)); 0x0046510a mov rax, qword [rsp + 0x120] | rax = *((rsp + 0x120)); 0x00465112 mov qword [rsp + 0x58], rcx | *((rsp + 0x58)) = rcx; 0x00465117 mov qword [rsp + 0x60], rax | *((rsp + 0x60)) = rax; 0x0046511c cmp rcx, qword [rsp + 8] | | if (rcx == *((rsp + 8))) { 0x00465121 jne 0x46512d | 0x00465123 cmp rax, qword [rsp] | | if (rax == *(rsp)) { 0x00465127 je 0x465312 | goto label_1; | } | } 0x0046512d lea r14, [r12 + 0x10] | r14 = r12 + 0x10; 0x00465132 mov bpl, byte [r12 + 0x50] | bpl = *((r12 + 0x50)); 0x00465137 lea r15, [rsp + 0x180] | r15 = rsp + 0x180; 0x0046513f lea rbx, [rsp + 0x80] | rbx = rsp + 0x80; 0x00465147 nop word [rax + rax] | | do { | label_0: 0x00465150 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00465153 movaps xmmword [rsp + 0x1b0], xmm0 | *((rsp + 0x1b0)) = xmm0; 0x0046515b movaps xmmword [rsp + 0x1a0], xmm0 | *((rsp + 0x1a0)) = xmm0; 0x00465163 movaps xmmword [rsp + 0x190], xmm0 | *((rsp + 0x190)) = xmm0; 0x0046516b movaps xmmword [rsp + 0x180], xmm0 | *((rsp + 0x180)) = xmm0; 0x00465173 mov byte [rsp + 0x1c0], bpl | *((rsp + 0x1c0)) = bpl; 0x0046517b test bpl, bpl | | if (bpl != 0) { 0x0046517e je 0x46518f | 0x00465180 movzx edx, bpl | edx = (int32_t) bpl; 0x00465184 mov rdi, r15 | 0x00465187 mov rsi, r14 | 0x0046518a call 0x404d00 | memcpy (r15, r14, rdx); | } 0x0046518f xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00465192 movaps xmmword [rsp + 0xb0], xmm0 | *((rsp + 0xb0)) = xmm0; 0x0046519a movaps xmmword [rsp + 0xa0], xmm0 | *((rsp + 0xa0)) = xmm0; 0x004651a2 movaps xmmword [rsp + 0x90], xmm0 | *((rsp + 0x90)) = xmm0; 0x004651aa movaps xmmword [rsp + 0x80], xmm0 | *((rsp + 0x80)) = xmm0; 0x004651b2 movzx edx, byte [rsp + 0x50] | edx = *((rsp + 0x50)); 0x004651b7 mov byte [rsp + 0xc0], dl | *((rsp + 0xc0)) = dl; 0x004651be test rdx, rdx | | if (rdx != 0) { 0x004651c1 je 0x4651d0 | 0x004651c3 mov rdi, rbx | 0x004651c6 lea rsi, [rsp + 0x10] | 0x004651cb call 0x404d00 | memcpy (rbx, rsp + 0x10, rdx); | } 0x004651d0 mov rdi, r15 | rdi = r15; 0x004651d3 mov rsi, rbx | rsi = rbx; 0x004651d6 call 0x45d990 | (anonymousnamespace)::u::Md5BlockUtil::concatenate((anonymousnamespace)::u::Md5Block*,(anonymousnamespace)::u::Md5Block*) (); 0x004651db movzx ebp, byte [rsp + 0x1c0] | ebp = *((rsp + 0x1c0)); 0x004651e3 test rbp, rbp | | if (rbp != 0) { 0x004651e6 je 0x46524e | 0x004651e8 cmp bpl, 0x40 | | if (bpl == 0x40) { 0x004651ec jne 0x465240 | 0x004651ee movups xmm0, xmmword [r12] | __asm ("movups xmm0, xmmword [r12]"); 0x004651f3 movaps xmmword [rsp + 0x70], xmm0 | *((rsp + 0x70)) = xmm0; 0x004651f8 lea rdi, [rsp + 0x70] | rdi = rsp + 0x70; 0x004651fd mov rsi, r15 | rsi = r15; 0x00465200 call 0x45dd60 | (anonymousnamespace)::u::Md5StateUtil::digest((anonymousnamespace)::u::Md5Fingerprint*,(anonymousnamespace)::u::Md5Blockconst&) (); 0x00465205 movaps xmm0, xmmword [rsp + 0x70] | xmm0 = *((rsp + 0x70)); 0x0046520a movups xmmword [r12], xmm0 | __asm ("movups xmmword [r12], xmm0"); 0x0046520f movzx ebp, byte [rsp + 0xc0] | ebp = *((rsp + 0xc0)); 0x00465217 test rbp, rbp | | if (rbp != 0) { 0x0046521a je 0x46522a | 0x0046521c mov rdi, r14 | 0x0046521f mov rsi, rbx | 0x00465222 mov rdx, rbp | 0x00465225 call 0x404d00 | memcpy (r14, rbx, rbp); | } 0x0046522a mov byte [r12 + 0x50], bpl | *((r12 + 0x50)) = bpl; 0x0046522f inc qword [r12 + 0x58] | *((r12 + 0x58))++; 0x00465234 jmp 0x465253 | goto label_2; | } 0x00465240 mov rdi, r14 | 0x00465243 mov rsi, r15 | 0x00465246 mov rdx, rbp | 0x00465249 call 0x404d00 | memcpy (r14, r15, rbp); | } 0x0046524e mov byte [r12 + 0x50], bpl | *((r12 + 0x50)) = bpl; | label_2: 0x00465253 mov rax, qword [rsp + 0x58] | rax = *((rsp + 0x58)); 0x00465258 mov r13, qword [rsp + 0x60] | r13 = *((rsp + 0x60)); 0x0046525d add rax, 0x40 | rax += 0x40; 0x00465261 mov qword [rsp + 0x58], rax | *((rsp + 0x58)) = rax; 0x00465266 cmp rax, r13 | | if (rax < r13) { 0x00465269 jae 0x4652d0 | 0x0046526b sub r13, rax | r13 -= rax; 0x0046526e cmp r13, 0x40 | 0x00465272 mov eax, 0x40 | eax = 0x40; | if (r13 >= 0x40) { 0x00465277 cmovae r13, rax | r13 = rax; | } 0x0046527b movzx eax, byte [rsp + 0x50] | eax = *((rsp + 0x50)); 0x00465280 cmp r13, rax | 0x00465283 mov rcx, rax | rcx = rax; | if (r13 < rax) { 0x00465286 cmovb rcx, r13 | rcx = r13; | } | if (r13 > rax) { 0x0046528a cmova rax, r13 | rax = r13; | } 0x0046528e lea rdi, [rsp + rcx + 0x10] | rdi = rsp + rcx + 0x10; 0x00465293 lea rdx, [rsp + rax + 0x10] | rdx = rsp + rax + 0x10; 0x00465298 sub rdx, rdi | rdx -= rdi; 0x0046529b test rdx, rdx | | if (rdx > 0) { 0x0046529e jle 0x4652a7 | 0x004652a0 xor esi, esi | 0x004652a2 call 0x404530 | memset (rdi, 0, rdx); | } 0x004652a7 mov byte [rsp + 0x50], r13b | *((rsp + 0x50)) = r13b; 0x004652ac test r13, r13 | | if (r13 == 0) { 0x004652af je 0x4652eb | goto label_3; | } 0x004652b1 mov rsi, qword [rsp + 0x58] | 0x004652b6 lea rdi, [rsp + 0x10] | 0x004652bb mov rdx, r13 | 0x004652be call 0x4049c0 | memmove (rsp + 0x10, *((rsp + 0x58)), r13); 0x004652c3 jmp 0x4652eb | | } else { 0x004652d0 movzx edx, byte [rsp + 0x50] | edx = *((rsp + 0x50)); 0x004652d5 test rdx, rdx | | if (rdx != 0) { 0x004652d8 je 0x4652e6 | 0x004652da lea rdi, [rsp + 0x10] | 0x004652df xor esi, esi | 0x004652e1 call 0x404530 | memset (rsp + 0x10, 0, rdx); | } 0x004652e6 mov byte [rsp + 0x50], 0 | *((rsp + 0x50)) = 0; | } | label_3: 0x004652eb mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x004652f0 cmp qword [rsp + 0x58], rax | 0x004652f5 lea rbx, [rsp + 0x80] | rbx = rsp + 0x80; 0x004652fd jne 0x465150 | | } while (*((rsp + 0x58)) != rax); 0x00465303 mov rax, qword [rsp] | rax = *(rsp); 0x00465307 cmp qword [rsp + 0x60], rax | | if (*((rsp + 0x60)) != rax) { 0x0046530c jne 0x465150 | goto label_0; | } | label_1: 0x00465312 add rsp, 0x1c8 | 0x00465319 pop rbx | 0x0046531a pop r12 | 0x0046531c pop r13 | 0x0046531e pop r14 | 0x00465320 pop r15 | 0x00465322 pop rbp | 0x00465323 ret | return rax; | }