📄 compiler.cpp
字号:
pmas->mas_compiled_code[count++] = 0x12;
}
}
if (type_conv == 2 && level == 1)
{
pmas->mas_compiled_code[count++] = 0x83; // add edx, 1
pmas->mas_compiled_code[count++] = 0xC2;
pmas->mas_compiled_code[count++] = 0x01;
}
else
{
pmas->mas_compiled_code[count++] = 0x83; // add edx, 3
pmas->mas_compiled_code[count++] = 0xC2;
pmas->mas_compiled_code[count++] = 0x03;
}
pmas->mas_compiled_code[count++] = 0x76; // jna +0Dh
pmas->mas_compiled_code[count++] = 0x0D;
pmas->mas_compiled_code[count++] = 0x52; // push edx
pmas->mas_compiled_code[count++] = 0xFF; // call dword ptr [OffsetOfMakePageInFunction]
pmas->mas_compiled_code[count++] = 0x15;
*(int *)(pmas->mas_compiled_code + count) = (int)(&OffsetOfMakePageInFunction);
count += 4;
pmas->mas_compiled_code[count++] = 0x0B; // or eax, eax
pmas->mas_compiled_code[count++] = 0xC0;
if (type_conv == 1 && level > 1)
tmp = 0xE2;
else if (type_conv == 2 && level > 1)
tmp = 0xDD;
else
tmp = 0xE7;
pmas->mas_compiled_code[count++] = 0x74; // jz -E2
pmas->mas_compiled_code[count++] = (UCHAR)tmp;
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, ebx
pmas->mas_compiled_code[count++] = 0xC3;
if (level > 1)
{
pmas->mas_compiled_code[count++] = 0x49; // dec ecx
if (type_conv == 1)
tmp = 0xD0;
else if (type_conv == 2)
tmp = 0xCB;
else
tmp = 0xD5;
pmas->mas_compiled_code[count++] = 0x75; // jnz -D0
pmas->mas_compiled_code[count++] = UCHAR(tmp);
}
}
else
{
pmas->mas_compiled_code[count++] = 0xEB; // jmp +
if (cmp_exit == 0)
pmas->mas_compiled_code[count++] = 0x05;
else if (cmp_exit == 1)
pmas->mas_compiled_code[count++] = 0x0A;
else if (cmp_exit == 2)
pmas->mas_compiled_code[count++] = 0x09;
else if (cmp_exit == 3)
pmas->mas_compiled_code[count++] = 0x07;
else if (cmp_exit == 4)
pmas->mas_compiled_code[count++] = 0x0B;
else
pmas->mas_compiled_code[count++] = 0x05;
}
switch (cmp_exit)
{
case 0: // if dword == dword
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, dword ptr [eax]
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x3B; // cmp eax, dword [ebp + offset]
pmas->mas_compiled_code[count++] = 0x45;
pmas->mas_compiled_code[count++] = offset_sec;
break;
case 1: // if dword == word
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, dword ptr [eax]
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x33; // xor edx, edx
pmas->mas_compiled_code[count++] = 0xD2;
pmas->mas_compiled_code[count++] = 0x66; // mov dx, word ptr [ebp + offset]
pmas->mas_compiled_code[count++] = 0x8B;
pmas->mas_compiled_code[count++] = 0x55;
pmas->mas_compiled_code[count++] = offset_sec;
pmas->mas_compiled_code[count++] = 0x3B; // cmp eax, edx
pmas->mas_compiled_code[count++] = 0xC2;
break;
case 2: // if dword == byte
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, dword ptr [eax]
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x33; // xor edx, edx
pmas->mas_compiled_code[count++] = 0xD2;
pmas->mas_compiled_code[count++] = 0x8A; // mov dl, word ptr [ebp + offset]
pmas->mas_compiled_code[count++] = 0x55;
pmas->mas_compiled_code[count++] = offset_sec;
pmas->mas_compiled_code[count++] = 0x3B; // cmp eax, edx
pmas->mas_compiled_code[count++] = 0xC2;
break;
case 3: // if word == word
pmas->mas_compiled_code[count++] = 0x66; // mov ax, word ptr [eax]
pmas->mas_compiled_code[count++] = 0x8B;
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x66; // cmp ax, word [ebp + offset]
pmas->mas_compiled_code[count++] = 0x3B;
pmas->mas_compiled_code[count++] = 0x45;
pmas->mas_compiled_code[count++] = offset_sec;
break;
case 4: // if word == byte
pmas->mas_compiled_code[count++] = 0x66; // mov ax, word ptr [eax]
pmas->mas_compiled_code[count++] = 0x8B;
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x33; // xor edx, edx
pmas->mas_compiled_code[count++] = 0xD2;
pmas->mas_compiled_code[count++] = 0x8A; // mov dl, word ptr [ebp + offset]
pmas->mas_compiled_code[count++] = 0x55;
pmas->mas_compiled_code[count++] = offset_sec;
pmas->mas_compiled_code[count++] = 0x66; // cmp ax, dx
pmas->mas_compiled_code[count++] = 0x3B;
pmas->mas_compiled_code[count++] = 0xC2;
break;
case 5: // if byte == byte
pmas->mas_compiled_code[count++] = 0x8A; // mov al, byte ptr [eax]
pmas->mas_compiled_code[count++] = 0x00;
pmas->mas_compiled_code[count++] = 0x3A; // cmp al, byte [ebp + offset]
pmas->mas_compiled_code[count++] = 0x45;
pmas->mas_compiled_code[count++] = offset_sec;
}
break;
/////////////////////////////////////////////////////////////////////////////////
// in case *eax == *edx
/////////////////////////////////////////////////////////////////////////////////
case 0x1101110:
if (type_convertion_fir == 0 || type_convertion_fir == 3)
type_convertion_fir = 4;
if (type_convertion_sec == 0 || type_convertion_sec == 3)
type_convertion_sec = 4;
if (type_convertion_fir != type_convertion_sec)
return false;
if (reg_size_fir != 4 || reg_size_sec != 4)
return false;
if (pointer_level_fir > 1)
{
pmas->mas_compiled_code[count++] = 0xB9; // mov ecx, pointer_level
*(int *)(pmas->mas_compiled_code + count) = pointer_level_fir;
count += 4;
}
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, [ebp + offset]
pmas->mas_compiled_code[count++] = 0x45;
pmas->mas_compiled_code[count++] = reg_offset_fir;
if (pointer_level_fir > 1)
{
pmas->mas_compiled_code[count++] = 0xEB; // jmp +2
pmas->mas_compiled_code[count++] = 0x02;
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, dword ptr [eax]
pmas->mas_compiled_code[count++] = 0x00;
}
pmas->mas_compiled_code[count++] = 0x50; // push eax
pmas->mas_compiled_code[count++] = 0xFF; // call dword ptr [OffsetOfMakePageInFunction]
pmas->mas_compiled_code[count++] = 0x15;
*(int *)(pmas->mas_compiled_code + count) = (int)(&OffsetOfMakePageInFunction);
count += 4;
pmas->mas_compiled_code[count++] = 0x0B; // or eax, eax
pmas->mas_compiled_code[count++] = 0xC0;
pmas->mas_compiled_code[count++] = 0x75; // jne +5
pmas->mas_compiled_code[count++] = 0x05;
pmas->mas_compiled_code[count++] = 0xB4; // mov ah, byte_for_reverse_eflags
pmas->mas_compiled_code[count++] = byte_for_reverse_eflags;
pmas->mas_compiled_code[count++] = 0x9E; // sahf
tmp = 0;
switch (type_convertion_fir)
{
case 4:
(pointer_level_fir > 1) ? tmp = 0x2E : tmp = 0x2B;
break;
case 2:
(pointer_level_fir > 1) ? tmp = 0x39 : tmp = 0x2C;
break;
case 1:
(pointer_level_fir > 1) ? tmp = 0x33 : tmp = 0x15;
}
if (pointer_level_sec > 1) tmp += 9;
pmas->mas_compiled_code[count++] = 0xEB; // jmp +tmp
pmas->mas_compiled_code[count++] = (UCHAR)tmp;
if (type_convertion_fir != 1 || pointer_level_fir > 1)
{
pmas->mas_compiled_code[count++] = 0x8B; // mov ebx, eax
pmas->mas_compiled_code[count++] = 0xD8;
pmas->mas_compiled_code[count++] = 0x8B; // mov edx, eax
pmas->mas_compiled_code[count++] = 0xD0;
if ((type_convertion_fir == 2 || type_convertion_fir == 1) && pointer_level_fir > 1)
{
pmas->mas_compiled_code[count++] = 0x83; // cmp ecx, 1
pmas->mas_compiled_code[count++] = 0xF9;
pmas->mas_compiled_code[count++] = 0x01;
if (type_convertion_fir == 2)
{
pmas->mas_compiled_code[count++] = 0x75; // jnz +5
pmas->mas_compiled_code[count++] = 0x05;
pmas->mas_compiled_code[count++] = 0x83; // add edx, 1
pmas->mas_compiled_code[count++] = 0xC2;
pmas->mas_compiled_code[count++] = 0x01;
pmas->mas_compiled_code[count++] = 0xEB; // jmp +3h
pmas->mas_compiled_code[count++] = 0x03;
}
else
{
pmas->mas_compiled_code[count++] = 0x74; // jz +0F
pmas->mas_compiled_code[count++] = 0x12;
}
}
if (type_convertion_fir == 2 && pointer_level_fir == 1)
{
pmas->mas_compiled_code[count++] = 0x83; // add edx, 1
pmas->mas_compiled_code[count++] = 0xC2;
pmas->mas_compiled_code[count++] = 0x01;
}
else
{
pmas->mas_compiled_code[count++] = 0x83; // add edx, 3
pmas->mas_compiled_code[count++] = 0xC2;
pmas->mas_compiled_code[count++] = 0x03;
}
pmas->mas_compiled_code[count++] = 0x76; // jna +0Dh
pmas->mas_compiled_code[count++] = 0x0D;
pmas->mas_compiled_code[count++] = 0x52; // push edx
pmas->mas_compiled_code[count++] = 0xFF; // call dword ptr [OffsetOfMakePageInFunction]
pmas->mas_compiled_code[count++] = 0x15;
*(int *)(pmas->mas_compiled_code + count) = (int)(&OffsetOfMakePageInFunction);
count += 4;
pmas->mas_compiled_code[count++] = 0x0B; // or eax, eax
pmas->mas_compiled_code[count++] = 0xC0;
if (pointer_level_fir > 1)
{
switch (type_convertion_fir)
{
case 4:
pmas->mas_compiled_code[count++] = 0x74; // jz -E7
pmas->mas_compiled_code[count++] = 0xE7;
break;
case 2:
pmas->mas_compiled_code[count++] = 0x74; // jz -DD
pmas->mas_compiled_code[count++] = 0xDD;
break;
case 1:
pmas->mas_compiled_code[count++] = 0x74; // jz -E2
pmas->mas_compiled_code[count++] = 0xE2;
}
}
else
{
pmas->mas_compiled_code[count++] = 0x74; // jz -E7
pmas->mas_compiled_code[count++] = 0xE7;
}
pmas->mas_compiled_code[count++] = 0x8B; // mov eax, ebx
pmas->mas_compiled_code[count++] = 0xC3;
if (pointer_level_fir > 1)
{
switch (type_convertion_fir)
{
case 4:
pmas->mas_compiled_code[count++] = 0x49; // dec ecx
pmas->mas_compiled_code[count++] = 0x75; // jnz -D5
pmas->mas_compiled_code[count++] = 0xD5;
break;
case 2:
pmas->mas_compiled_code[count++] = 0x49; // dec ecx
pmas->mas_compiled_code[count++] = 0x75; // jnz -CB
pmas->mas_compiled_code[count++] = 0xCB;
break;
case 1:
pmas->mas_compiled_code[count++] = 0x49; // dec ecx
pmas->mas_compiled_code[count++] = 0x75; // jnz -D0
pmas->mas_compiled_code[count++] = 0xD0;
}
}
}
switch (type_convertion_fir)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -