首页
社区
课程
招聘
[原创][修改]打造自己的反汇编引擎
发表于: 2011-10-12 12:32 22201

[原创][修改]打造自己的反汇编引擎

2011-10-12 12:32
22201

原始信息来自http://bbs.pediy.com/showthread.php?t=75094
本人水平有限,没有太多理论,只是增强了PE的处理,并稍微hack了一下代码。
为什么要增强?处理特定文件格式(比如PE、ELF)并不是反汇编器的功能,原作者仅仅演示了一下如何编写和使用反汇编器,没有深入处理特定文件格式也不奇怪
主要增强如下:
1) load整个PE,而不是只处理.text节
         这样就可以处理.sys等entry point不在.text段的程序
         跨段的调用、引用也能正常处理

2) 从entry point开始反汇编,只有引用到的代码才反汇编
         反汇编整个.text很可能会得到不准确的结果。对于用C编写的程序,导出函数和entry point引用到的函数覆盖了所有的代码。
         数据段、资源段等“非代码”段在开始反汇编之前就被排除掉了
         当前的输出没有按照地址排序,比较凌乱

3) 检测对字符常量和导入函数的引用
          如果找到了引用的目标,就输出在后面

4) 检测代码块的结束
         无条件跳转指令(JMP)和返回指令(ret,retn)

5) 增加了对实模式代码的处理(不完善)
         检测返回DOS的调用

主要修改:
1) 一处原作者忘记转换偏移量的类型(应该是signed displacement)而导致算错偏移量的问题
     与IDA对比时发现的

2) 增加了浮点指令的反汇编(有问题)
      没有读intel的指令手册,仅仅是“依葫芦画瓢”,结果可想而知。(原来遇到浮点指令显示为 ???,现在是乱抓了一条来充数)

待增强功能:
1)反汇编浮点(d8~df)和f0 xx序列

文件说明:
    dasm.exe 修改后的执行文件
    dasm.txt  用dasm.exe反汇编它自己的输出
    filedisk.sys v1.7版(?)的filedisk驱动(该软件开源,地球人应该都知道吧?)
    filedisk.asm IDA 反汇编filedisk.sys的输出
    filedisk.idb  IDA 5.2生成的数据库,6.1版的IDA应该也能打开吧(?)
    filedisk.txt 用dasm.exe反汇编filedisk.sys的输出
    dasmMain.exe 原作者编译的执行文件
    *.h *.c *.dsw *.dsp  工程文件和源码

(原作者的代码可以在前面的链接页面里面找到,dasm.rar。)

实例效果:(来自filedisk.txt)
===============================
11550: Proc_11550 proc

11550: Loc_11550:
11550: mov        edi, edi                        ;8B FF
11552: push        ebp                            ;55
11553: mov        ebp, esp                        ;8B EC
11555: mov        eax, dword ptr [ebp + 8h]       ;8B 45 08
11558: push        esi                            ;56
11559: mov        esi, dword ptr [eax + 28h]      ;8B 70 28
1155C: push        0h                             ;6A 00
1155E: push        dword ptr [esi + Ch]           ;FF 76 0C
11561: call        dword ptr [10C04h]             ;FF 15 04 0C 01 00  ExFreePoolWithTag
11567: push        dword ptr [esi + 4h]           ;FF 76 04
1156A: call        dword ptr [10C38h]             ;FF 15 38 0C 01 00  ZwClose
11570: mov        eax, dword ptr [ebp + Ch]       ;8B 45 0C
11573: mov        byte ptr [esi], 0h              ;C6 06 00
11576: and        dword ptr [eax + 18h], 0h       ;83 60 18 00
1157A: and        dword ptr [eax + 1Ch], 0h       ;83 60 1C 00
1157E: xor        eax, eax                        ;33 C0
11580: pop        esi                             ;5E
11581: pop        ebp                             ;5D
11582: retn        8h                             ;C2 08 00
11550: Proc_12FD9C endp
===============================

(来自dasm.txt, main()片段)

===============================
402180: Proc_402180 proc

