Fork me on GitHub

C++代码分析


知识点

面向对象的编程语言:和C语言不同C++是一种面向对象的编程语言,采用使用对象的编程模型,将数据与操作数据的函数都封装到对象中,在面向对象中,代码以叫做类Class的用户自定义的数据类型进行组织,类与结构体比较类似,差别在于他们另外保存函数信息而不仅仅是数据,类是创建一个对象的模板,它指定内存中的一个对象的函数与数据布局。

this指针:数据与函数是对象关联的。为了访问一块是数据,你需要使用ObjectName.variableName的形式。函数以ObjectName.functionName的形式被简单调用,除了使用对象名访问变量以外还可以使用变量名访问当前对象的变量。this指针在一个不指定对象的函数中对每个变量访问时都是隐含的;它对每个对象函数都是一个隐含的参数。在微软生成的汇编代码中,this指针通常被传递到ECX寄存器中,有时也会使用ESI寄存器。使用this指针的C++调用叫做thiscall

重载与修饰:C++支持一个被称为方法重载的编码结构,它能让多个函数使用同一个名字但接收不同的参数,编译器基于这个调用中的参数的个数与类型判断使用这个函数的哪个版本。C++使用名字修饰的字数来支持方法重载,为了支持重载,文件格式中的方法名经过了修改,这个名字中包含了参数信息,如一个名为Test的函数是SimpleClass的一部分,并且接受两个整数作为参数,那么这个方法名修饰之后就会叫:

1
?Test@SimpleClass@@QAEXHH@Z

IDA会根据此函数的修饰进行反修饰显示出原始的函数名和参数,然而内部函数名只有在代码中拥有符号时才可见。

继承与函数重写:继承是一个面向对象编程的概念,在这个概念中父子关系在类之间建立。子类继承来自弗雷的函数和数据。一个子类会自动拥有所有父类的函数和数据,且经常定义额外的函数和数据。

虚函数与非虚函数:虚函数是一个可以被子类重写的函数,并且它的执行是在运行时判断的,如果一个函数在父类中被定义,且在子类中也有一个同样名字的函数,那么子类的函数将会重写父类的函数。而在非虚函数中,这个要被执行的函数在编译时就会被确定。如果这个对象是一个父类的实例则这个父类的函数将被调用,即时这个对象在运行时属于子类,当虚函数在一个子类对象上被调用时,如果对象的父类是一个实例类型那么这个函数的子类版本可能被调用。

虚函数表的使用:C++编译器会在编译代码时添加特殊的数据结构来支持虚函数,这些数据结构被称为虚函数表vtables,这些表时简单的函数指针的数组,每一个虚函数的类有它自己的虚函数表,且每一个类中的虚函数在虚函数表中都有一个项。

识别虚函数表:虚函数表看起来向是函数指针的数组,当你看到一个虚函数表时,只有这个表中的第一个值有交叉引用。

创建和销毁对象:C++类有两个特殊的函数构造函数和析构函数,构造函数在一个对象被创建的时候调用,析构函数在一个对象被销毁时调用,对象可以在栈上被创建也可以保存到堆上,对于在栈上创建的对象,没有必要位这个对象分配指定的内存,这个对象会简单地与其他局部变量一起保存在栈上。析构函数在对象离开作用于之后被自动调用,编译器可能要添加异常处理代码来保证对象的析构函数被调用。

课后练习

Lab20-01

第一个实验的目的是演示this指针如何使用。

问题

1.在0x401040处的函数采用了什么参数?

2.哪个URL被用来调用URLDownloadToFile?

3.这个程序做了什么事情?

Lab20-02

第二个实验的目的是演示虚函数。

问题

1.在这个程序中,你可以从有趣的字符串中了解到什么?

2.导入函数表告诉你关于这个程序的什么信息?

3.在0x40011D9处创建对象的目的是什么?它有什么虚函数吗?

4.哪个函数可能被宰0x401349处的call [edx]指令调用?

5.如何简易的搭建这个恶意代码所预料的服务器,不用连接到互联网就能完整地分析这个恶意代码呢?

6.这个程序的目的是什么?

7.这个程序中实现虚函数调用的目的是什么?

Lab20-03

第三个实验是一个长度更长也更现实的恶意代码,这个实验附带一个名为config.dat的配置文件。

问题

1.你可以在这个程序中得到什么有意思的字符串?

2.导入函数表告诉你关于这个程序的什么信息?

3.在0x4036F0处,存在一个以字符串Config error作为输入的函数调用,其后跟着一些指令,然后是一个对CxxThrowException的调用,除了这个字符串以外,这个函数还用到其他的参数了吗,这个函数返回了什么?从这个函数被使用的上下文中,你可以得到哪些信息?

4.在0x4025C8出的switch表中的6个项都做了什么?

5.这个程序的目的是什么?


本章结束🎊

您的支持是我最大的动力🍉