简单入个门-re篇-01
注:本文章为个人笔记,只不过以教程的方式呈现(个人喜好),并且会在多平台发布,如有不足,欢迎指出
本章先粗略的演示一下逆向的流程,不涉及很多基础知识,如果要深入学习逆向,请自行学习C语言和汇编语言
文末附有本章所需文件下载地址
建议
学逆向专门开一台虚拟机,磁盘空间可以开大一点(200G我觉得不过分),免得物理机被玩坏了(虚拟机要多备份快照)
1.软件功能初步分析
尝试软件
在附件包中有名为TraceMe.exe的文件,这个为我们这次逆向演示的文件
打开文件我们发现会有如下页面
随便输入一个用户名和序列号,点击Check,会弹出序列号错误,再试一次
的提示
猜想软件逻辑
我们可以有以下猜想:
- 程序定义了两个变量name,number
- 然后从窗口中获取两个变量的值
- 点击确认后,程序检验name和number是否匹配
可以猜想程序有以下代码
char name[10] = 通过什么API获取;
int number = 通过什么API获取;
if (name == "xxx" && number == yyy ){
弹出正确;
}
else{
弹出序列号错误,再试一次;
}
那猜想就到这,接下来演示Ollydbg的使用
2.Ollydbg逆向软件初步演示
Ollydbg安装
在附件包中,有一个ollydbg.rar的压缩包,解压之后,打开吾爱破解.exe即可
用Ollydbg打开代逆向文件
直接把TraceMe.exe拖进去就行,然后会有如下页面
我们可以发现Ollydbg定位到了004013A0
这个地址,程序的起点
设置断点
先点开这个选项(下图)
然后在弹出的窗口,勾选上这些(下图)
接着点击窗口正下方确定
调试程序
添加好断点后,我们直接点上方的三角形(下图),运行程序,接着就会弹出程序的窗口,然后就随便输入个用户名和序列号,接着check
就会发现断点GetDlgItrmTextA生效了(下图)
接着我们再次运行,运行两次后,又到了这个断点GetDlgItrmTextA(下图),正如我们前面猜想的一样,程序分别获取了用户名和序列号
我们继续运行程序,然后TraceMe.exe就会弹出序列号错误的报错
(其实这里我们可以把刚刚设置的GetWindowTextA去掉,因为经过调试,我们可以发现经过的断点只有GetDlgItrmTextA,这里就不演示了,跟添加没什么区别)
继续点Check,再次调试程序,程序又到了断点
我们上面的猜想是,程序在获取我们的输入后,会赋值给两个变量,这里我们要找到我们的输入存放在哪里
我们就可以点击最右边的这个按钮(Ctrl+F9),跳转到返回(如下图)
然后就在这停下
接着我们进入这个地址(下图第3个按钮或F7),进入内部
进入内部后,我们可以发现有两个GetDlgItrmTextA(滚轮上滑)(也就是我底色标黄的地方),分别对应这两次输入的获取,看来我们找对地方了,然后我们点击上图第4个按钮或F8一步步调试
但是到我圈出来的位置时,会跳转到刚刚的位置(如下图)
问题不大,这意味着在进行第二次输入获取(第一次在上面已经经过了)
被跳转到刚刚这个页面,我们用同样的方法进入到retn 0x10里面
再进行一步步调试
在执行红圈标注的地方时,主意观察右边的寄存器,会发现出现了我们刚才的用户名和序列号,他们分别被保存在EDX和EAX中
接着到绿圈标记的地方时,我们可以发现这是个函数,应该就是用于验证序列号和用户名的,接着我们跳入函数,就如上文的方法一样(下图第3个按钮或F7)
然后我们就会进入一个循环,注意红色的箭头,表示着这步语句会跳转到哪里,如果是绿色的话就意味着条件不符合无法跳转
因为这里会进行很多次循环,我们为了节省时间,直接选中循环外的语句(就是跳转外的语句),按F4直接执行到该位置
退出循环后,到这里时
注意观察寄存器
我们会发现出现了117
和5117
,这个似乎是正确的用户名和序列号,但是经过多次测试,发现这个是随机生成的,所以知道这个并不能有效破解
然后我们接着执行
到这里时,我们发现,EAX发生变化,依据经验判断,这应该是验真函数的返回值,0也就是假,但是这里我们也不好修改,如果是正确的,应该是什么值,所以这里也不好破解
然后我们退出那个函数,很快就遇到了一个大的跳转
我们可以猜想这个跟弹出错误正确有关,我们先按照这个执行,跳转后果然报出序列错误
所以我们尝试让他不跳转
先右键所选命令,点击汇编
改为如下,点击汇编,不要多点,只要一下,窗口不会自己关掉
然后直接运行,不用单步调试,发现就成功了
总结
通过Ollydbg的分析,我们发现,这个程序并不是想我们之前的猜想一样,是if else这种分支,而是在判断用户名与序列号是否匹配后,决定是否跳转,如果跳转就会省略一些命令,就会报不正确
那Ollydbg的逆向基本的演示就到这里,这里基本没有涉及什么知识,还有许多的知识待学习,一定要自己去演示一遍
C语言-手动将代码转到exe
注:以下会生成一些代码,建议可以用npp查看,附件包里面有
看完上文,应该对逆向有些了解.
学习逆向,一定要会正向
并且要比普通的开发者要会多一点
这里就来演示一下,手动将C代码转到exe
安装IDE
在附件包中,打开codeblocks-20.03mingw-setup.exe,按提示安装就行,但是注意,这里要全选.并且这里挺久的,快捷方式创建好了,并不代表C语言环境安装好
将gcc所在目录添加到环境变量
这是我的路径,你们应该会以此类推吧
C:\Program Files\CodeBlocks\MinGW\bin
在命令行中输入gcc -v
看有没有报错,没有就可以了
写入代码
#include <stdio.h>
int main() {
printf("hello Haicaji!");
return 0;
}
预处理 .c -> .i
gcc -E test.c -o test.i
这里将.c代码中的头文件展开,就是把头文件的全部内容替换掉#include这句话
编译 .i -> .s
gcc -S test.i -o test.s
这里是将C语言代码转为汇编代码
汇编 .i -> .o
gcc -c test.s -o test.o
这里是将汇编代码转为机器码
objdump -d test.o
可以将机器码稍微反汇编一下
链接 .o -> .exe
gcc test.o -o test.exe
这里是将机器码链接为exe文件
附
附件包下载链接(可以来个好心人转存到友好的下载地址)
解压密码Haicaji
链接1:https://pan.baidu.com/s/1kgAKyCD0_sxiOvC-o86szw?pwd=918i 提取码:918i
Ollydbg快捷方式一览
暂时没有找到