首页
社区
课程
招聘
[求助]VC求函数大小思路
发表于: 2009-4-10 23:13 5158

[求助]VC求函数大小思路

2009-4-10 23:13
5158
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
typedef struct _code_block
{
        uint8_t*        code;        // 指令存放位置
        ulong                base;        // 参考处理地址
        size_t                size;        // 指令最大大小
} code_block;

size_t sizeof_function(code_block* block)
{
        vector<uint8_t*> il; // 存放每条指令的地址

        bool bresult = false;
        uint8_t* ip = block->code; // 当前反汇编指示符
        uint8_t* far_ip = ip; // 标识最远的那条指令

        size_t len = 0;
        while ( len < block->size )
        {
                xde_instr instr;
                uint8_t* next_ip;

                // 如果反汇编失败, 将导致解析结束
                if ( 0 == xde_disasm(ip, &instr) )
                        break;

                len += instr.len;

                il.push_back(ip); // 保存当前 ip
                next_ip = ip + instr.len; // 默认下一条指令

                // 检查当前指令是否是 jmp imm 类型的指令
                // 如果是则重新计算目标地址。
                if ( instr.opcode == 0xe9 ) // jmp imm32
                {
                        next_ip += instr.data_l[0];
                }
                else if ( instr.flag & C_REL ) // 如果是相对跳转
                {
                        if ( instr.len == 2 ) // jxx imm8 or loop imm8
                                next_ip += instr.data_c[0];
                        else if ( instr.len == 6 )
                                next_ip += instr.data_l[0];
                }
               
                // 检查下条指令是否超出范围
                if ( next_ip <= block->code || next_ip >= block->code + block->size )
                        break;

                // 如果下一条指令是往回跳,则检查其目的地址有效性
                if ( next_ip >= block->code && next_ip <= ip )
                {
                        if ( find(il.begin(), il.end(), far_ip) == il.end() )
                                break;
                }
               
                // 检查最远的那条指令是否已经处理过来
                if ( ip + instr.len > far_ip )
                {
                        if ( find(il.begin(), il.end(), far_ip) == il.end() ) // 出现花指令
                                break;
                }
               
                // 检测当前指令是否是最远的指令,而且当前这条指令是返回指令
                if ( far_ip == ip && (instr.flag & C_STOP) )
                {
                        bresult = true;
                        break;
                }
               
                // 检查最远的那条指令是否还是最远
                if ( next_ip > far_ip )
                        far_ip = next_ip; // 更新最远的地址

                ip += instr.len; // 顺序性的下条指令
        }

        return bresult ? len : 0;
}
2009-4-11 10:10
0
雪    币: 190
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
汗,太麻烦啦, 还要反汇编引擎。。。
2009-4-11 21:08
0
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
找sudami,他知道的。曾经出现过。。。
2009-4-13 17:00
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个我不知道.

判断函数结束不能单纯的靠ret /retn / nop / int 3 等指令.
有的函数是零碎的,有的函数ret指令在函数中间, 个人愚见,2楼的范例不错,...
2009-4-13 17:03
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
马甲?
2009-4-13 17:16
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
7
呵呵,sudami = sudaxx
2009-4-13 20:28
0
游客
登录 | 注册 方可回帖
返回
//