⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compiler.cpp

📁 ICEExt for Driver Studio3.2的sourcecode
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        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 + -