首页 > 其他 > 详细

入门逆向分析学习--国色天香

时间:2020-06-17 23:22:57      阅读:100      评论:0      收藏:0      [点我收藏+]

题目来源:

因个人水平有限,本文借鉴并学习了以下链接的文章,如有冒犯,十分抱歉!侵删!
国色天香

运行程序观察程序特征

初始界面如下图所示
技术分享图片

  1. 不输入 name会显示 下图
    技术分享图片

  2. 输入 name ,不输入serial

  3. 输入任意name和serial

    1. 输入字符串4个时,意外发现 弹窗显示 字符串最少为5个,所以可以知道,程序对于输入的name长度有比较

到此,可以对程序的运行流程有了大概的了解;输入错误时 弹窗;
技术分享图片

使用查壳工具进行查壳。

这个程序主要是为了逆向算法 在拿到时候就已经知道无壳,所以简单跳过!!!

分析步骤

找到关键函数

一般有两种方式:

  1. 通过显示的字符串来进行搜索查找
  2. 通过相关的函数来进行定位查找

参考该题目来源的文章 所以选用了和他相同的方法,选择通过相关函数来定位!

将程序拖入到x64dbg中,进入程序主模块后,
1.进入符号标签页
2.选择主进程模块
3.x64dbg会在右侧显示出函数API。
使用快捷键“Ctrl+N”也可以到达下图界面。

技术分享图片

? 在上图中我们可以看到程序中确实存在”GetDlgItemTextA“和”MessageBoxA“这两个API,而这两个函数,从名字就可以知道是用于获取属于文本的,正好对应输入文本框;对这两个函数都进行下断点;然后F9运行程序一直到,程序可以正常运行,输入Name和Serial之后点击Try

Name获取

? 该程序会断在上述所提到两个API处 大多为 系统领空,然后Alt+F9 跳转到用户领空,F8单步走会发现 获取了输入的 Name 如下图
技术分享图片

由上图可以看除 已经获取了 输入的Name “12345” 以及得知断点位于标注的调用函数内部 紧接着

  • cmp al,20
  • cmp al,5

可知 得到输入字符串的长度要为5-32 与上述观察程序特征时的结论一致

**同时标注 00401259 处 ,该处开始对输入的字符串进行处理 ** 用于后续IDA PRO处理

Serial获取

上述可单步追踪分析;或者 直接F9 运行 ;会断在上述同样提到的 文本函数 获取处 ,由于位于系统领空 ,同样Alt+F9到达程序领空

技术分享图片

由上图可以看到 ,已经获取了 serial 字段 同时可以看到 出现了判断结果的弹窗内容 可以判断 该部分对输入的serial与内部生成的serial进行了对比 并进行结果展示 紧接着的代码部分 可以看到成功结果的输出

技术分享图片

关键位置

上图”0x004013A6“是成功函数开始的地方,所以我们继续往上看,及即可发现关键跳转。所以我们着重分析下图的汇编代码

技术分享图片

所以 由上图 可以大概知道 00401259 开始的部分 004012FD为关键内容

使用IDA 分析

将该程序 导入IDA PRO 然后查找上述所说的位置 附近 F5 可得到反汇编代码 如下图
技术分享图片

对这些代码进行分析 ,得到算法代码 ; 同时 使用X64DBG进行动态调试验证 最后得到如以下代码

算法

Attention:

  • 输入 要是 长度为 5-32之间的字符串 ;处理时 只截取前 5位
  • Serial 输入长度一定要为10位,在对输入的serial进行对比前 会先比较 serial的长度,不多不少只能为10位
#include <iostream>
#include <string>
using namespace std;
int main(){
	string s="hello";  //name输入值  5-32位  处理时 对name字串只截取前 5位
	string s2="";
	string s3="";
	int i = 5;
	int j =0;
	do{
		char x = i + (s[j]^0x29);
		//cout<< x << "||"<<(s[j]^0x29)<<endl;
		if(x<65||x>90){
			x = i+ 82;
		}
		cout<<s[j]<<":"<<x<<endl;
		s2+=x;
		i--;
		j++;
	}while(i);
	cout<<s2<<endl;
	i=5;
	j=0;
	do{
		char x = i + (s[j]^0x27)+1;
		if(x<65||x>90)
			x = i+77;
		cout<<s[j]<<":"<<x<<endl;
		s2+=x;
		i--;
		j++;	
	}while(i);
	cout<<s2<<endl;
	for(int k= 0;i<10;i++){
		char c = s2[k]+5;
		char m;
		if(c>90){
			c-=13;
		}
		m =  c^0xc;
	cout<<m<<endl;
		if(m<65){
		m=k+75;
		}
	if(m>90){
			m =75-k;
		}
		k++;
		s3+=m;
	}
	cout<<s3;
	return 0;
}

入门逆向分析学习--国色天香

原文:https://www.cnblogs.com/ms-study/p/13155214.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!