searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

反编译技术简介5

2023-07-27 09:32:29
8
0

通过扩展原来的签名格式,由两部分组成,能大大降低签名冲突率。但有一种特殊签名冲突是无法用签名提到的公有签名法解决的。如下图所示(这连个函数来自VC2003自带的P.J.Plauger STL),这两个函数的机器码完全相同,调用的函数也完全一样。因此,采用公有签名匹配的方法无法区分它们。这种签名冲突在实际应用中极少出现。一旦出现得结合上下文来综合解决。

    公有签名法总结:C++STL是编译时库,识别技术难度和工作量都非常大。在目前公开的反编译器中,还无法识别出没有带符号信息的C++STL。本文所采用的公有签名法可以较好地识别出没有带符号信息的C++STL。采用主动生成公有签名的方式,大大减轻了生成签名的工作量,同时也具有一定的可扩展性。该算法的缺点在于生成的公有签名数量多,匹配所花费的时间开销大。如何减少签名数量,提高匹配效率是后续的研究重点。

        C++类的反编译:

        C++是在C语言基础上开发的一种面向对象的一种编程语言,是C语言的超集。c++是面向对象的语言。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。C++的反编译一个重点在于C++类的识别和反编译。

         类是一种用户自定义的引用数据类型,它的本质是数据类型,并不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。不同的编译器对C++类的编译行为不一样。本节讨论的C++类的识别方法是基于Miscrosoft Visual C++编译出来的C++可之星文件。通过对大量的C++可执行文件的分析,得出这样一个结论:Microsoft Visual C++编译器使用ECX寄存器来存储C++类的this指针。

       类的识别方法如下:

1. 若是在调用某个函数之前,将某个变量的地址赋值给了ECX,并且这个被调用的函数,在函数内部直接使用ECX寄存器,而没有事先给ECX赋值。则该变量是某个类的对象,这个被调用的函数时该对象的成员函数。

2. 如何知道某个函数时直接使用ECX寄存器而没有事先给它赋值,这个问题得通过数据流来解决。先确定每个寄存器的使用-定义链(user-define chain),然后再对每个函数进行活跃性分析。

0条评论
作者已关闭评论
陈****标
6文章数
1粉丝数
陈****标
6 文章 | 1 粉丝
陈****标
6文章数
1粉丝数
陈****标
6 文章 | 1 粉丝
原创

反编译技术简介5

2023-07-27 09:32:29
8
0

通过扩展原来的签名格式,由两部分组成,能大大降低签名冲突率。但有一种特殊签名冲突是无法用签名提到的公有签名法解决的。如下图所示(这连个函数来自VC2003自带的P.J.Plauger STL),这两个函数的机器码完全相同,调用的函数也完全一样。因此,采用公有签名匹配的方法无法区分它们。这种签名冲突在实际应用中极少出现。一旦出现得结合上下文来综合解决。

    公有签名法总结:C++STL是编译时库,识别技术难度和工作量都非常大。在目前公开的反编译器中,还无法识别出没有带符号信息的C++STL。本文所采用的公有签名法可以较好地识别出没有带符号信息的C++STL。采用主动生成公有签名的方式,大大减轻了生成签名的工作量,同时也具有一定的可扩展性。该算法的缺点在于生成的公有签名数量多,匹配所花费的时间开销大。如何减少签名数量,提高匹配效率是后续的研究重点。

        C++类的反编译:

        C++是在C语言基础上开发的一种面向对象的一种编程语言,是C语言的超集。c++是面向对象的语言。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。C++的反编译一个重点在于C++类的识别和反编译。

         类是一种用户自定义的引用数据类型,它的本质是数据类型,并不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。不同的编译器对C++类的编译行为不一样。本节讨论的C++类的识别方法是基于Miscrosoft Visual C++编译出来的C++可之星文件。通过对大量的C++可执行文件的分析,得出这样一个结论:Microsoft Visual C++编译器使用ECX寄存器来存储C++类的this指针。

       类的识别方法如下:

1. 若是在调用某个函数之前,将某个变量的地址赋值给了ECX,并且这个被调用的函数,在函数内部直接使用ECX寄存器,而没有事先给ECX赋值。则该变量是某个类的对象,这个被调用的函数时该对象的成员函数。

2. 如何知道某个函数时直接使用ECX寄存器而没有事先给它赋值,这个问题得通过数据流来解决。先确定每个寄存器的使用-定义链(user-define chain),然后再对每个函数进行活跃性分析。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0