dll文件如何反汇编成源码,C++语言编写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dll文件如何反汇编成源码,C++语言编写相关的知识,希望对你有一定的参考价值。

手上有个dll文件,用C++写的。现在想看到源码,网上查了资料,说最多可以反汇编成汇编语言。
在下对反汇编不是很懂。。掌握方法的同学可否分享下方法,谢谢先!

DLL 属于可执行文件中的一类,又称为动态链接库,不能直接用DEBUG加载,一般由应用程序因使用该库中的函数,而由操作系统在应用程序加载的同时被加载入特定地址,这个地址一般是DLL在链接时指定的。当DLL被加载到运行空间,根据输出函数表,可以得到各个函数的入口地址,然后用DEBUG在各个入口下断点,调用该函数时DEBUG将跟踪进入该函数,从而实现反汇编。

反汇编属于逆向工程,逆向工程的主要手段有两大类,其中一类是动态分析,另一类是静态分析。

前面提到的方法属于动态分析,由DEBUG实现反汇编,该方法不容易得到完整的代码,一般只能形成一段一段独立分散的代码,同时由于DEBUG的局限性,反汇编的代码质量多不高,生成的代码不能直接使用,原因在于DLL在加载时若没有加载到指定地址空间,操作系统将对代码进行重定向,所以DEBUG只能得到重定向后的代码,这类代码必须修改每一个重定向点,才能形成可执行代码。作为WINDOWS32位操作系统, OLLYDBG是最为优秀的调试、跟踪、反汇编工具,多窗口运行,可以方便的通过窗口操作完成各类动作,而不需要像一般DEBUG那样由命令行来完成,OLLYDBG还有许多一般调试器不具备的功能,同时由于每一代高手不断的修改,使其具有多种功能,同时带来的就是混乱,谁也不知道有多少版本,谁也不清楚每个版本到底增加了什么功能,但就这样,也是瑕不掩疵, OLLYDBG任然是DEBUG中最强大,最好使用的。

静态分析和动态分析不同,静态分析直接打开原程序,加载而不运行,然后直接分析加载的代码。目前静态分析工具,最强大的当属IDA,IDA支持几乎所有种类的汇编语言。

IDA加载应用程序有许多选项,可以选择完整的加载整个程序,也可以选择加载程序的某个块,一般可选择的是否加载文件头、资源表、输入表、输出表等等。

IDA还支持调试,也就是说,当你在进行反汇编过程时,可以直接使用IDA来调试跟踪,以分析代码的动态执行情况,不过就动态跟踪来说,OLLYDBG更为强大。

IDA反汇编的正确率和代码的复杂程度有关,对于正规开发的代码,尤其是如果能够获得源程序的调试文件,即所谓的PDB文件,IDA可以读取PDB文件中的信息,使得反汇编的效率和准确度大为提高,生成的代码甚至比源代码易读。IDA将反汇编生成的结果存入IDB文件中。当你确认反汇编的结果达到你的要求,可以让IDA输出汇编源代码,IDA也提供其他格式的输出,例如html文件,便于用户阅读。楼主主要是用于分析DLL文件,一般来说这类文件更适合做静态分析,所以推荐使用IDA来进行。

IDA对于分析那些加壳或含有大量花指令、混淆代码、垃圾代码的程序,反汇编的正确率会大为下降,因为IDA无法正确的确认当期位置上的数值是属于代码,还是属于数据,是普通C字符,还是DELPHI的字符串,还是UNICODE字符串,是结构数据还是数组还是类表(DELPHI生成的代码中含有大量的类表)等等。遇到这种情况,就需要使用者掌握许多技巧,例如可以通过使用者对当前数据的认识,指导IDA如何处理当前的数据。对于大批量的,具有某些规律的数据,IDA还提供了脚本语言(文件尾位idc),通过对脚本的执行来指导IDA如何进行反汇编。对于更为复杂的情况,例如程序是自解压运行的,这时IDA就没有任何能力来进行正确的分析,通常都会用OLLYDBG动态跟踪,等程序完成自解压后从内存中将解压后的代码完整的挖下来形成文件,再由IDA进行静态分析。

