ida使用之函数的熟悉
1. 1. 常量的逆向.exe
2. 2. 字符串的初始化.exe
- 找main函数
-
定位函数体
-
- 找cookie后xor后的call,表示vs2019函数
- 找函数后段xor,表示返回值
-
分析ds段值,将其设置为肉眼可见
-
-
分析赋值语句,将第一个变量名设置为char*
-
- 分析语句发现每4字节赋值,直到+14h处赋值2字节
- 那么就可以判定字符串长0x14h+0x2h=0x16h
- 猜测剩下的0x4Eh字节为0字符,那么下一个call为memset
- 0x16h+0x4Eh=0x64h=100d
- 那么我们则可以将char_buff,设置为char buff[100];
-
猜测代码段2为rep直接循环赋值
-
- 分析得4*9+2+0xA2=200d
- 则可设置变量为wchar_t buff[100]=L"...";
-
猜测段3为未指定长度的char*
-
- 原因是因为没有结尾处的memset();
- char* buff="字符串";
- END
3. 3. 构造函数和析构函数.exe
-
找main函数
-
-
分析代码段
-
- xor,mov,mov,call,则表示CheckForDebuggerJustMyCode
- 我们先来看一下源码
- 我们先讲一下概念,类的构造函数在语法上没有返回值.
- 但是在汇编实现层面上,实际上返回的是this指针.
- 在析构函数中,的确没有返回值,但是会传入一个ecx作为thiscall调用.
- 由此特性,我们可以得出call前给ecx赋值的局部变量为this指针.
- PS:析构函数在main函数结束时自动调用,
- 所以在析构函数前会有一个main函数返回值的赋值
-
分析构造函数
-
-
分析析构函数
-
-
END
4. 4. 存在继承关系的构造函数.exe
-
找main函数
-
-
分析代码段
-
-
分析构造函数
-
-
END
5. 5. 存在虚函数的例子.exe
-
找main函数
-
-
构造函数
-
- 概念:在有系函数的情况下,
- 在this指针的前4字节,会保存着虚表的指针
-
END
6. 6. 使用成员函数访问成员数据.exe
-
找main函数
-
-
分析main函数
-
- 我们先看源码
#include <stdio.h>
// 深入探索C++对象模型
class COBj2
{
};
class CObj
{
private:
// 内类初始化的操作在哪里初始化
int number1 = 10;
int number2 = 20;
public:
CObj() = default;
CObj(int n1, int n2):
number1(n1), number2(n2) { }
// 通过函数访问数据成员的例子
void set(int n1, int n2)
{
number1 = n1;
number2 = n2;
printf("CObj::CObj()\n");
}
};
int main()
{
// 这个 obj2 不存在构造和析构
// 对于没有任何数据的对象来说,
// 编译器不会提供构造函数
COBj2 obj2;
// 局部对象
CObj obj;
CObj obj3(10, 20);
obj.set(100, 200);
// !!!!!!!! 自己提供一个使用赋值方式的构造函数
// 比较该构造函数和其他两种的区别
return 0;
}
-
- 概念:当一个类没有任何意义时,编译器不会将它编译,如CObj2
- 当一个类没有析构函数的意义时,编译器不会将它编译,如CObj
- 那么我们在汇编代码里面会发现并没有obj2和obj的析构
- 分析参数:我们发现有两个局部变量给ecx赋值了
- 那么可以猜测这里有两个class的实例
- 再次分析会发现第一个实例化时,没有传参
- 第二个实例化时,压入了20,10,那么可以得出
- 该函数实例化时可以传入两个int类型的值
- 以及还有一个函数实例化时没有参数
- 后续传参200,100传入函数时
- 我们可以猜测这是将这两个参数改变了
-
分析构造函数1
-
- 发现构造函数中对改值初始化了10,20
-
分析构造函数2
-
- 对比构造函数1发现唯一的区别就是参数时由ebp+N提供的
- 且由寄存器作为缓存赋值至this指针+N
-
分析函数调用1
-
- 由上文分析可得寄存器临时存参后赋值给[eax]+N
- 且与上文函数唯一区别在于增加了printf函数的调用
-
END
7. 7. 虚函数的使用.exe
-
找main函数
-
-
分析构造函数
-
- 发现该构造无函数内容,只有一条虚表生成的代码
-
分析成员函数
-
- 发现该成员函数只有一条printf函数
-
分析main函数
-
-
实现虚表hook
-
-
END
8. 8. 友元和静态.exe
-
找main函数
-
-
END
9. 9. 指针和引用.exe
- 找main函数
- END