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

题目来源:

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

运行程序观察程序特征

初始界面如下图所示
入门逆向分析学习--国色天香

  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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/356549

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午11:16
下一篇 2023年3月2日 上午11:17

相关推荐