新CrackMe160之049 - crackme8
-
脱壳
使用UPX Unpacker可以直接脱壳成功 -
破解
Delphi的程序,用IDR反编译查看按钮事件,分析算法可得
1). 用户名循环转16进制数值再转字符串: abc => 0x61 0x62 0x63 => "616263"
2). 结果与内存固定串相连, 如串为:"-1498842288" => "-1498842288616263"
经OD分析,内存串来自FormActivate事件00444AEC处, 具体算法为:
1). 获取C盘系列号serial
2). serial *= 2;
3). serialNum = serial(10进制)
4). str = serialNum[3] * serial * 3
注册机代码:
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main() {
char szVolumeNameBuf[MAX_PATH] = {0};
DWORD dwVolumeSerialNum;
DWORD dwMaxComponentLength;
DWORD dwSysFlags;
char szFileSystemBuf[MAX_PATH] = {0};
BOOL bGet = GetVolumeInformationA("C:\\", szVolumeNameBuf, MAX_PATH, &dwVolumeSerialNum, &dwMaxComponentLength, &dwSysFlags, szFileSystemBuf, MAX_PATH);
printf("C盘系列号为: %X\r\n", dwVolumeSerialNum);
char tmp[21] = {0};
char code[21] = {0};
dwVolumeSerialNum *= 2;
sprintf(tmp, "%u", dwVolumeSerialNum);
int s3 = tmp[3] - '0';
dwVolumeSerialNum *= s3 * 3;
sprintf(code, "%d", dwVolumeSerialNum);
printf("算法结果为: %s\r\n", code);
char user[21] = {0};
printf("用户名: ");
fgets(user, sizeof(user), stdin);
int i, j, k = 0, len = strlen(user) - 1;
printf("系列号: %s", code);
for(i=0; i<len; i++){
printf("%02X", user[i]);
}
getchar();
return 0;
}
运行示例:
C盘系列号为: 2E2387E7 (每台电脑的系列号都不一样)
算法结果为: -1498842288
用户名: abcde
系列号: -14988422886162636465
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号