4.逆向分析技术(上)

一、前言

前面两个章节,我们大致实现了通过动态逆向分析静态逆向分析这两种方式对一个简单的程序实现爆破登录功能。

逆向破解只是逆向工程中非常初级的部分,对于win32程序的逆向工程核心在于:将可执行文件反汇编,通过分析反汇编代码来理解代码功能,然后再用高级语言(比如c/c++)重新描述这段代码。

逆向分析首选工具是IDA,它虽然复杂、界面有时候可能感觉也不美观,但却真的强大。

二、32位软件逆向技术

想要逆向分析某个软件,去了解它底层实现原理就是很有必要的一件事了。

一个win32应用程序,想要运行起来,就必须要写WinMain函数,不明白的可以参考这篇文章:C++实战入门到精通-9.windows编程入门-酷编程 (kucoding.com)

但要注意的是,Windows程序执行并不是从WinMain函数开始的,它首先会执行一个启动函数,在这个启动函数初始化进程完成后,才会来调用这个WinMain函数。

而这个启动函数,就是由编译器自动生成的。

对于vc++编译器来说,它调用的是C/C++运行时启动函数,这个函数负责对C/C++运行库进行初始化操作。

所有C/C++程序运行时,启动函数的作用基本相同:

  1. 检索指向新进程的命令行指针
  2. 检索指向新进程的环境变量指针
  3. 全局变量初始化和内存栈初始化

当所有的初始化操作完成后,启动函数才会调用我们的应用程序入口函数,也就是我们常见的mainWinMain函数。

前面我们动态逆向分析时,提到的要修改设置选项,然后让程序自动断在入口处,那个入口处其实就是我们写的mainWinMain函数所在的函数位置。

它之前执行的代码,就是启动代码,因为其是固定的,所以正常来说我们无需关心,只需要从入口代码开始分析。

1.函数

对于函数的分析非常重要,事实上在前面的动态逆向分析静态逆向分析中,我们都看到了大量的call指令,这其实就是在调用函数,其后紧跟的数字,其实就是这个函数的地址。

只要调用这个指令,计算机就会调转到这个地址上去执行该代码。

函数执行完是需要返回的,也就是我们常见到的那个ret指令,它的作用其实就是跳转回来而已。

image-20231022083421449

比如上图,还是以前的那个traceme32程序,并在启动后停在了入口点的位置。

这个call指令,一旦执行它,就会跳转到它后面紧跟的那个地址去,也就是traceme32模块上的D7D8F1位置。

这里的traceme32是这里分析的可执行文件名字。

只要你步进这个函数执行,就可以看到:

image-20231022083701893

此时它就跳转到了这个地址D7D8F1上来执行代码了。

你还可以看到它这句机器码前面就有个ret指令,它往往预示着上一个函数的结束,那么它的下一行一般也就是新函数的开始位置。

一旦执行到这个函数的ret指令:

image-20231022083954308

你就可以看到右下角的栈顶,其数字就是我们前面跳转位置的下一条指令的地址。

这个指令的作用就是取出栈顶这个地址,然后跳转回去。

前面没有提到过,这里也提一下,右下角那个窗口就是的窗口,其基本逻辑就是先入后出,后入先出,每次都只能使用栈顶的数据。

这个栈中的地址其实就是前面调用call指令时,它推入栈的,不信的话可以重新启动程序,仔细观察栈窗口,然后步进执行这个call指令,看它是不是真的会将下一条指令的地址推入栈中。

栈的栈顶所在地址是通过右边寄存器窗口中的ESP寄存器存放的:

image-20231022084330606

比如这里它存放的地址为7FFAD4,所以右下角显示的栈顶地址为:7FFAD4,并且这个地址上的数据为00D7CCA9

一旦执行它,它就会取出栈顶这个地址,并跳转到该地址:

image-20231022084955923

你就可以看到,现在它又跳转回来了,并且栈顶的位置也发送了变化。

而栈底部的地址则是由另一个EBP寄存器存放的:

image-20231022085335077

这里你甚至可以看到,栈底部之下的数据就全是0了。

这种是没有参数、没有返回值的情况下函数的调用逻辑,但大多数函数是有参数、有返回值的,所以下面我们再来看看有参数、有返回值的情况下,函数是如何被调用的:

首先在vs中写下这段代码:

#include<iostream>
using namespace std;
int add(int a, int b) {
	return a + b;
}
int main() {
	int ret = add(10,20);
	cout << ret;
}
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux