• 8.继续分析一破解加密码获取-最最最简单的注册机


    先看程序:

     

    大体上是输入密码吧。

    先第一个思路,直接破解密码校验的地方。直接改汇编代码。

    跟踪字符串快速缩小范围:Password Is Wrong

     

    找到了,然后直接改:

     

    OK破解成功:


    现在换个思路,看看能不能直接把他的真实密码拿出来。

    上面看字符串的时候看到一个诡异的字符串112233,可以先懵一把,没错就是懵一把。

    OK密码不对。继续开始分析。

     

    然后是用了一个窍门就是在输入的地方先输入东西,因为调试还没走到那,所以不会接受,然后一步一步调试,当过了某个call函数的时候,如果刚刚输入的字符串突然出现了,那么就先锁定这个字符串,一层一层卡位往里走(一开始从Pass...Yes往前倒着走,走着走着没思路了),然后分析结果是下面这样(分析都写在注释里了):


    异或0x1的那个函数call asd.00811100是这个(分析都写在注释里了):

     

    然后是上上个图的那个XXXXXXXX的位置,我觉得应该是做字符串比较呢,就是把输入字符串异或0x1之后和某个字符串比较。但是里面还没分析清楚,明天再说吧,今天来不及了。还有一个窍门就是知道是xor 0x1了之后我的所有输入字符串都是00000了。这样方便观察。最后偷了个懒。在查找Password。。。字符串的时候我看到了112233,那么可以猜测一把,输入串异或之后是和112233比较。所以直接112233异或1之后得到003322,然后测试一波:

     


    然后C++实现了下代码,如下,大家可以自己编译之后分析学习

     

    // NXY.cpp : 定义控制台应用程序的入口点。
    
    //MessageBox(NULL,L"HelloWorld",NULL,MB_OK);
    
    #include "stdafx.h"
    
    #include <iostream>
    
    #include <windows.h>
    
    #include <string>
    
    using namespace std;
    
    
    
    VOID MessageOut(const string &strMess) {
    
    MessageBoxA(NULL, strMess.c_str(),NULL,NULL);
    
    }
    
    
    
    string GetXorString(const string &strResore) {
    
    string strXorResult = "";
    
    for (int index = 0; index < strResore.length(); index++) {
    
    strXorResult += strResore[index] ^ 0x1;
    
    }
    
    return strXorResult;
    
    }
    
    
    
    int main(){
    
    string strPassword = "112233";
    
    //cout<<GetXorString(strPassword);
    
    string strInput = "";
    
    cin >> strInput;
    
    strPassword == GetXorString(strInput) ? MessageOut("Password Is OK!") : MessageOut("Password Is Wrong");
    
    cout << endl;
    
        return 0;
    
    }
    
    
  • 相关阅读:
    Dao跨事务调用实现转账功能
    QueryRunner类 的應用,以及ResultSetHandler 接口的实现类
    C3P0数据源的使用
    iOS中UI阶段常用的一些方法
    谷歌云服务器的使用
    Odoo学习之domain表达式【转载】
    odoo 视图继承
    Odoo字段类型详解
    odoo12:命令行
    xpath转义‘
  • 原文地址:https://www.cnblogs.com/csnd/p/12061880.html
Copyright © 2020-2023  润新知