首页
社区
课程
招聘
[求助]有什么函数能代替SizeOfCode
发表于: 2012-5-25 13:20 6522

[求助]有什么函数能代替SizeOfCode

2012-5-25 13:20
6522
SizeOfCode真心无解
unsigned long __fastcall SizeOfCode(void *Code, unsigned char **pOpcode)
{
        PUCHAR cPtr;
        UCHAR Flags;
        BOOLEAN PFX66, PFX67;
        BOOLEAN SibPresent;
        UCHAR iMod, iRM, iReg;
        UCHAR OffsetSize, Add;
        UCHAR Opcode;

        OffsetSize = 0;
        PFX66 = FALSE;
        PFX67 = FALSE;
        cPtr = (PUCHAR)Code;

        while ( (*cPtr == 0x2E) || (*cPtr == 0x3E) || (*cPtr == 0x36) ||
                    (*cPtr == 0x26) || (*cPtr == 0x64) || (*cPtr == 0x65) ||
                        (*cPtr == 0xF0) || (*cPtr == 0xF2) || (*cPtr == 0xF3) ||
                        (*cPtr == 0x66) || (*cPtr == 0x67) )
        {
                if (*cPtr == 0x66) PFX66 = TRUE;
                if (*cPtr == 0x67) PFX67 = TRUE;
                cPtr++;
                if (cPtr > (PUCHAR)Code + 16) return 0;
        }
        Opcode = *cPtr;
        if (pOpcode) *pOpcode = cPtr;

        if (*cPtr == 0x0F)
        {
                cPtr++;
                Flags = OpcodeFlagsExt[*cPtr];
        } else
        {
                Flags = OpcodeFlags[Opcode];
               
                if (Opcode >= 0xA0 && Opcode <= 0xA3) PFX66 = PFX67;
        }
        cPtr++;
        if (Flags & OP_WORD) cPtr++;
       
        if (Flags & OP_MODRM)
        {
                iMod = *cPtr >> 6;
                iReg = (*cPtr & 0x38) >> 3;
                iRM  = *cPtr &  7;
                cPtr++;
               
                if ((Opcode == 0xF6) && !iReg) Flags |= OP_DATA_I8;
                if ((Opcode == 0xF7) && !iReg) Flags |= OP_DATA_PRE66_67;
               
                SibPresent = !PFX67 & (iRM == 4);
                switch (iMod)
                {
                        case 0:
                          if ( PFX67 && (iRM == 6)) OffsetSize = 2;
                          if (!PFX67 && (iRM == 5)) OffsetSize = 4;
                         break;
                        case 1: OffsetSize = 1;
                         break;
                        case 2: if (PFX67) OffsetSize = 2; else OffsetSize = 4;
                         break;
                        case 3: SibPresent = FALSE;
                }
                if (SibPresent)
                {
                        if (((*cPtr & 7) == 5) && ( (!iMod) || (iMod == 2) )) OffsetSize = 4;
                        cPtr++;
                }
                cPtr = (PUCHAR)(ULONG)cPtr + OffsetSize;
        }

        if (Flags & OP_DATA_I8)  cPtr++;
        if (Flags & OP_DATA_I16) cPtr += 2;
        if (Flags & OP_DATA_I32) cPtr += 4;
        if (PFX66) Add = 2; else Add = 4;
        if (Flags & OP_DATA_PRE66_67) cPtr += Add;
        return (ULONG)cPtr - (ULONG)Code;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你是要计算某条函数长吗
2012-5-27 06:55
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
计算函数长度可以使用两个函数,第一个函数是要计算的长度,然后在第一个后紧跟着第二个,它可以是个存根(空函数)或者别的函数都可。拿第二个减第一个得到函数的字节数。如果编译器不允许减使用_asm关键字即可。
不知此法能否行的通,我没试过。
2012-5-27 07:54
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ls的方法一定情况下是可以的,不过可能还和编译器以及选项设置有关。
2012-5-28 10:18
0
游客
登录 | 注册 方可回帖
返回
//