本帖最后由 solly 于 2020-7-25 02:01 编辑
这个密码是一个系统的日期时间转换来的,精确到秒,所以基本只有暴破了。在内存中比较时,将密码64bit的16进制数据按字节反序转换成26进制大字字符后再进行比较。
1、暴破位置如下:
[Asm] 纯文本查看 复制代码 004027DE . 85C0 test eax,eax ;
004027E0 74 18 je short CrackMe1.004027FA ; nop 掉这个 je 即暴破
2、算法:
[C++] 纯文本查看 复制代码 #include <iostream>
#include <windows.h>
int main(int argc, char** argv) {
long long cmpDateTime = 0x0483F078DD478000;
long long subDateTime = 0x019DB1DED53E8000;
long long dateTime = 0;
FILETIME * lpFileTime = (FILETIME *)&dateTime;
GetSystemTimeAsFileTime(lpFileTime);
dateTime -= subDateTime;
if(dateTime < cmpDateTime) {
dateTime /= 0x00989680;
}
dateTime &= 0xFFFFFFFF;
//printf("password: 0x%016X, %llu\n", dateTime, dateTime);
printf("password: %llu\n", dateTime);
//// encode
char buff[16];
int i= 0;
while(dateTime>0) {
buff[i++] = ((dateTime & 0xFF) % 26) + 0x41; /// convertToUppcaseChar
dateTime >>= 8;
}
buff[i] = '\0';
printf("encoded password: %s\n", buff); //// 用于内存中字符串比较
return 0;
}
|