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;}
总结
以上是生活随笔为你收集整理的8.继续分析一破解加密码获取-最最最简单的注册机的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 7.破解的最简单例子
- 下一篇: MongoDB中的读写锁