先看程序:
大体上是输入密码吧。
先第一个思路,直接破解密码校验的地方。直接改汇编代码。
跟踪字符串快速缩小范围: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;
}