首页
社区
课程
招聘
[原创][分享]分享一个封装的反汇编引擎接口
发表于: 2014-8-15 13:48 8767

[原创][分享]分享一个封装的反汇编引擎接口

2014-8-15 13:48
8767

在这里主要是提供了两个接口。disasm_armv7和disasm_thumb,前者主要是对armv7进行反汇编,该接口封装了darm提供给的darm_armv7_disasm。后者主要是对thumb和thumb2进行反汇编,该接口封装了darm提供给的darm_thumb_disasm和darm_thumb_disasm。
自己定义的接口声明如下:
int disasm_armv7(const uint8_t* g_buf, uint32_t vaddr, uint32_t offset, uint32_t size);

int disasm_thumb(const uint8_t* g_buf, uint32_t vaddr, uint32_t offset, uint32_t size);

const uint8_t* g_buf //这里主要是指获取的文件缓冲区buffer起始位置
uint32_t vaddr        //这里是指映射到内存中的函数的起始位置
uint32_t offset //该函数在文件中的偏移
uint32_t size   //函数的大小

具体函数实现如下:
int disasm_armv7(const uint8_t* g_buf, uint32_t vaddr, uint32_t offset, uint32_t size)
{
    const uint32_t *code_32 = (const uint32_t *) &g_buf[offset];

    darm_t d; darm_str_t str;
    for (uint32_t idx = 0; idx < size / sizeof(uint32_t);
            idx++, vaddr += sizeof(uint32_t)) {

            //disasm armv7
            if(darm_armv7_disasm(&d, code_32[idx]) < 0) {

                    printf("#%06x %08x (..)\n", vaddr, code_32[idx]);
                    continue;

            }

            //translate opcodes into strings
        if(darm_str2(&d, &str, 1) < 0) {
            printf("#%06x %08x (..)\n", vaddr, code_32[idx]);
            continue;
        }

        printf("#%06x %08x %s\n", vaddr, code_32[idx], str.total);
    }
    return 0;
}
解析结果:armv7
#008d10 e59fc05c ldr r12, [pc, #92]
#008d14 e92d4800 push {r11,lr}
#008d18 e59f3058 ldr r3, [pc, #88]
#008d1c e28db004 add r11, sp, #4
#008d20 e24dd010 sub sp, sp, #16
#008d24 e08fc00c add r12, pc, r12
#008d28 e79c3003 ldr r3, [r12, r3]
#008d2c e50b3014 str r3, [r11, #-20]

int disasm_thumb(const uint8_t* g_buf, uint32_t vaddr, uint32_t offset, uint32_t size){

    const uint16_t *code    = (const uint16_t *) &g_buf[offset];

    darm_t d; darm_str_t str;

    for (uint32_t idx = 0; idx < size / sizeof(uint32_t);
                idx++, vaddr += 2) {

                if(darm_thumb_disasm(&d, *(code+idx)) < 0) {

                        //if darm_thumb_disasm() failed, then calling darm_thumb2_disasm() function
                        if(darm_thumb2_disasm(&d, code[idx], code[idx+1]) < 0){
                                continue;
                        }else{
                                if(darm_str2(&d, &str, 1) < 0) {
                                        printf("#%06x %04x (..)\n", vaddr, code[idx]);
                                        continue;
                                }

                                printf("#%06x %04x%04x %s\n", vaddr, code[idx+1], code[idx], str.total);
                                idx++;
                                vaddr += 2;
                        }

                        continue;
                }
                if(darm_str2(&d, &str, 1) < 0) {
                        printf("#%06x %04x (..)\n", vaddr, code[idx]);
                        continue;
                }

                printf("#%06x %04x %s\n", vaddr, code[idx], str.total);
    }
}
解析结果: thumb和thumb2
#008da0 4601 mov r1, r0
#008da2 4808 ldr r0, [pc, #32]
#008da4 b508 push {r3,lr}
#008da6 4478 add r0, r0, pc
#008da8 eea2f7ff blx #+-700
#008dac 4806 ldr r0, [pc, #24]
#008dae 4478 add r0, r0, pc


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
想转成vc工程。怎奈里面结构的初始化方式vc不支持。楼主有么
2014-8-15 16:35
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
这里面使用的一些头文件VS没有提供。
建议弄成Eclipse+Cygwin编译
2014-8-15 18:16
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主反汇编成功了么?我编译的时候里面缺少darm-tbl.h,这该如何是好
2014-8-26 20:41
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
在darm里面有这个文件吧。我编译是成功的
2014-8-27 09:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
自从有了这个
http://www.capstone-engine.org/
再也不用其他的引擎了~
2014-8-27 09:59
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
能交流下如何编译的么?
2014-8-27 10:03
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
昨天跟Darm的作者发邮件,她也推荐了这个反汇编引擎。。。赞,还支持arm64
2014-8-27 10:04
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
capstone 确实不错,但用的是 c++ 头文件封装的方式。
2014-8-27 10:17
0
雪    币: 92
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
为什么用 "但" ?

C++ 骨灰级粉丝表示不服
2014-9-3 12:13
0
游客
登录 | 注册 方可回帖
返回
//