c++调用栈库函数_通过调用栈对软件爆破,以后不用总是搜索字符串了

作者坛账号:Lifetimer

基础知识


栈是操作系统在运行时自动初始化的一块区域,是数据暂时存储的的动态内存区域。它的大小在Windows操作系统下由PE文件结构中PE文件头中IMAGE_OPTIONAL_HEADER结构中SizeOfStackReserve字段所定义。在OD中,要想顺利分析软件的功能,在单步需要关注的便是寄存器和栈空间。下面,我们来看一下软件是怎么利用栈的。

函数的调用过程

我们用一个充满函数的小软件来研究函数的调用,源代码如下:

#include

将编译出的软件用OD载入,通过API定位至调用语段:92b12293e55fb918aa23da8eb00d5294.png

简单分析一下,易得:

0040159A    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b)

然后我们随意跟进一个函数,如图(我选择的是C函数方式)e3e6612c96bde8e1a78ba81f17bab4a0.png

8730fe8111851a5c8eb03b38883e204b.png

简单分析,易得:

00401645    55              push ebp                             ; ebp入栈保护现场

综上所述,我们可以得到以下几点:
1.大多数调用协定都将栈作为参数传递的途径
2.在进入一个函数时执行call指令就是做了两步:
(1)将下一行指令地址压入栈
(2)跳转到call后的地址
3.将eax作为返回值
4.return指令实际做的事:
(1)跳转到栈顶的那个地址
(2)栈顶中的地址出栈

所以,函数为了返回必定要用栈,分析栈也就可以知道函数是从哪调用的。

正式开始


调用栈

栈不止可以用于函数调用,临时数据的存储都是用栈,但是,栈中为了函数调用的部分称为调用栈,用调用栈可以分析函数是从哪里调用的。

OD对调用栈的支持

快捷键(Alt+K)
如图便是OD的调用栈窗口ae198339da114294d364ccac8a1d4274.png

第一行是Main函数里的函数第二行是Main函数

调用栈找地址法原理

通过调用栈,我们可以知道函数是从哪里调用的,便可以知道是哪里触发了函数,便可轻易找到是哪里判断了注册码是正确还是错误的。

实战调用栈法

我又写了一个小程序,源码如下(验证部分和我上次发帖的一样):

#include

OD载入,运行cae9abf5d247d158607844695f01acca.png

在弹出错误框后,暂停,打开调用栈497e248d98ed828fc6b190863182e7b2.png1304ecf159e7a430de22493a3a20e84b.png

可以看出,从我的exe调用的而非系统dll调用的最上层的调用来自:未命名1.004018B2,其中未命名1为我的程序名。进入004018B22d8b1cf0f48f5e81371e097fc70e3b27.png

看到上面将序列号错误压入了栈,所以我们判断这个call显示了这个弹窗,所以我们想要跳过这个call,而它上面就有一个je跳转,我们改为jmp看一下。01610e378aa6b14d8a849c04505fcc4d.png

至此,软件爆破完成!感兴趣的同学可以尝试分析一下剩余的语句的功能,对自己的能力提升是有帮助的。

结语

调用栈破解法很常用,学会了它,你就不用总是搜索字符串了。现在,自己找个CrackMe或编译我提供的源代码试一试吧,祝你好运!

--官方论坛

www.52pojie.cn

--推荐给朋友

公众微信号:吾爱破解论坛

或搜微信号:pojie_52

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值