对于成功进行反汇编的代码,IDA根据代码的入口、调用、转移等指令,可以为使用者提供各种格式的程序的流程图,IDA提供许多格式由用户选择,便于用户理解程序的结构。

下面提供的是一个汇编程序的源代码,然后将这个源代码编译成可执行文件后,用IDA反汇编得到的结果,由此可清晰的认识到IDA的强大(由于汇编代码都很长,所以截取部分来展示)。

汇编源代码(这是以前写“可执行文件头的变形技术”一书时书中示例的代码):

下面这些是通过IDA反汇编得到的结果,IDA以HTML格式输出(这里给出的是图形):

参考技术A   DLL 属于可执行文件中的一类,又称为动态链接库,不能直接用DEBUG加载,一般由应用程序因使用该库中的函数,而由操作系统在应用程序加载的同时被加载入特定地址,这个地址一般是DLL在链接时指定的。当DLL被加载到运行空间,根据输出函数表,可以得到各个函数的入口地址,然后用DEBUG在各个入口下断点,调用该函数时DEBUG将跟踪进入该函数,从而实现反汇编。
  反汇编属于逆向工程,逆向工程的主要手段有两大类,其中一类是动态分析,另一类是静态分析。
  前面提到的方法属于动态分析,由DEBUG实现反汇编,该方法不容易得到完整的代码,一般只能形成一段一段独立分散的代码,同时由于DEBUG的局限性,反汇编的代码质量多不高,生成的代码不能直接使用,原因在于DLL在加载时若没有加载到指定地址空间,操作系统将对代码进行重定向,所以DEBUG只能得到重定向后的代码,这类代码必须修改每一个重定向点,才能形成可执行代码。作为WINDOWS32位操作系统, OLLYDBG是最为优秀的调试、跟踪、反汇编工具,多窗口运行,可以方便的通过窗口操作完成各类动作,而不需要像一般DEBUG那样由命令行来完成,OLLYDBG还有许多一般调试器不具备的功能,同时由于每一代高手不断的修改,使其具有多种功能,同时带来的就是混乱,谁也不知道有多少版本,谁也不清楚每个版本到底增加了什么功能,但就这样,也是瑕不掩疵, OLLYDBG任然是DEBUG中最强大,最好使用的。
  静态分析和动态分析不同,静态分析直接打开原程序,加载而不运行,然后直接分析加载的代码。目前静态分析工具,最强大的当属IDA,IDA支持几乎所有种类的汇编语言。
  IDA加载应用程序有许多选项,可以选择完整的加载整个程序,也可以选择加载程序的某个块,一般可选择的是否加载文件头、资源表、输入表、输出表等等。
  IDA还支持调试,也就是说,当你在进行反汇编过程时,可以直接使用IDA来调试跟踪,以分析代码的动态执行情况,不过就动态跟踪来说,OLLYDBG更为强大。
  IDA反汇编的正确率和代码的复杂程度有关,对于正规开发的代码,尤其是如果能够获得源程序的调试文件,即所谓的PDB文件,IDA可以读取PDB文件中的信息,使得反汇编的效率和准确度大为提高,生成的代码甚至比源代码易读。IDA将反汇编生成的结果存入IDB文件中。当你确认反汇编的结果达到你的要求,可以让IDA输出汇编源代码,IDA也提供其他格式的输出,例如HTML文件,便于用户阅读。楼主主要是用于分析DLL文件,一般来说这类文件更适合做静态分析,所以推荐使用IDA来进行。
  IDA对于分析那些加壳或含有大量花指令、混淆代码、垃圾代码的程序,反汇编的正确率会大为下降,因为IDA无法正确的确认当期位置上的数值是属于代码,还是属于数据,是普通C字符,还是DELPHI的字符串,还是UNICODE字符串,是结构数据还是数组还是类表(DELPHI生成的代码中含有大量的类表)等等。遇到这种情况,就需要使用者掌握许多技巧,例如可以通过使用者对当前数据的认识,指导IDA如何处理当前的数据。对于大批量的,具有某些规律的数据,IDA还提供了脚本语言(文件尾位idc),通过对脚本的执行来指导IDA如何进行反汇编。对于更为复杂的情况,例如程序是自解压运行的,这时IDA就没有任何能力来进行正确的分析,通常都会用OLLYDBG动态跟踪,等程序完成自解压后从内存中将解压后的代码完整的挖下来形成文件,再由IDA进行静态分析。
  对于成功进行反汇编的代码,IDA根据代码的入口、调用、转移等指令,可以为使用者提供各种格式的程序的流程图,IDA提供许多格式由用户选择,便于用户理解程序的结构。

  汇编语言的科学定义,其实就是介于机器码(各种01)和高级语言(如C)之间的一种语言。你用C语言写一段程序,其实要在机器上运行的话,机器是不懂的,要经过编译器、汇编器编译,变成汇编,最终再变成机器码,机器根据这些机器码的01可以控制硬件电路完成你程序想执行的操作。