402180: Loc_402180:
402180: mov        eax, dword ptr [esp + 4h]       ;8B 44 24 04
402184: sub        esp, 164h                       ;81 EC 64 01 00 00
40218A: cmp        eax, 2h                         ;83 F8 02
40218D: push        ebx                            ;53
40218E: push        ebp                            ;55
40218F: push        esi                            ;56
402190: push        edi                            ;57
402191: jz        short Loc_4021A9                 ;74 16 ->
402193: push        408418h                        ;68 18 84 40 00  string 'Usage: dasm.exe PEFile
'
402198: call        dword ptr [40702Ch]            ;FF 15 2C 70 40 00  printf
40219E: add        esp, 4h                         ;83 C4 04
4021A1: push        0h                             ;6A 00
4021A3: call        dword ptr [40703Ch]            ;FF 15 3C 70 40 00  exit
4021A9: mov        esi, dword ptr [esp + 17Ch + 0h];8B B4 24 7C 01 00 00
4021B0: mov        eax, dword ptr [esi + 4h]       ;8B 46 04
4021B3: push        eax                            ;50
4021B4: call        Proc_405430                    ;E8 77 32 00 00 =>
4021B9: mov        ecx, dword ptr [esi + 4h]       ;8B 4E 04
4021BC: mov        ebx, dword ptr [40702Ch]        ;8B 1D 2C 70 40 00  printf
4021C2: push        ecx                            ;51
4021C3: push        408414h                        ;68 14 84 40 00  string '%s
'
4021C8: mov        ebp, eax                        ;8B E8
4021CA: call        ebx                            ;FF D3
4021CC: push        408404h                        ;68 04 84 40 00  string 'DOS Header:
'
4021D1: call        ebx                            ;FF D3
4021D3: push        4083B8h                        ;68 B8 83 40 00  string '=========================================================================
'
4021D8: call        ebx                            ;FF D3
4021DA: lea        edx, dword ptr [esp + 28h]      ;8D 54 24 28
4021DE: push        edx                            ;52
4021DF: push        ebp                            ;55
4021E0: call        Proc_405470                    ;E8 8B 32 00 00 =>
4021E5: sub        esp, 24h                        ;83 EC 24
4021E8: mov        ecx, Fh                         ;B9 0F 00 00 00
4021ED: lea        esi, dword ptr [esp + 54h]      ;8D 74 24 54
4021F1: mov        edi, esp                        ;8B FC
4021F3: rep        movsd                                  ;F3 A5
4021F5: movsw                                      ;66 A5
4021F7: call        Proc_4054C0                    ;E8 C4 32 00 00 =>
4021FC: mov        eax, dword ptr [esp + 90h + 0h] ;8B 84 24 90 00 00 00
402203: add        esp, 40h                        ;83 C4 40
402206: cmp        ax, 1Eh                         ;66 3D 1E 00
40220A: jb        Loc_402325                       ;0F 82 15 01 00 00 ->
402210: mov        ecx, dword ptr [esp + 2Ch]      ;8B 4C 24 2C
402214: test        cx, cx                         ;66 85 C9
402217: jz        short Loc_40222D                 ;74 14 ->
402219: cmp        cx, ax                          ;66 3B C8
40221C: jnb        short Loc_40222D                ;73 0F ->
40221E: and        ecx, FFFFh                      ;81 E1 FF FF 00 00
402224: and        eax, FFFFh                      ;25 FF FF 00 00
402229: sub        eax, ecx                        ;2B C1
40222B: jmp        short Loc_402235                ;EB 08 ->

