; assembly | /* r2dec pseudo code output */ | /* balber_berutil.t/assume @ 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, int64_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; | void * s2; | int64_t var_90h; | int64_t var_a0h; | int64_t var_b0h; | int64_t var_c0h; | int64_t var_c8h; | int64_t var_d0h; | int64_t var_d8h; | int64_t var_e8h; | int64_t var_f8h; | int64_t var_108h; | int64_t var_118h; | int64_t var_120h; | int64_t var_128h; | int64_t var_130h; | int64_t var_140h; | int64_t var_150h; | int64_t var_160h; | int64_t var_170h; | 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 rbx, rdi | rbx = rdi; 0x00464fe7 lea rax, [rsi + rdx] | rax = rsi + rdx; 0x00464feb xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00464fee movaps xmmword [rsp + 0xb0], xmm0 | *((rsp + 0xb0)) = xmm0; 0x00464ff6 movaps xmmword [rsp + 0xa0], xmm0 | *((rsp + 0xa0)) = xmm0; 0x00464ffe movaps xmmword [rsp + 0x90], xmm0 | *((rsp + 0x90)) = xmm0; 0x00465006 movaps xmmword [rsp + 0x80], xmm0 | *((rsp + 0x80)) = xmm0; 0x0046500e mov byte [rsp + 0xc0], 0 | *((rsp + 0xc0)) = 0; 0x00465016 mov qword [rsp + 0xc8], rsi | *((rsp + 0xc8)) = rsi; 0x0046501e mov qword [rsp], rax | *(rsp) = rax; 0x00465022 mov qword [rsp + 0xd0], rax | *((rsp + 0xd0)) = 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 r12, [rsp + 0x80] | r12 = rsp + 0x80; 0x00465048 mov rdi, r12 | 0x0046504b xor esi, esi | 0x0046504d mov rdx, r15 | 0x00465050 call 0x4044e0 | memset (r12, 0, r15); 0x00465055 mov byte [rsp + 0xc0], r15b | *((rsp + 0xc0)) = r15b; 0x0046505d mov rdi, r12 | 0x00465060 mov rsi, r14 | 0x00465063 mov rdx, r15 | 0x00465066 call 0x404cb0 | memcpy (r12, r14, r15); 0x0046506b xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0046506e mov al, byte [rsp + 0xc0] | al = *((rsp + 0xc0)); 0x00465075 jmp 0x465079 | | } else { 0x00465077 xor eax, eax | eax = 0; | } 0x00465079 and ebp, 0x3f | ebp &= 0x3f; 0x0046507c neg rbp | rbp = -rbp; 0x0046507f mov rcx, qword [rsp] | rcx = *(rsp); 0x00465083 lea rdx, [rcx + rbp + 0x40] | rdx = rcx + rbp + 0x40; 0x00465088 movups xmmword [rsp + 0x108], xmm0 | __asm ("movups xmmword [rsp + 0x108], xmm0"); 0x00465090 movups xmmword [rsp + 0xf8], xmm0 | __asm ("movups xmmword [rsp + 0xf8], xmm0"); 0x00465098 movups xmmword [rsp + 0xe8], xmm0 | __asm ("movups xmmword [rsp + 0xe8], xmm0"); 0x004650a0 movups xmmword [rsp + 0xd8], xmm0 | __asm ("movups xmmword [rsp + 0xd8], xmm0"); 0x004650a8 mov byte [rsp + 0x118], 0 | *((rsp + 0x118)) = 0; 0x004650b0 mov qword [rsp + 8], rdx | *((rsp + 8)) = rdx; 0x004650b5 mov qword [rsp + 0x120], rdx | *((rsp + 0x120)) = rdx; 0x004650bd mov qword [rsp + 0x128], rcx | *((rsp + 0x128)) = rcx; 0x004650c5 movaps xmmword [rsp + 0x40], xmm0 | *((rsp + 0x40)) = xmm0; 0x004650ca movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x004650cf movaps xmmword [rsp + 0x20], xmm0 | *((rsp + 0x20)) = xmm0; 0x004650d4 movaps xmmword [rsp + 0x10], xmm0 | *((rsp + 0x10)) = xmm0; 0x004650d9 mov byte [rsp + 0x50], al | *((rsp + 0x50)) = al; 0x004650dd test al, al | | if (al != 0) { 0x004650df je 0x4650f6 | 0x004650e1 movzx edx, al | edx = (int32_t) al; 0x004650e4 lea rdi, [rsp + 0x10] | 0x004650e9 lea rsi, [rsp + 0x80] | 0x004650f1 call 0x404cb0 | memcpy (rsp + 0x10, rsp + 0x80, rdx); | } 0x004650f6 mov rcx, qword [rsp + 0xc8] | rcx = *((rsp + 0xc8)); 0x004650fe mov rax, qword [rsp + 0xd0] | rax = *((rsp + 0xd0)); 0x00465106 mov qword [rsp + 0x58], rcx | *((rsp + 0x58)) = rcx; 0x0046510b mov qword [rsp + 0x60], rax | *((rsp + 0x60)) = rax; 0x00465110 cmp rcx, qword [rsp + 8] | | if (rcx == *((rsp + 8))) { 0x00465115 jne 0x465121 | 0x00465117 cmp rax, qword [rsp] | | if (rax == *(rsp)) { 0x0046511b je 0x4652ea | goto label_1; | } | } 0x00465121 lea r14, [rbx + 0x10] | r14 = rbx + 0x10; 0x00465125 mov r13b, byte [rbx + 0x50] | r13b = *((rbx + 0x50)); 0x00465129 lea r15, [rsp + 0x180] | r15 = rsp + 0x180; 0x00465131 lea r12, [rsp + 0x130] | r12 = rsp + 0x130; 0x00465139 nop dword [rax] | | do { | label_0: 0x00465140 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00465143 movaps xmmword [rsp + 0x1b0], xmm0 | *((rsp + 0x1b0)) = xmm0; 0x0046514b movaps xmmword [rsp + 0x1a0], xmm0 | *((rsp + 0x1a0)) = xmm0; 0x00465153 movaps xmmword [rsp + 0x190], xmm0 | *((rsp + 0x190)) = xmm0; 0x0046515b movaps xmmword [rsp + 0x180], xmm0 | *((rsp + 0x180)) = xmm0; 0x00465163 mov byte [rsp + 0x1c0], r13b | *((rsp + 0x1c0)) = r13b; 0x0046516b test r13b, r13b | | if (r13b != 0) { 0x0046516e je 0x46517f | 0x00465170 movzx edx, r13b | edx = (int32_t) r13b; 0x00465174 mov rdi, r15 | 0x00465177 mov rsi, r14 | 0x0046517a call 0x404cb0 | memcpy (r15, r14, rdx); | } 0x0046517f xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00465182 movaps xmmword [rsp + 0x160], xmm0 | *((rsp + 0x160)) = xmm0; 0x0046518a movaps xmmword [rsp + 0x150], xmm0 | *((rsp + 0x150)) = xmm0; 0x00465192 movaps xmmword [rsp + 0x140], xmm0 | *((rsp + 0x140)) = xmm0; 0x0046519a movaps xmmword [rsp + 0x130], xmm0 | *((rsp + 0x130)) = xmm0; 0x004651a2 movzx edx, byte [rsp + 0x50] | edx = *((rsp + 0x50)); 0x004651a7 mov byte [rsp + 0x170], dl | *((rsp + 0x170)) = dl; 0x004651ae test rdx, rdx | | if (rdx != 0) { 0x004651b1 je 0x4651c0 | 0x004651b3 mov rdi, r12 | 0x004651b6 lea rsi, [rsp + 0x10] | 0x004651bb call 0x404cb0 | memcpy (r12, rsp + 0x10, rdx); | } 0x004651c0 mov rdi, r15 | rdi = r15; 0x004651c3 mov rsi, r12 | rsi = r12; 0x004651c6 call 0x45d8d0 | (anonymousnamespace)::u::Md5BlockUtil::concatenate((anonymousnamespace)::u::Md5Block*,(anonymousnamespace)::u::Md5Block*) (); 0x004651cb movzx r13d, byte [rsp + 0x1c0] | r13d = *((rsp + 0x1c0)); 0x004651d4 cmp r13, 0x40 | | if (r13 == 0x40) { 0x004651d8 jne 0x465220 | 0x004651da movups xmm0, xmmword [rbx] | __asm ("movups xmm0, xmmword [rbx]"); 0x004651dd movaps xmmword [rsp + 0x70], xmm0 | *((rsp + 0x70)) = xmm0; 0x004651e2 lea rdi, [rsp + 0x70] | rdi = rsp + 0x70; 0x004651e7 mov rsi, r15 | rsi = r15; 0x004651ea call 0x45dca0 | (anonymousnamespace)::u::Md5StateUtil::digest((anonymousnamespace)::u::Md5Fingerprint*,(anonymousnamespace)::u::Md5Blockconst&) (); 0x004651ef movaps xmm0, xmmword [rsp + 0x70] | xmm0 = *((rsp + 0x70)); 0x004651f4 movups xmmword [rbx], xmm0 | __asm ("movups xmmword [rbx], xmm0"); 0x004651f7 movzx r13d, byte [rsp + 0x170] | r13d = *((rsp + 0x170)); 0x00465200 test r13, r13 | | if (r13 != 0) { 0x00465203 je 0x465213 | 0x00465205 mov rdi, r14 | 0x00465208 mov rsi, r12 | 0x0046520b mov rdx, r13 | 0x0046520e call 0x404cb0 | memcpy (r14, r12, r13); | } 0x00465213 mov byte [rbx + 0x50], r13b | *((rbx + 0x50)) = r13b; 0x00465217 inc qword [rbx + 0x58] | *((rbx + 0x58))++; 0x0046521b jmp 0x465237 | | } else { 0x00465220 test r13b, r13b | | if (r13b != 0) { 0x00465223 je 0x465233 | 0x00465225 mov rdi, r14 | 0x00465228 mov rsi, r15 | 0x0046522b mov rdx, r13 | 0x0046522e call 0x404cb0 | memcpy (r14, r15, r13); | } 0x00465233 mov byte [rbx + 0x50], r13b | *((rbx + 0x50)) = r13b; | } 0x00465237 mov rax, qword [rsp + 0x58] | rax = *((rsp + 0x58)); 0x0046523c mov rbp, qword [rsp + 0x60] | rbp = *((rsp + 0x60)); 0x00465241 add rax, 0x40 | rax += 0x40; 0x00465245 mov qword [rsp + 0x58], rax | *((rsp + 0x58)) = rax; 0x0046524a cmp rax, rbp | | if (rax < rbp) { 0x0046524d jae 0x4652b0 | 0x0046524f sub rbp, rax | rbp -= rax; 0x00465252 cmp rbp, 0x40 | 0x00465256 mov eax, 0x40 | eax = 0x40; | if (rbp >= 0x40) { 0x0046525b cmovae rbp, rax | | } 0x0046525f movzx eax, byte [rsp + 0x50] | eax = *((rsp + 0x50)); 0x00465264 cmp rbp, rax | 0x00465267 mov rcx, rax | rcx = rax; | if (rbp < rax) { 0x0046526a cmovb rcx, rbp | rcx = rbp; | } | if (rbp > rax) { 0x0046526e cmova rax, rbp | rax = rbp; | } 0x00465272 lea rdi, [rsp + rcx + 0x10] | rdi = rsp + rcx + 0x10; 0x00465277 lea rdx, [rsp + rax + 0x10] | rdx = rsp + rax + 0x10; 0x0046527c sub rdx, rdi | rdx -= rdi; 0x0046527f test rdx, rdx | | if (rdx > 0) { 0x00465282 jle 0x46528b | 0x00465284 xor esi, esi | 0x00465286 call 0x4044e0 | memset (rdi, 0, rdx); | } 0x0046528b mov byte [rsp + 0x50], bpl | *((rsp + 0x50)) = bpl; 0x00465290 test rbp, rbp | | if (rbp == 0) { 0x00465293 je 0x4652cb | goto label_2; | } 0x00465295 mov rsi, qword [rsp + 0x58] | 0x0046529a lea rdi, [rsp + 0x10] | 0x0046529f mov rdx, rbp | 0x004652a2 call 0x404970 | memmove (rsp + 0x10, *((rsp + 0x58)), rbp); 0x004652a7 jmp 0x4652cb | | } else { 0x004652b0 movzx edx, byte [rsp + 0x50] | edx = *((rsp + 0x50)); 0x004652b5 test rdx, rdx | | if (rdx != 0) { 0x004652b8 je 0x4652c6 | 0x004652ba lea rdi, [rsp + 0x10] | 0x004652bf xor esi, esi | 0x004652c1 call 0x4044e0 | memset (rsp + 0x10, 0, rdx); | } 0x004652c6 mov byte [rsp + 0x50], 0 | *((rsp + 0x50)) = 0; | } | label_2: 0x004652cb mov rax, qword [rsp + 8] | rax = *((rsp + 8)); 0x004652d0 cmp qword [rsp + 0x58], rax | 0x004652d5 jne 0x465140 | | } while (*((rsp + 0x58)) != rax); 0x004652db mov rax, qword [rsp] | rax = *(rsp); 0x004652df cmp qword [rsp + 0x60], rax | | if (*((rsp + 0x60)) != rax) { 0x004652e4 jne 0x465140 | goto label_0; | } | label_1: 0x004652ea add rsp, 0x1c8 | 0x004652f1 pop rbx | 0x004652f2 pop r12 | 0x004652f4 pop r13 | 0x004652f6 pop r14 | 0x004652f8 pop r15 | 0x004652fa pop rbp | 0x004652fb ret | return rax; | }