|
__int64 __fastcall runProgram(__int64 a1, __int64 code) |
|
{ |
|
int v2; // eax |
|
int v3; // eax |
|
int v4; // eax |
|
int v5; // ecx |
|
int v6; // eax |
|
int v7; // eax |
|
int v8; // eax |
|
int v9; // eax |
|
int v10; // eax |
|
int v11; // eax |
|
int v12; // eax |
|
int v13; // eax |
|
int v14; // eax |
|
int v15; // eax |
|
int v16; // eax |
|
int v17; // eax |
|
int v18; // ebx |
|
int v19; // eax |
|
int v20; // eax |
|
int v21; // eax |
|
int v22; // eax |
|
__int64 v23; // rbx |
|
int v24; // eax |
|
int v25; // eax |
|
int v26; // eax |
|
int v27; // eax |
|
int v28; // eax |
|
int v29; // ecx |
|
__int64 v30; // rax |
|
int v31; // ebx |
|
int v32; // eax |
|
int v33; // eax |
|
int v34; // eax |
|
int v35; // eax |
|
void **v36; // rbx |
|
int v37; // eax |
|
int v38; // eax |
|
int v39; // eax |
|
int v40; // eax |
|
int v41; // eax |
|
int v42; // eax |
|
int v43; // eax |
|
int v44; // eax |
|
int v45; // eax |
|
int v46; // eax |
|
int v47; // eax |
|
int v48; // eax |
|
int v49; // eax |
|
__int64 v50; // rcx |
|
int v51; // eax |
|
int v52; // eax |
|
int v53; // eax |
|
int v54; // eax |
|
__int64 v55; // rcx |
|
int v56; // eax |
|
int v57; // eax |
|
int v58; // eax |
|
int v59; // eax |
|
int v60; // ebx |
|
int v61; // ecx |
|
int v62; // eax |
|
int v63; // eax |
|
int v64; // eax |
|
int v65; // eax |
|
int v66; // eax |
|
__int64 result; // rax |
|
__int64 input_lld; // [rsp+28h] [rbp-138F8h] |
|
char v69; // [rsp+34h] [rbp-138ECh] |
|
char v70; // [rsp+35h] [rbp-138EBh] |
|
char v71; // [rsp+36h] [rbp-138EAh] |
|
char v72; // [rsp+37h] [rbp-138E9h] |
|
char v73; // [rsp+38h] [rbp-138E8h] |
|
char v74; // [rsp+39h] [rbp-138E7h] |
|
char v75; // [rsp+3Ah] [rbp-138E6h] |
|
char v76; // [rsp+3Bh] [rbp-138E5h] |
|
char v77; // [rsp+3Ch] [rbp-138E4h] |
|
char v78; // [rsp+3Dh] [rbp-138E3h] |
|
char v79; // [rsp+3Eh] [rbp-138E2h] |
|
char v80; // [rsp+3Fh] [rbp-138E1h] |
|
__int64 stack[10001]; // [rsp+40h] [rbp-138E0h] |
|
__int128 v82; // [rsp+138C8h] [rbp-58h] |
|
char v83; // [rsp+138DFh] [rbp-41h] |
|
_QWORD *funcs_ptr; // [rsp+138E0h] [rbp-40h] |
|
int j; // [rsp+138E8h] [rbp-38h] |
|
int i; // [rsp+138ECh] [rbp-34h] |
|
void *call_stack; // [rsp+138F0h] [rbp-30h] |
|
int v88_64; // [rsp+138FCh] [rbp-24h] |
|
int cur_func; // [rsp+13900h] [rbp-20h] |
|
int v90; // [rsp+13904h] [rbp-1Ch] |
|
int v91; // [rsp+13908h] [rbp-18h] |
|
int pc; // [rsp+1390Ch] [rbp-14h] |
|
|
|
funcs_ptr = initializeFunctions((char *)a1); |
|
pc = 0; |
|
v91 = 0; |
|
v90 = 0; |
|
cur_func = 0; |
|
v88_64 = 64; |
|
call_stack = malloc(0x200uLL); |
|
for ( i = 0; i < v88_64; ++i ) |
|
*((_QWORD *)call_stack + i) = malloc(8uLL); |
|
while ( 1 ) |
|
{ |
|
result = *(unsigned __int8 *)(pc + code); |
|
if ( (_BYTE)result == 13 ) |
|
return result; |
|
v2 = pc++; |
|
v83 = *(_BYTE *)(v2 + code); |
|
switch ( v83 ) |
|
{ |
|
case 1: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v3 = v91++; |
|
stack[v3] = *((_QWORD *)&v82 + 1) - v82; |
|
break; |
|
case 2: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v4 = v91++; |
|
stack[v4] = v82 * *((_QWORD *)&v82 + 1); |
|
break; |
|
case 3: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v6 = v91++; |
|
stack[v6] = *((_QWORD *)&v82 + 1) + v82; |
|
break; |
|
case 8: |
|
v10 = pc++; |
|
v73 = *(_BYTE *)(v10 + code); |
|
v11 = pc++; |
|
v74 = *(_BYTE *)(v11 + code); |
|
v12 = pc++; |
|
v75 = *(_BYTE *)(v12 + code); |
|
v13 = pc++; |
|
v76 = *(_BYTE *)(v13 + code); |
|
v14 = pc++; |
|
v77 = *(_BYTE *)(v14 + code); |
|
v15 = pc++; |
|
v78 = *(_BYTE *)(v15 + code); |
|
v16 = pc++; |
|
v79 = *(_BYTE *)(v16 + code); |
|
v17 = pc++; |
|
v80 = *(_BYTE *)(v17 + code); |
|
v18 = v91++; |
|
stack[v18] = bytesToLongLong((unsigned __int8 *)&v73); |
|
break; |
|
case 0xB: |
|
v19 = pc++; |
|
v69 = *(_BYTE *)(v19 + code); |
|
v20 = pc++; |
|
v70 = *(_BYTE *)(v20 + code); |
|
v21 = pc++; |
|
v71 = *(_BYTE *)(v21 + code); |
|
v22 = pc++; |
|
v72 = *(_BYTE *)(v22 + code); |
|
v23 = stack[--v91]; |
|
v24 = bytesToInt((unsigned __int8 *)&v69); |
|
setLocal(funcs_ptr[cur_func], v24, v23); |
|
break; |
|
case 0xC: |
|
v25 = pc++; |
|
v69 = *(_BYTE *)(v25 + code); |
|
v26 = pc++; |
|
v70 = *(_BYTE *)(v26 + code); |
|
v27 = pc++; |
|
v71 = *(_BYTE *)(v27 + code); |
|
v28 = pc++; |
|
v72 = *(_BYTE *)(v28 + code); |
|
v29 = bytesToInt((unsigned __int8 *)&v69); |
|
v30 = funcs_ptr[cur_func]; |
|
v31 = v91++; |
|
stack[v31] = getLocal(v30, v29); |
|
break; |
|
case 0xE: |
|
decrementFunction(funcs_ptr[cur_func]); |
|
pc = **((_DWORD **)call_stack + --v90); |
|
cur_func = *(_DWORD *)(*((_QWORD *)call_stack + v90) + 4LL); |
|
break; |
|
case 0xF: |
|
printf("%lld\n", stack[--v91]); |
|
break; |
|
case 0x10: |
|
--v91; |
|
break; |
|
case 0x13: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v5 = v91++; |
|
stack[v5] = *((_QWORD *)&v82 + 1) / (__int64)v82; |
|
break; |
|
case 0x15: |
|
v32 = pc++; |
|
v69 = *(_BYTE *)(v32 + code); |
|
v33 = pc++; |
|
v70 = *(_BYTE *)(v33 + code); |
|
v34 = pc++; |
|
v71 = *(_BYTE *)(v34 + code); |
|
v35 = pc++; |
|
v72 = *(_BYTE *)(v35 + code); |
|
if ( v90 >= v88_64 ) |
|
{ |
|
v88_64 *= 2; |
|
call_stack = realloc(call_stack, 8LL * v88_64); |
|
for ( j = v90; j < v88_64; ++j ) |
|
{ |
|
v36 = (void **)((char *)call_stack + 8 * j); |
|
*v36 = malloc(8uLL); |
|
} |
|
} |
|
*(_DWORD *)(*((_QWORD *)call_stack + v90) + 4LL) = cur_func; |
|
**((_DWORD **)call_stack + v90++) = pc; |
|
cur_func = bytesToInt((unsigned __int8 *)&v69); |
|
pc = *(_DWORD *)funcs_ptr[cur_func]; |
|
incrementFunction(funcs_ptr[cur_func]); |
|
break; |
|
case 0x16: |
|
__isoc99_scanf("%lld", &input_lld); |
|
v37 = v91++; |
|
stack[v37] = input_lld; |
|
break; |
|
case 0x17: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
if ( *((_QWORD *)&v82 + 1) != (_QWORD)v82 ) |
|
{ |
|
do |
|
{ |
|
v38 = pc++; |
|
v83 = *(_BYTE *)(v38 + code); |
|
} |
|
while ( v83 != 14 ); |
|
} |
|
break; |
|
case 0x18: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v7 = v91++; |
|
stack[v7] = v82 | *((_QWORD *)&v82 + 1); |
|
break; |
|
case 0x19: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v8 = v91++; |
|
stack[v8] = v82 & *((_QWORD *)&v82 + 1); |
|
break; |
|
case 0x1A: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
v9 = v91++; |
|
stack[v9] = v82 ^ *((_QWORD *)&v82 + 1); |
|
break; |
|
case 0x1B: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
if ( *((_QWORD *)&v82 + 1) == (_QWORD)v82 ) |
|
{ |
|
do |
|
{ |
|
v39 = pc++; |
|
v83 = *(_BYTE *)(v39 + code); |
|
} |
|
while ( v83 != 14 ); |
|
} |
|
break; |
|
case 0x1C: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
if ( *((_QWORD *)&v82 + 1) < (__int64)v82 ) |
|
{ |
|
do |
|
{ |
|
v40 = pc++; |
|
v83 = *(_BYTE *)(v40 + code); |
|
} |
|
while ( v83 != 14 ); |
|
} |
|
break; |
|
case 0x1D: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
if ( *((_QWORD *)&v82 + 1) > (__int64)v82 ) |
|
{ |
|
do |
|
{ |
|
v41 = pc++; |
|
v83 = *(_BYTE *)(v41 + code); |
|
} |
|
while ( v83 != 14 ); |
|
} |
|
break; |
|
case 0x1E: |
|
v42 = pc++; |
|
v69 = *(_BYTE *)(v42 + code); |
|
v43 = pc++; |
|
v70 = *(_BYTE *)(v43 + code); |
|
v44 = pc++; |
|
v71 = *(_BYTE *)(v44 + code); |
|
v45 = pc++; |
|
v72 = *(_BYTE *)(v45 + code); |
|
pc = bytesToInt((unsigned __int8 *)&v69); |
|
break; |
|
case 0x1F: |
|
pc = stack[--v91]; |
|
break; |
|
case 0x20: |
|
v46 = pc++; |
|
v69 = *(_BYTE *)(v46 + code); |
|
v47 = pc++; |
|
v70 = *(_BYTE *)(v47 + code); |
|
v48 = pc++; |
|
v71 = *(_BYTE *)(v48 + code); |
|
v49 = pc++; |
|
v72 = *(_BYTE *)(v49 + code); |
|
v50 = (int)bytesToInt((unsigned __int8 *)&v69); |
|
++*(_BYTE *)(v50 + code); |
|
break; |
|
case 0x21: |
|
v51 = pc++; |
|
v69 = *(_BYTE *)(v51 + code); |
|
v52 = pc++; |
|
v70 = *(_BYTE *)(v52 + code); |
|
v53 = pc++; |
|
v71 = *(_BYTE *)(v53 + code); |
|
v54 = pc++; |
|
v72 = *(_BYTE *)(v54 + code); |
|
v55 = (int)bytesToInt((unsigned __int8 *)&v69); |
|
--*(_BYTE *)(v55 + code); |
|
break; |
|
case 0x22: |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
*(_BYTE *)(v82 + code) = *(_BYTE *)(*((_QWORD *)&v82 + 1) + code); |
|
break; |
|
case 0x23: |
|
v56 = pc++; |
|
v69 = *(_BYTE *)(v56 + code); |
|
v57 = pc++; |
|
v70 = *(_BYTE *)(v57 + code); |
|
v58 = pc++; |
|
v71 = *(_BYTE *)(v58 + code); |
|
v59 = pc++; |
|
v72 = *(_BYTE *)(v59 + code); |
|
v60 = *(unsigned __int8 *)((int)bytesToInt((unsigned __int8 *)&v69) + code) << 8; |
|
v61 = v60 + *(unsigned __int8 *)((int)bytesToInt((unsigned __int8 *)&v69) + 1LL + code); |
|
v62 = v91++; |
|
stack[v62] = v61; |
|
break; |
|
case 0x24: |
|
v63 = pc++; |
|
v69 = *(_BYTE *)(v63 + code); |
|
v64 = pc++; |
|
v70 = *(_BYTE *)(v64 + code); |
|
v65 = pc++; |
|
v71 = *(_BYTE *)(v65 + code); |
|
v66 = pc++; |
|
v72 = *(_BYTE *)(v66 + code); |
|
*((_QWORD *)&v82 + 1) = stack[--v91]; |
|
*(_QWORD *)&v82 = stack[--v91]; |
|
if ( *((_QWORD *)&v82 + 1) == (_QWORD)v82 ) |
|
pc = bytesToInt((unsigned __int8 *)&v69); |
|
break; |
|
default: |
|
continue; |
|
} |
|
} |
|
} |