新CrackMe160之049 - crackme8

  1. 脱壳
    使用UPX Unpacker可以直接脱壳成功

  2. 破解
    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个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-19 13:48  hankerstudio  阅读(9)  评论(0)    收藏  举报