__int64 __fastcall start_vm(Virtual_machine *virtual_machine)
{
__int64 pc_register; // rbx
__int64 v2; // rax
__int64 v3; // rbx
__int64 input_data_addr; // rsi
__int64 v5; // rax
char v6; // cl
unsigned __int64 v7; // rax
__int64 v8; // rsi
__int64 v9; // rax
char v10; // cl
unsigned __int64 v11; // rax
__int64 v12; // rsi
__int64 v13; // rax
char v14; // cl
unsigned __int64 v15; // rax
int v17; // edx
int v18; // ecx
int v19; // r8d
int v20; // r9d
__int64 v21; // rdx
int v22; // ecx
int v23; // r8d
int v24; // r9d
int v25; // ecx
int v26; // r8d
int v27; // r9d
int v28; // edx
int v29; // ecx
int v30; // r8d
int v31; // r9d
int v32; // edx
int v33; // ecx
int v34; // r8d
int v35; // r9d
int v36; // edx
int v37; // ecx
int v38; // r8d
int v39; // r9d
int v40; // edx
int v41; // ecx
int v42; // r8d
int v43; // r9d
int v44; // edx
int v45; // ecx
int v46; // r8d
int v47; // r9d
int v48; // edx
int v49; // ecx
int v50; // r8d
int v51; // r9d
int i; // [rsp+14h] [rbp-BCh]
__int64 v53; // [rsp+18h] [rbp-B8h]
unsigned __int64 v54; // [rsp+20h] [rbp-B0h]
unsigned __int64 v55; // [rsp+28h] [rbp-A8h]
unsigned __int64 v56; // [rsp+30h] [rbp-A0h]
unsigned __int64 Instruction_only_one_operand__first_operand_len; // [rsp+38h] [rbp-98h]
unsigned __int64 Instruction_only_two_operand__first_operand_len; // [rsp+40h] [rbp-90h]
unsigned __int64 Instruction_only_two_operand__second_operand_len; // [rsp+48h] [rbp-88h]
unsigned __int64 v60; // [rsp+50h] [rbp-80h]
unsigned __int64 v61; // [rsp+50h] [rbp-80h]
unsigned __int64 v62; // [rsp+50h] [rbp-80h]
unsigned __int64 v63; // [rsp+50h] [rbp-80h]
unsigned __int64 v64; // [rsp+50h] [rbp-80h]
unsigned __int64 v65; // [rsp+50h] [rbp-80h]
unsigned __int64 v66; // [rsp+50h] [rbp-80h]
unsigned __int64 v67; // [rsp+50h] [rbp-80h]
unsigned __int64 v68; // [rsp+50h] [rbp-80h]
unsigned __int64 v69; // [rsp+50h] [rbp-80h]
unsigned __int64 v70; // [rsp+50h] [rbp-80h]
unsigned __int64 v71; // [rsp+50h] [rbp-80h]
unsigned __int64 v72; // [rsp+50h] [rbp-80h]
unsigned __int64 v73; // [rsp+50h] [rbp-80h]
unsigned __int64 v74; // [rsp+58h] [rbp-78h]
unsigned __int64 v75; // [rsp+58h] [rbp-78h]
unsigned __int64 v76; // [rsp+58h] [rbp-78h]
unsigned __int64 v77; // [rsp+58h] [rbp-78h]
unsigned __int64 v78; // [rsp+58h] [rbp-78h]
unsigned __int64 v79; // [rsp+58h] [rbp-78h]
unsigned __int64 v80; // [rsp+58h] [rbp-78h]
unsigned __int64 v81; // [rsp+58h] [rbp-78h]
unsigned __int64 v82; // [rsp+58h] [rbp-78h]
unsigned __int64 v83; // [rsp+58h] [rbp-78h]
__int64 *v84; // [rsp+60h] [rbp-70h]
__int64 v85[4]; // [rsp+70h] [rbp-60h] BYREF
__int64 v86[7]; // [rsp+90h] [rbp-40h] BYREF
v86[5] = __readfsqword(0x28u);
v53 = 0LL;
memset(v85, 0, sizeof(v85));
memset(v86, 0, 32);
LABEL_193:
while ( virtual_machine->pc_register <= 0xFFFuLL )
{
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t'
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\n'
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\r')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF )
++virtual_machine->pc_register; // pc寄存器跳过指令序列中的' ' '\n' '\r' '\t'
for ( i = 0; (&instruction_list)[3 * i]; ++i )
{
pc_register = virtual_machine->pc_register;
if ( (unsigned __int64)(pc_register + j_wcsncmp_ifunc((&instruction_list)[3 * i])) <= 0xFFF )
{
v2 = j_wcsncmp_ifunc((&instruction_list)[3 * i]);
if ( !(unsigned int)j_strncmp_ifunc(
virtual_machine->pc_register + virtual_machine->input_data_addr,
(&instruction_list)[3 * i],
v2) )
{
virtual_machine->Instruction_type = (__int64)(&instruction_list)[3 * i + 1];
v3 = virtual_machine->pc_register;
virtual_machine->pc_register = v3 + j_wcsncmp_ifunc((&instruction_list)[3 * i]);
break;
}
virtual_machine->Instruction_type = 20LL;
}
}
if ( (&instruction_list)[3 * virtual_machine->Instruction_type + 2] == (char *)1 )
{
j_memset_ifunc(v85, 0LL, 32LL);
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
for ( Instruction_only_one_operand__first_operand_len = 0LL;
*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_one_operand__first_operand_len <= 0x1E// 单个操作数的指令序列第一个操作数长度不超过 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n';
++Instruction_only_one_operand__first_operand_len )
{
input_data_addr = virtual_machine->input_data_addr;
v5 = virtual_machine->pc_register;
virtual_machine->pc_register = v5 + 1;
v6 = *(_BYTE *)(input_data_addr + v5);
v7 = Instruction_only_one_operand__first_operand_len;
*((_BYTE *)v85 + v7) = v6;
}
*((_BYTE *)v85 + Instruction_only_one_operand__first_operand_len) = 0;
if ( !Instruction_only_one_operand__first_operand_len )
goto Error_about_Miss_oprand;
}
else if ( (&instruction_list)[3 * virtual_machine->Instruction_type + 2] == (char *)2 )
{
j_memset_ifunc(v85, 0LL, 32LL);
j_memset_ifunc(v86, 0LL, 32LL);
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
Instruction_only_two_operand__first_operand_len = 0LL;
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_two_operand__first_operand_len <= 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
{
v8 = virtual_machine->input_data_addr;
v9 = virtual_machine->pc_register;
virtual_machine->pc_register = v9 + 1;
v10 = *(_BYTE *)(v8 + v9);
v11 = Instruction_only_two_operand__first_operand_len++;
*((_BYTE *)v85 + v11) = v10;
}
*((_BYTE *)v85 + Instruction_only_two_operand__first_operand_len) = 0;
if ( !Instruction_only_two_operand__first_operand_len )
goto Error_about_Miss_oprand;
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
Instruction_only_two_operand__second_operand_len = 0LL;
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_two_operand__second_operand_len <= 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
{
v12 = virtual_machine->input_data_addr;
v13 = virtual_machine->pc_register;
virtual_machine->pc_register = v13 + 1;
v14 = *(_BYTE *)(v12 + v13);
v15 = Instruction_only_two_operand__second_operand_len++;
*((_BYTE *)v86 + v15) = v14;
}
*((_BYTE *)v86 + Instruction_only_two_operand__second_operand_len) = 0;
if ( !Instruction_only_two_operand__second_operand_len )
{
Error_about_Miss_oprand:
virtual_machine->error_code = 2LL;
puts("ERROR: Miss oprand!");
return virtual_machine->error_code;
}
}
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF )
++virtual_machine->pc_register;
++virtual_machine->pc_register;
switch ( virtual_machine->Instruction_type )
{
case 0LL: // NOP
goto LABEL_193;
case 1LL: // LOAD REG0 address
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v60 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v60 > 5 )
goto Error_about_invalid_register;
v84 = (__int64 *)atoi(v86, 0LL, 16LL);
if ( (unsigned __int64)v84 <= 0x2023FFFF || (unsigned __int64)v84 > 0x20242FFF )
goto Error_about_invalid_address;
if ( (unsigned __int64)(v84 + 1) > 0x20242FFF )
goto LABEL_76;
*(&virtual_machine->register0 + v60) = *v84;
goto LABEL_193;
case 2LL: // STORE REG0 address
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v74 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v74 > 5 )
goto Error_about_invalid_register;
v84 = (__int64 *)atoi(v86, 0LL, 16LL);
if ( (unsigned __int64)v84 <= 0x2023FFFF || (unsigned __int64)v84 > 0x20242FFF )
{
Error_about_invalid_address:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid address: %#lx!\n", (_DWORD)v84, v17, v18, v19, v20);
return virtual_machine->error_code;
}
if ( (unsigned __int64)(v84 + 1) > 0x20242FFF )
{
LABEL_76:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid memory access: %lx!\n", (_DWORD)v84, v17, v18, v19, v20);
return virtual_machine->error_code;
}
*v84 = *(&virtual_machine->register0 + v74);
goto LABEL_193;
case 3LL: // MOV REG0 REG1
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v61 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v61 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v75 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v75 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v61) = *(&virtual_machine->register0 + v75);
goto LABEL_193;
case 4LL: // ADD REG0 REG1
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v62 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v62 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v76 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v76 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v62) += *(&virtual_machine->register0 + v76);
goto LABEL_193;
case 5LL: // SUB REG0 REG1
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v63 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v63 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v77 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v77 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v63) -= *(&virtual_machine->register0 + v77);
goto LABEL_193;
case 6LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v64 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v64 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v78 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v78 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v64) *= *(&virtual_machine->register0 + v78);
goto LABEL_193;
case 7LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v65 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v65 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v79 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v79 > 5 )
goto Error_about_invalid_register;
if ( !*(&virtual_machine->register0 + v79) )
{
virtual_machine->error_code = 5LL;
puts("ERROR: Divide by zero!");
return virtual_machine->error_code;
}
*(&virtual_machine->register0 + v65) /= (unsigned __int64)*(&virtual_machine->register0 + v79);
goto LABEL_193;
case 8LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v66 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v66 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v80 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v80 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v66) &= *(&virtual_machine->register0 + v80);
goto LABEL_193;
case 9LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v67 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v67 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v81 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v81 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v67) |= *(&virtual_machine->register0 + v81);
goto LABEL_193;
case 0xALL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v68 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v68 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v82 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v82 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v68) ^= *(&virtual_machine->register0 + v82);
goto LABEL_193;
case 0xBLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v69 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v69 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v69) = ~*(&virtual_machine->register0 + v69);
goto LABEL_193;
case 0xCLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v70 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v70 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v70) <<= atoi(v86, 0LL, 16LL);
goto LABEL_193;
case 0xDLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v71 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v71 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v71) = (unsigned __int64)*(&virtual_machine->register0 + v71) >> atoi(v86, 0LL, 16LL);
goto LABEL_193;
case 0xELL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v72 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v72 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v83 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v83 > 5 )
goto Error_about_invalid_register;
if ( *(&virtual_machine->register0 + v72) == *(&virtual_machine->register0 + v83) )
{
virtual_machine->flags_register = 0LL;
}
else if ( *(&virtual_machine->register0 + v72) <= (unsigned __int64)*(&virtual_machine->register0 + v83) )
{
virtual_machine->flags_register = 2LL;
}
else
{
virtual_machine->flags_register = 1LL;
}
goto LABEL_193;
case 0xFLL: // JMP
v54 = atoi(v85, 0LL, 10LL);
goto LABEL_168;
case 0x10LL: // JE
v54 = atoi(v85, 0LL, 10LL);
if ( virtual_machine->flags_register )
goto LABEL_193;
goto LABEL_168;
case 0x11LL: // JNE
v54 = atoi(v85, 0LL, 10LL);
if ( !virtual_machine->flags_register )
goto LABEL_193;
LABEL_168:
if ( !v54 || v54 > 0xFFF )
goto LABEL_179;
v55 = 0LL;
v56 = v54;
while ( 2 )
{
if ( v55 <= 0xFFF )
{
if ( v56 != 1 )
{
v21 = virtual_machine->input_data_addr;
if ( *(_BYTE *)(v21 + v55) == 10 )
--v56;
++v55;
continue;
}
LODWORD(v21) = v55;
virtual_machine->pc_register = v55;
}
break;
}
if ( v56 == 1 )
goto LABEL_193;
LABEL_179:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid jmp line: %ld!\n", v54, v21, v22, v23, v24);
return virtual_machine->error_code;
case 0x12LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) || (v73 = atoi((char *)v85 + 3, 0LL, 10LL), v73 > 5) )
{
Error_about_invalid_register:
virtual_machine->error_code = 3LL;
puts("ERROR: Invalid register!");
return virtual_machine->error_code;
}
*(&virtual_machine->register0 + v73) = atoi(v86, 0LL, 16LL);
break;
case 0x13LL:
if ( v53 )
{
virtual_machine->error_code = 6LL;
puts("ERROR: Syscall limit reached!");
return virtual_machine->error_code;
}
virtual_machine->unknow1 = atoi(v85, 0LL, 16LL);
v53 = 1LL;
virtual_machine->register0 = syscall(
virtual_machine->unknow1,
virtual_machine->register0,
virtual_machine->register1,
virtual_machine->register2,
virtual_machine->register3,
virtual_machine->register4,
virtual_machine->register5);
virtual_machine->unknow1 = -1LL;
goto LABEL_193;
case 0x14LL:
puts("------------------vmstate------------------");
printf(
(unsigned int)"pc: %#lx flags: %lx\n",
virtual_machine->pc_register,
virtual_machine->flags_register,
v25,
v26,
v27);
printf((unsigned int)"reg0: %#lx\n", virtual_machine->register0, v28, v29, v30, v31);
printf((unsigned int)"reg1: %#lx\n", virtual_machine->register1, v32, v33, v34, v35);
printf((unsigned int)"reg2: %#lx\n", virtual_machine->register2, v36, v37, v38, v39);
printf((unsigned int)"reg3: %#lx\n", virtual_machine->register3, v40, v41, v42, v43);
printf((unsigned int)"reg4: %#lx\n", virtual_machine->register4, v44, v45, v46, v47);
printf((unsigned int)"reg5: %#lx\n", virtual_machine->register5, v48, v49, v50, v51);
puts("-------------------------------------------");
virtual_machine->error_code = 0LL;
return virtual_machine->error_code;
default:
virtual_machine->error_code = 1LL;
puts("ERROR: Unknown opcode!");
return virtual_machine->error_code;
}
}
return 0LL;
}