概述
程序①
打开程序
随意输入用户名密码
出现错误字符
目标:得到该程序的相关序列号和了解序列号计算过程
载入od
在od中右键查找相关字符
容易发现输入正确后的字符串
可双击字符进入字符所在的messageBox输出函数
同时向上翻找计算流程
出现一段循环推测可能为计算序列号
再向上翻找
出现两段GetDlgItemTextA函数,为对应两个输入框
寻找关键函数也可以通过对GetDlgItemTextA函数下断点进行调试来寻找
此处为command 框
输入:bp + (关键函数名,此处为GetDlgItemTextA)可以下断点
然后alt + F9 从系统领空返回
继续进行调试
该段判断密码是否为空
观察流程可以大概知道计算结果存储于ESI中,后面于403138数据段(存储输入信息)的值比较来决定跳转
可以将计算得知的ESI数据的值从message中输入来得知序列号
修改代码为
这样来实现将计算出来的ESI值存储在未使用的数据段439000,然后利用messageBox输出
保存代码进行查看
出现乱码
进入439000数据段查看
此时ESI存储的值为6A248
对进行流程进行分析
输入的用户名为abcd 序列号为123456
sar也可以理解成对a的整除
在此基础上可以改进算法为 2aa+(a*a/2 +3)a-a 化简为 a(1/2 a+1)(a+2)
如此循环四次
可利用其他语言进行计算
#include <stdio.h>
main()
{
int i, result = 0;
char a[] = "abcd";
for( i=0; i < 4; i++ )
{
result += a[i]*a[i] + (a[i]/2+3)*a[i] - a[i];
result *= 2;
}
printf("%dn", result);
}
输出为十进制434760转换为十六进制6a248
测试成功
程序②
打开程序
出现一个nag窗口
点击确定
出现主体
将程序载入PEiD
显示该程序无壳为MASM编写的
载入od
发现下方出现nag窗口相关的字符串
尝试在call处下断点并单步调试
发现程序在此处运行且下方messagebox函数未使用
证明下方函数无实意
进入call函数内查看
发现函数内od分析出现异常
尝试先关闭分析
第一张为调试前的代码,第二张为调试后的代码,可以观察出经过运行代码自身出现了变化,同时出现了nag窗口的ASCII
将od分析去除进行分析
接下来对代码进行分析
先call调用GetModuleHandleA函数返回eax400000,然后存放在403130位置,再将401011存放在edi
进入第二个call
函数将eax赋值401000
然后对401000处的代码与5A进行异或,然后eax自增
在BeginPaint处记载对代码修改的位置
在这个函数中程序对自身进行了修改
明确此函数作用后继续分析下一个call
进入第二个call
首先清空eax的值
同此时edi的值为401011
程序运行到mov后开始修改自身此段代码
运行至下一个call前程序自身出现了修改
od分析后出现一段带有乱码的messagebox函数
继续分析
call的地址是edi的401000,为已经修改后的代码
此部分再次出现异或语句,解密的范围为403000到403128
同时观察到下方乱码的位置同样在解密的范围内
调试跳出循环
乱码内的字符已被解开
继续调试跳出nag窗口
点击确定回到od
回到od后jmp跳转至此处,发现程序对edi的值401011代码继续进行修改,然后调用edi的值
进行下一步跳转
在下一个call处出现主体部分
关闭主体部分后 jmp跳转至下一个部分
进入该call查看
发现此处对nag的窗口继续进行修改
在数据窗口进行观察
修改后
可见程序对nag窗口部分在结束处继续加密来防止查找字符串发现
后面结束程序
整理程序前两步加解密思路:
①401000到401218 xor 0x5A
②401011到401025 修改代码
若直接修改代码在出现nag的messagebox则在前两步对代码进行修改中会发生变化
则应该让前两步修改代码后达到去除nag的目的
目的为在此处修改代码
返回第二步寻找修改的代码
观察edi的值得知此为修改处
数据窗口中跟随
找出此处为401039
需要让00 最后显示为01
根据加密规则 需要输入5b xor 5a = 01
保存修改
测试成功 nag窗口被去除
同理可以修改指令为jmp来跳过messagebox
最后
以上就是淡然乌冬面为你收集整理的od分析基础逆向6的全部内容,希望文章能够帮你解决od分析基础逆向6所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复