402235: Loc_402235:
402235: mov        esi, eax                        ;8B F0
402237: push        esi                            ;56
402238: push        esi                            ;56
402239: push        408388h                        ;68 88 83 40 00  string '
disassemly dos stub code, %d(0x%x) bytes
'
40223E: call        ebx                            ;FF D3
402240: push        esi                            ;56
402241: call        dword ptr [407094h]            ;FF 15 94 70 40 00  malloc
402247: mov        edi, eax                        ;8B F8
402249: add        esp, 10h                        ;83 C4 10
40224C: test        edi, edi                       ;85 FF
40224E: jnz        short Loc_40226F                ;75 1F ->
402250: mov        eax, dword ptr [407020]         ;A1 20 70 40 00  _iob
402255: push        40836Ch                        ;68 6C 83 40 00  string 'Memory allocation error !
'
40225A: add        eax, 40h                        ;83 C0 40
40225D: push        eax                            ;50
40225E: call        dword ptr [40701Ch]            ;FF 15 1C 70 40 00  fprintf
402264: add        esp, 8h                         ;83 C4 08
402267: push        FFh                            ;6A FF
402269: call        dword ptr [40703Ch]            ;FF 15 3C 70 40 00  exit
40226F: mov        eax, dword ptr [esp + 2Ch]      ;8B 44 24 2C
402273: cmp        ax, word ptr [esp + 50h]        ;66 3B 44 24 50
402278: jnb        short Loc_40228C                ;73 12 ->
40227A: and        eax, FFFFh                      ;25 FF FF 00 00
40227F: push        0h                             ;6A 00
402281: push        eax                            ;50
402282: push        ebp                            ;55
402283: call        dword ptr [407038h]            ;FF 15 38 70 40 00  fseek
402289: add        esp, Ch                         ;83 C4 0C
40228C: push        ebp                            ;55
40228D: push        esi                            ;56
40228E: push        1h                             ;6A 01
402290: push        edi                            ;57
402291: call        dword ptr [407034h]            ;FF 15 34 70 40 00  fread
402297: mov        ecx, dword ptr [esp + 3Ah]      ;8B 4C 24 3A
40229B: push        esi                            ;56
40229C: and        ecx, FFFFh                      ;81 E1 FF FF 00 00
4022A2: shl        ecx, 10h                        ;C1 E1 10
4022A5: push        ecx                            ;51
4022A6: call        Proc_401000                    ;E8 55 ED FF FF <=
4022AB: mov        edx, dword ptr [esp + 42h]      ;8B 54 24 42
4022AF: mov        eax, dword ptr [esp + 40h]      ;8B 44 24 40
4022B3: and        edx, FFFFh                      ;81 E2 FF FF 00 00
4022B9: and        eax, FFFFh                      ;25 FF FF 00 00
4022BE: shl        edx, 10h                        ;C1 E2 10
4022C1: or        edx, eax                         ;0B D0
4022C3: push        edx                            ;52
4022C4: call        Proc_401270                    ;E8 A7 EF FF FF <=
4022C9: mov        ecx, dword ptr [esp + 46h]      ;8B 4C 24 46
4022CD: mov        edx, dword ptr [esp + 44h]      ;8B 54 24 44
4022D1: and        ecx, FFFFh                      ;81 E1 FF FF 00 00
4022D7: and        edx, FFFFh                      ;81 E2 FF FF 00 00
4022DD: shl        ecx, 10h                        ;C1 E1 10
4022E0: or        ecx, edx                         ;0B CA
4022E2: mov        dword ptr [40AB34h], 1h         ;C7 05 34 AB 40 00 01 00 00 00
4022EC: push        ecx                            ;51
4022ED: push        408350h                        ;68 50 83 40 00  string '%X:  realmode_entry_point:
'


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (17)
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
火前留名~
2011-10-12 16:30
0
雪    币: 8905
活跃值: (4218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶~~~~~
2011-10-12 21:51
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
收藏一份
2011-10-12 23:52
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
把前面的贴也看了一篇,很有意思,慢慢琢磨代码。
2011-10-13 04:43
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏一份,备用

3q
2011-10-13 10:51
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
收藏,研究研究。
2011-10-13 11:24
0
雪    币: 4902
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很好
来学习哈。。。
2011-10-13 12:01
0
雪    币: 7962
活跃值: (4714)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
非常强大 mark学习下
2011-10-13 22:10
0
雪    币: 237
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
markkkkkkkkkkk
2011-10-19 10:34
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
非常好,坐前面学习中。
2011-10-19 23:55
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,收下了。
2011-10-20 00:10
0
雪    币: 2503
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看看溜达溜达 逛逛!!!
2011-10-22 20:48
0
雪    币: 198
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢分享。                     .
2011-10-24 21:25
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我记得好像代码结束都是Int 3,数据结束都是N个$00 $00
2011-10-31 16:15
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢 下载一份来看看
2011-11-3 00:08
0
雪    币: 353
活跃值: (57)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
17
1. 我是按高级语言的流程来分析,遇到ret, iret或无条件跳转(jmp)就认为已经到达模块的底部,不再继续往下分析。
2. 函数模块的间隙通常是用0x00,0xC30或xCD来填充,与编译器和是否包含调试信息有关,不能一概而论。
3. 字符串常量和switch-case的跳转表通常是嵌在代码内部(.text),而非放在数据段里面(.data),这样做的原因可能为了免除链接时重定位,或者提高cache的命中率,即优化缓存。这些是纯数据,反汇编它们反而会扰乱流程分析,得出错误的反汇编结果。
2011-11-12 10:35
0
雪    币: 870
活跃值: (2264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习一下
2018-7-26 17:34
0
游客
登录 | 注册 方可回帖
返回
//