失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C程序逆向破解-入门学习(2)

C程序逆向破解-入门学习(2)

时间:2022-08-03 13:34:51

相关推荐

C程序逆向破解-入门学习(2)

阅读到此的同学相信对程序的逆向已经有了一定的了解了,如果没有那么可以参考我前面的那篇文章,传送门C程序逆向破解-入门学习(1)

直接进入正题,本文来分析C程序的if else条件分支语句在逆向后的汇编指令,我们如何修改程序的逻辑指令。

编写程序hello.c,或者由之前的hello.c进行修改为以下代码

#include <stdio.h>#include <stdlib.h>void main(){/* 我的第一个 C 程序 */int flag=0;if(flag){printf("Hello, Pojie! \n");}else{printf("Hello, World! \n");}system("pause");}

在当前目录打开控制台编译该程序 gcc hello.c -o hello.exe 得到hello.exe,且双击执行

我们看源码可以知道走的是flag=0走的是else的分支,现在我们来逆向看看汇编指令,使用x64dbg打开调试hello.exe程序

可以看见 lea rcx,qword ptr ds:[404000] ……之前已经有解释过该指令的作用,加载数据到寄存器中,然后call调用控制台打印输出。

这下我们来简单解读下指令

mov dword ptr ss:[rbp-4],0 // 将0添加到ss栈段

cmp dword ptrss:[rbp-4],0 //将栈段某地址的数据与0比较

以上行大致的意思就是将数据加载到寄存器,进行比较计算

je hello.401578 ,该指令其实是判断ZF标志寄存器的值为0的时候,那么跳转,cmp则是比较判断,此刻程序在cmp指令执行前,可以观察到ZF标志为0

执行完CMP指令后,ZF已经发生变化(如下图),对应c程序代码,if(flag)因为ZF=1所以走的是else的分支,je hello.401578 则程序执行的代码段跳转到 401578,开始输出打印helloworld

此时重点来了,如果我们将这个判断的逻辑结果修改了(或者强制修改程序逻辑),那么则可以走另外一个分支输出打印 hello pojie,

在c语言中我们可以直接修改flag=1;

那么在汇编中只需要修改指令mov dword ptr ss:[rbp-4],1

然后补丁导出保存为hello2.exe,

双击执行hello2.exe

可以看见已经成功了,当然如果将je指令修改为jne(如下图),等于相当于逻辑取反,相当于c程序 if(flag!=0),此时这里不再重复分析了

同样补丁修复保存导出为hello3.exe

双击执行hello3.exe,也是能得到同样的结果

文章分析到这里就要结束了,前面的章节,我们可以修改ds数据段地址的数据值,次章节我们可以修改ss栈段的数据值,也可以修改程序的cs代码段逻辑指令,有了这些基础,我们就可以暴力破解(修改)某些无壳的程序了,下节我们将进行实战,去除WinRAR.exe的广告。

如果觉得《C程序逆向破解-入门学习(2)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。