目录
C++逆向需求
某C++逆向课程的目录
知识点1:int main(int argc, char* argv[])的参数
知识点2:构造函数和析构函数
知识点3:局部变量和参数的位置:
知识点4:加减乘除,异或等操作对应的汇编源码:
知识点5:流程控制
知识点6:函数的工作原理
小结:
很多程序是由C++/MFC开发的,逆向必须掌握C++开发的流程,不用多么精通,看得懂源码,知道对应的汇编,即可。
C++程序有着不同于C的一些规则,通过这本书的学习,我们将能了解C++开发的程序,要如何识别,源码与编译器如何合谋变成了汇编,看完这本书,就像参加了Windows逆向的课程了。
第三章 C++与MFC/逆向练习 3000元
3.1 结构体与类有什么区别
3.2 封装之this指针的本质
3.3 构造函数和析构函数
3.4 继承有什么好处
3.5 多继承与菱形继承
3.6 纯虚函数和虚函数
3.7 多态与虚函数有什么联系
3.8 虚继承以及析构调用虚函数
3.9 函数重载的妙用
3.10 什么是运算符重载
3.11 模板是怎么运用的
3.12 类模板以及命名空间
3.13 容器之string
3.14容器之vector
3.15 容器之deque
3.16 容器之list
3.17 迭代器的用法
3.18 输入流和文件流
3.19set map
3.20 stl之 元素计数以及最小值
3.21 函数对象和一元谓词
3.22stl之 查找 删除
3.23 C++异常
3.24 一个Win32程序的执行过程(消息机制的本质)
3.25 win32之创建显示窗口
3.26 win32之消息派发流程
3.27 win32之消息循环及消息函数
3.28 win32 对话框消息流程
3.29 MFC与Win32程序的关系
3.30 MFC类层次结构以及消息流程
3.31 操纵控件的几种方法
3.32 MFC之对话框
3.33 MFC之菜单
3.34 MFC之画图
3.35 MFC之文本操作
3.36MFC之单文档和多文档
3.37 C++版本超市管理系统
逆向练习:
1. OD和IDA的基本用法
2. C语言全部语法逆向
3. C++全部语法逆向
4. 按钮以及其他控件的入口方法
5. 逆向窗口程序的通杀方法
练习:SOFTICE核心文件逆向
argc 是参数个数,argv是参数列表,字符串格式,空格为分隔符,默认第一个参数是函数名称;
在C++类函数运行之前和之后运行的初始化和销毁的函数;
在main函数运行之前,有8-9个入口函数:包括
mainCRTstartup,wmainCRTStartup,
WinMainCRTStarup或wWinMainCRTStarup
__RtlUserThreadStart@8、__RtlUserThreadStart (ntdll.dll类)
__scrt_common_main//初始化缓冲区溢出全局变量
__scrt_common_main_seh//初始化c++语法中的全局数据
invoke_main//调用main函数,传递命令行参数信息
总之看到这类的函数,可以不予理会,它们是编译器自动产生的,不是软件的源码。
C++规定全局对象和静态对象必须在main函数前构造。
main有三个参数:参数个数argc,参数列表 argv 和环境变量envp。
.text:00411334 ; int __cdecl main_0(int argc, const char **argv, const char **envp)
.text:00411334 _main_0 proc near ; CODE XREF: invoke_main+2E↓p
.text:00411334
.text:00411334 argc = dword ptr 4
.text:00411334 argv = dword ptr 8
.text:00411334 envp = dword ptr 0Ch
.text:00411334
.text:00411334 jmp _main
.text:00411334 _main_0 endp
在函数入口位置,局部变量的地址是ptr - x,通常是一个变量4字节长度。参数则是ptr + x,以上的代码里,aegc是ptr+4,argv 是ptr + 8,没有局部变量;
以下的例子里,我们看有局部变量,无参数的例子:
.text:004123D0 ; int __cdecl main()
.text:004123D0 _main proc near ; CODE XREF: _main_0↑j
.text:004123D0
.text:004123D0 var_1C = byte ptr -1Ch
.text:004123D0 i = dword ptr -18h
.text:004123D0 a = dword ptr -0Ch
.text:004123D0 var_4 = dword ptr -4
.text:004123D0
.text:004123D0 push ebp
.text:004123D1 mov ebp, esp
.text:004123D3 sub esp, 0DCh
.text:004123D9 push ebx
.text:004123DA push esi
.text:004123DB push edi
此部分跟上学的时候学到的差不多,但是需要注意的是,编译器优化会有一些变化,主要是为了提高效率和节省空间。
条件判断if-else,switch,循环:do,while,for等在汇编中的代码;
主要是讲不同的调用约定的栈帧处理机制,越看越觉得通透,比如栈顶指针和栈底指针的操作,局部变量和参数的传递。
使用malloc和new临时申请的内存空间叫做堆,通过free和delete来释放。
手边两本工具书《C++反汇编与逆向分析》《从零开始学C++程序设计》,两本书相互呼应。这边看到构造函数和析构函数,那边就看到这些函数的实践和汇编代码,这样学习很高效。