最新公告
  • 欢迎您光临悠哉网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 网络安全攻防:软件逆向之反汇编

     

    1. 逆向工程

    逆向工程(RE,Reverse Engineering)是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在不能轻易获得必要的生产信息下,直接从成品的分析,推导出产品的设计原理。

    2. 基本概念

    机器码(Machine Code):电脑CPU可直接解读的数据,也被称为原生码(Native Code),与运行平台有关。

    汇编语言(Assembly Language):用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址,方便程序员编写代码。汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。主流的有ARM汇编和x86汇编。

    CPU寄存器:用来暂时存储指令、数据和地址,包括通用寄存器、专用寄存器和控制寄存器。逆向分析时需要注意特殊寄存器的变化。

    WinAPI:Windows 操作系统中可用的内核应用程序编程接口,在 Windows 平台研究学习逆向工程需要了解一些WinAPI编程。

    3. 反汇编

    反汇编是把目标代码转化为汇编代码、将低级代码转化为高级代码的过程。

    以最著名的HelloWorld为例,先在Visual Studio中新建一个HelloWorld项目如下所示。

    1. //HelloWorld.cpp: 定义控制台应用程序的入口点。 
    2. #include"stdafx.h"  
    3. #include<stdio.h>  
    4. int_tmain(int argc,_TCHAR*argv[])  
    5.  
    6. printf("HelloWorld\\n");  
    7. return 0;  

    在生成→配置管理器→活动解决方案配置选择Release。选择Release模式生成可执行文件,程序代码会更简洁,方便调试,如图1所示。

    图1  Release模式

    此时生成的是HelloWorld.exe的可执行文件,已经不能直接看到程序的源码。通过该可执行文件还原出汇编代码的过程就是反汇编。我们用OllyDbg加载该程序可以轻松地看到反汇编代码,如图2所示。

    图2  反汇编代码

    4. 常见的工具

    OllyDbg是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,已代替SoftICE成为当今最为流行的调试解密工具。同时还支持插件扩展功能,是目前最强大的调试工具。运行界面如图3所示。

    图3  OllyDbg运行界面

    IDA Pro 32/64:IDA Pro简称IDA(Interactive Disassembler),是一个世界顶级的交互式反汇编工具,有两种可用版本。标准版(Standard)支持20多种处理器,高级版(Advanced)支持50多种处理器,运行界面如图4所示。

    图4  IDA Pro运行界面

    SoftIce:SoftIce是Compuware NuMega公司的产品,是Windows2000及之前的内核级调试工具,兼容性和稳定性极好,可在源代码级调试各种应用程序和设备驱动程序,也可使用TCP/IP连接进行远程调试。但目前微软的Windbg方便性、可靠性及可用性远远超出SoftICE,且免费使用。所以SoftIce并没有推后续版本。

    WinDbg:WinDbg 是在 Windows 平台下,强大的用户态和内核态调试工具。相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比Visual Studio更为强大。它的另外一个用途是可以用来分析Dump数据,程序运行如图5所示。

    图5  WinDbg运行界面

    5. 分类识别工具

    在第一次拿到一个文件时,我们需要确定这是一个什么类型的文件。通常可以通过文件扩展名确定。有时候文件扩展名并没有什么实际意义,所以不能通过扩展名来确定文件类型。

    (1)file

    在大多数 Linux 系统中都带有这个实用工具。file 通过检查某些特定字段来确定文件类型,如下。

    1. root@kail:~/Desktop# file HelloWorld.exe  
    2. HelloWorld.exe: PE32 executable for MS Windows(console)Intel 80386 32-bit  
    3. root@kali:~/Desktop# file a  
    4. a:ASCII text 

    常见命令:file[-bchikLnNprsvz][-f namefile][-F separator][-mmagicfiles]file。命令参数及描述如表1所示。

    表1  file命令参数及描述

    (2)PE tools

    PE tools用于分析Windows系统中正在运行的进程和可执行文件,主界面如图6所示,列出了所有活动进程和每个进程调用的动态链接库。

    图6  PE tools主界面

    (3)PEiD

    PEiD 是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名,运行界面如图7所示。

    图7  PEiD运行界面

    6. 摘要工具

    一般情况下,我们可以获得的都是二进制程序文件,所有也只能对二进制程序进行逆向。在对文件有了初步的了解和分类后,需要对特定的文件格式进行解析。

    (1)nm

    nm是names的缩写。nm命令主要是用来列出某些文件中的符号,如一些函数和全局变量。在Linux下面重新编译生成了Helloworld,用nm命令分别查看效果,命令:nm Helloworld,运行如下。

    1. root@kali:~/Desktop# nm Helloworld  
    2. 00000000006008e8 B __bss_start  
    3. 00000000006008e8 b completed.6979  
    4. 00000000006008d8 D __data_start  
    5. 00000000006008d8 W data_start  
    6. 0000000000400420 t deregister_tm_clones  
    7. 00000000004004a0 t__do_global_dtors_aux  
    8. 00000000006006c8 t__do_global_dtors_aux_fini_array_entry  
    9. 00000000006008e0 D__dso_handle  
    10. 00000000006006d8 d_DYNAMIC  
    11. 00000000006008e8 D_edata  
    12. 00000000006008f0 B_end  
    13. 0000000000400574 T_fini  
    14. 00000000004004c0 t frame_dummy  
    15. 00000000006006c0 t__frame_dummy_init_array_entry  
    16. 00000000004006b8 r__FRAME_END__  
    17. 00000000006008b0 d_GLOBAL_OFFSET_TABLE_  
    18. w__gmon_start__  
    19. 0000000000400590 r__GNU_EH_FRAME_HDR  
    20. 0000000000400390 T_init  
    21. 00000000006006c8 t__init_array_end  
    22. 00000000006006c0 t__init_array_start  
    23. 0000000000400580 R_IO_stdin_used  
    24. w_ITM_deregisterTMCloneTable  
    25. w_ITM_registerTMCloneTable  
    26. 00000000006006d0 d__JCR_END__  
    27. 00000000006006d0 d__JCR_LIST__  
    28. w_Jv_RegisterClasses  
    29. 0000000000400570 T__libc_csu_fini  
    30. 0000000000400500 T__libc_csu_init  
    31. U__libc_start_main@@GLIBC_2.2.5  
    32. 00000000004004e6 T main  
    33. U puts@@GLIBC_2.2.5  
    34. 0000000000400460 t register_tm_clones  
    35. 00000000004003f0 T_start  
    36. 00000000006008e8 D__TMC_END__ 

    输出字符含义如表2所示。

    表2  输出字符含义

    (2)ldd

    ldd(List Dynamic Dependencies)是Linux上自带的脚本,用来列出可执行文件所需的动态库。命令:ldd Helloworld。

    1. root@kali:~/Desktop#ldd Helloworld  
    2. linux-gate.so.1=>(0xb77ef000)  
    3. libc.so.6=>/lib/tls/i686/cmov/libc.so.6(0xb7683000)  
    4. /lib/ld-linux.so.2(0xb77f0000) 

    (3)Objdump

    Objdump 是一个十分强大的工具,可以灵活地查询文件的各种信息,有大概 30个可选项,可以通过objdump –help查询。简单查看反汇编代码使用如下:Objdump-d helloworld,运行部分如下。

    1. root@kaili:~/Desktop# objdump-d Helloworld  
    2. HelloWorld:文件格式 elf64-x86-64  
    3. Disassembly of section.init:  
    4. 0000000000400390 <_init> 
    5. 400390:48 83 ec 08 sub $0x8,%rsp  
    6. 400394:48 8b 05 0d 05 20 00 mov 0x20050d(%rip),%rax #6008a8<_DYNAMIC+0x1d0>  
    7. 40039b:48 85 c0 test %rax,%rax  
    8. 40039e: 74 05 je 4003a5<_init+0x15>  
    9. 4003a0: e8 3b 00 00 00 callq 4003e0<__libc_start_main@plt+0x10>  
    10. 4003a5: 48 83 c4 08 add $0x8,%rsp  
    11. 4003a9: c3 retq  
    12. Disassembly of section.plt:  
    13. 00000000004003b0 <puts@plt-0x10> 
    14. 4003b0:ff 35 02 05 20 00 pushq 0x200502(%rip) # 6008b8<_GLOBAL_OFFSET_TABLE_+0x8>  
    15. 4003b6:ff 25 04 05 20 00 jmpq *0x200504(%rip) # 6008c0<_GLOBAL_OFFSET_TABLE_+0x10>  
    16. 4003bc: 0f 1f 40 00 nopl 0x0(%rax) 

    (4)Otool

    可以获取OS X二进制文件的相关信息。类似objdump的实用工具。

    (5)Dumpbin

    微软VisualStudio工具套件里的一个命令行工具。主要用于Windows PE文件相关信息的获取。用法类似Objdump。

    7. 深度检测工具

    strings实用工具专门用于提取文件中的字符串内容,通常使用该工具不会受到文件格式的限制。使用strings的默认设置(至少包含4个字符的7位ASCII序列)。用strings对Helloworld进行检测,部分代码如下。

    1. root@kaili:~/Desktop# strings Helloworld  
    2. /lib64/ld-linux-x86-64.so.2  
    3. libc.so.6  
    4. puts  
    5. __libc_start_main  
    6. __gmon_start__  
    7. GLIBC_2.2.5  
    8. AWAVA  
    9. AUATL  
    10. []A\\A]A^A_  
    11. HelloWorld  

    【编辑推荐】

    1. 5款小众却逆天的国产软件,Windows 10必备精品
    2. PostgreSql入门实操:pg基础入门,安装软件、学习架构、了解基础命令。
    3. 新冠病毒发生一年后,世界网络安全的格局发生了哪些变化?
    4. X86/X64软件逆向分析入门
    5. C语言边角料3:用纯软件来代替Mutex互斥锁-多线程
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yoozai.net",如遇到无法解压的请联系管理员!
    悠哉网 » 网络安全攻防:软件逆向之反汇编

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    悠哉网 WWW.YOOZAI.NET
    悠哉网,用户消费首选的网站,喜欢你就悠哉一下。

    发表评论

    • 1002会员总数(位)
    • 40233资源总数(个)
    • 43本周发布(个)
    • 42 今日发布(个)
    • 377稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情