参考技术B 1、动态调试,你加载DLL文件,然后跟进去。这种方法适合逆向DLL中某个特定的导出函数代码。
2、静态反汇编分析,那也挺累的。

看你反汇编的意图,最好用Lord Pe 加载一下,查看一下导出表中的函数,使用第一种方法。。追问

谢谢分享先!
我的目的有点直接而粗暴。。就是想看源码~~
还有第二点我不是很懂,“静态反汇编分析”指的是分析dll,还是分析反汇编得来的汇编语言?

追答

想看源码 很难的, 你可以用IDA进行静态分析 ,IDA有个生成源码的功能,然后生成伪代码 ,不过那个代码 真不是人看的。。 静态反汇编 就是反汇编器,把程序反汇编出来。。不运行程序的。。 动态调试 是必须要运行程序 加载DLL的

参考技术C 估计不行,用IDA分析,汇编代码分模块显示还是挺方便懂的。追问

IDA试过,只能看汇编代码。
意思是说去看汇编代码么。。汇编我只是略懂

追答

嗯,是的,还是汇编代码。
即使有工具反汇编成C代码,可能也很难阅读,
更可能是编译时优化了使用了大量寄存器或别的,没法反编译到高级语言。

追问

就到这个程度,但看着挺规范的。我再试试汇编转C的工具~~

追答

其实这些反汇编过来的代码相当多的跳转都是绝对地址

c语言的反编译问题

手上有个EX4文件..
是基于C语言编写的..
听说有个ex42mq4软件可以把它转为MQ4文件..
有人知道么?
或是可以反编译源码出来的高手.
有么?
QQ:52039179

参考技术A 除了 。net 框架以外的 语言 写的程序都不能反编译

c言语写的 除非是特别简单例如 HELLO WOLRD 那样的代码
否则 你放弃把
参考技术B 反编译源码——不可能——因为你的变量名全被舍弃,在编译时变成地址代码了。本回答被提问者采纳 参考技术C 一般编译程序是不可以反编译到源程序的,

有一些写的程序听说可以基本上反编译出源码:java vb
参考技术D 用w32asm可以反编译成汇编语言,如果你汇编好的话就没问题.

以上是关于dll文件如何反汇编成源码,C++语言编写的主要内容,如果未能解决你的问题,请参考以下文章

问一下高手 c++dll文件如何反编译 看源代码啊????

什么软件能将C语言的执行文件反汇编为汇编源代码

用C++编写的dll工程如何插入.def文件?

可以反编译DLL文件吗

Delphi调用C++编写的DLL

C++生成的DLL用啥工具反编译