(超详细)逆向学习:破解一个小程序

笔者是个新手小白,能力有限,如果文章有所不当之处,还请各位前辈批正指出,感谢

程序下载地址: 点我 提取码: h4vi
运行程序,这里提示我们需要一个密钥文件
(超详细)逆向学习:破解一个小程序_第1张图片
先进行爆破,丢进OD分析:
(超详细)逆向学习:破解一个小程序_第2张图片
这里我们可以从注释得知我们的密钥文件名字为"Keyfile.dat",可以猜想,程序的算法比对的是从这个文件读出密钥,运用设计好的算法,校验合法性…
(超详细)逆向学习:破解一个小程序_第3张图片
看到上面组合条件跳转,就该注意了…
(超详细)逆向学习:破解一个小程序_第4张图片
到这里正常执行的话,可以看到EAX=-1(补码),则cmp eax,-0x1会把Z flag置为1(因为eax和-1相等)
JNE检查Z标志位,当Z=0时实现跳转
(超详细)逆向学习:破解一个小程序_第5张图片
这里如果不是先跳转,该指令继续向下执行则从注释我们观察到,会调用一个提示需要密钥文件的MessageBox接着调用ExitProcess退出程序,所以这一步,我们需要让跳转实现…因为这里用的是爆破,所以实现跳转的话,我们可以修改jne指令为jmp不加判断,直接跳转…
在这里插入图片描述
F8…来到这里
(超详细)逆向学习:破解一个小程序_第6张图片
可以看到,这里会是读取我们的Keyfile读取内容,我们不管,继续执行
(超详细)逆向学习:破解一个小程序_第7张图片
执行到这里,我们注意到判断跳转未实现,则接下来时jmp强制跳转指令,由指令参数,我们看下会到哪里…
(超详细)逆向学习:破解一个小程序_第8张图片
可以看到,jmp指令到的位置由注释可以看到时提示我们的密钥错误,并且弹出消息退出程序,由此,我们可以知道,我们的jmp是不能执行的,因此需要让我们的jnz指令实现跳转,跨过jmp指令…
jnz指令检查Z flag 当Z flag为0时跳转实现,因此,我们可以修改Z为0
(超详细)逆向学习:破解一个小程序_第9张图片
继续执行F8单步
(超详细)逆向学习:破解一个小程序_第10张图片
可以初步判定,这里是算法部分,检验密钥的实现算法
第一个跳转,我们可以追红线下去,看到执行的还是提示错误密钥的信息(不截图了),因此,我们不能让他跳转(我们可以该标志位,也可以修改这个指令为nop),这里我们修改指令为nop
(超详细)逆向学习:破解一个小程序_第11张图片
这里的跳转下去,并非错误信息,跟进
在这里插入图片描述
跳转实现,到提示错误的信息,
(超详细)逆向学习:破解一个小程序_第12张图片
因此还是不能让它实现…nop继续填充
(超详细)逆向学习:破解一个小程序_第13张图片
跟随jmp下去…
(超详细)逆向学习:破解一个小程序_第14张图片
注释,我们看到,提示成功信息了…
(超详细)逆向学习:破解一个小程序_第15张图片
到此,我们爆破结束…
接下来,我们尝试探究它的密钥,尝试走验证来通过程序验证。。.
执行到这里,由注释内容,我们可以判断,执行了ReadFile的api读取了我们Keyfile.dat的内容,因此,需要在程序目录下建一个Keyfile.dat文件。
(超详细)逆向学习:破解一个小程序_第16张图片
API会是我们的切入点,注意到这个ReadFile的参数注释有一个地址跟我们接下来的cmp指令地址一样,我们可以查看文档,看下ReadFile的第4个参数(由入栈顺序可以判定)什么意思…
(超详细)逆向学习:破解一个小程序_第17张图片
原来是读取的字节数…由此,结合下面的cmp指令,就是判断读出来的密钥有没有多于0x10(16),因此我们回到keyfile写入16个字节的内容,
(超详细)逆向学习:破解一个小程序_第18张图片
继续看下算法的实现…
(超详细)逆向学习:破解一个小程序_第19张图片
可以看到,跳转被我们改变了,由此验证的第一道坎,密钥长度,我们通过了,接下来:
(超详细)逆向学习:破解一个小程序_第20张图片
(超详细)逆向学习:破解一个小程序_第21张图片
可以看到,实际上就是把读取出来的内容放到al中,然后跟0x0比较判断是否读取到的内容为空
(超详细)逆向学习:破解一个小程序_第22张图片
到了这里又跟0x47进行cmp运算不等时则跳转…

由图片可以看到,进入了一个循环,然后寄存器对应累加。。这里就是每次拿出一位跟47比较判断,循环它读出来的字节数(0x10)16
因此,我们可以构造我们的Keyfile.dat了,47ASCII对应是G
因此,修改我们的Keyfile.dat为16个以上的G:
直接运行程序…:
(超详细)逆向学习:破解一个小程序_第23张图片
得到成功返回信息…结束

总结:API作为切入点能很好的理解程序做了些什么…

你可能感兴趣的:(逆向学习)