程序来自于《加密与解密3》的第五章的PacMe.exe。书中并没有给出C语言实现的加密与解密代码,自己花了一些时间,把代码还原了,并且写了一个C语言的注册机。

加密原理:正如书中所说,此程序是生成一个11x16的迷宫,其中*表示不通,.表示通,起点为C,终点为X。所经过的路径的方向,每4个作为1字节,成为加密的数据。

解密思路:通过IDA导出程序的迷宫数据,通过寻路算法,找到唯一路径,然后按照KeyFile格式加密并生成KeyFile。

迷宫数据:

char Maze[] = { "****************"
"C*......*...****"
".*.****...*....*"
".*..**********.*"
"..*....*...*...*"
"*.****.*.*...***"
"*.*....*.*******"
"..*.***..*.....*"
".*..***.**.***.*"
"...****....*X..*"
"****************" };//11*16

先看下从程序里反汇编出的解密函数:

bool KeyCode(const char *szFilename, char *pMaze) {//KwazyWeb.bit
HANDLE hFile;
if ((hFile = CreateFileA(szFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) {
CloseHandle(hFile);
return false;
}
DWORD dwByteRead;
BYTE bUsersize;
ReadFile(hFile, &bUsersize, 1, &dwByteRead, NULL);
if (bUsersize == 0) {
CloseHandle(hFile);
return false;
}
//0x403288
DWORD dwByteUser = 0;
char szUserInfo[100];
ReadFile(hFile, szUserInfo, bUsersize, &dwByteRead, NULL);
//用户名求和
for (int i = 0; i < (int)bUsersize; i++)
dwByteUser += szUserInfo[i];
//0x4034e8
BYTE szDataInfo[18];
ReadFile(hFile, szDataInfo, 18, &dwByteRead, NULL);
//异或数据
for (int i = 0; i < 18; i++)
szDataInfo[i] = szDataInfo[i] ^ (BYTE)dwByteUser;
int k;
char *pos = &pMaze[16];
for (int j = 0; j < 18; j++)
for (int i = 8; i != 0;) {
i -= 2;
k = szDataInfo[j] >> i & 3;
if (k == 0)
pos = pos - 16;//↑
else if (k == 1)//→
pos++;
else if (k == 2)//↓
pos = pos + 16;
else//←
pos--;
}
//判断是否到达位置X
if (pos[0] != 'X'){
CloseHandle(hFile);
return false;
}
CloseHandle(hFile);
return true;
}

注册机实现(第一次写注册机,还专门学习了下寻路算法):

void KeyGen(const char *szFilename, char *pMaze, const char *szName) {
HANDLE hFile;
if ((hFile = CreateFileA(szFilename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) {
CloseHandle(hFile);
return;
}
std::list<int> path;
std::vector<int> pack;
int len = lstrlenA(pMaze), pos;
char *pMaze1 = new char[len + 1];
memcpy(pMaze1, pMaze, len + 1);//包含'\0'
for (pos = 0; pos < len; pos++)
if (pMaze1[pos] == 'C')
break;
path.push_back(pos);
Walk(pMaze1, pos / 16, pos - pos / 16 * 16, path);
//计算序列值
int i, j;
pos = path.front();
path.pop_front();
while (!path.empty()) {
i = path.front() / 16 - pos / 16;
j = path.front() - path.front() / 16 * 16 - (pos - pos / 16 * 16);
if (j == 0) {
if (i > 0)
pack.push_back(2);
else if (i < 0)
pack.push_back(0);
}
else if (i == 0) {
if (j > 0)
pack.push_back(1);
else if (j < 0)
pack.push_back(3);
}
pos = path.front();
path.pop_front();
}
pos = lstrlenA(szName);
len = 0;
for (i = 0; i < pos; i++)
len += szName[i];
for (i = 0; i < (int)pack.size(); i += 4)
path.push_back((pack[i] << 6 | pack[i + 1] << 4 | pack[i + 2] << 2 | pack[i + 3]) ^ (BYTE)len);
WriteFile(hFile, &pos, 1, (DWORD *)&j, NULL);
WriteFile(hFile, szName, pos, (DWORD *)&j, NULL);
for (auto itr = path.begin(); itr != path.end(); itr++)
WriteFile(hFile, &(*itr), 1, (DWORD *)&j, NULL);
delete[] pMaze1;
CloseHandle(hFile);
}

其中寻路算法函数Walk实现如下:

bool Walk(char *pMaze, int i, int j, std::list<int> &path) {
if (pMaze[i * 16 + j] == 'X')
return true;
int distX[] = { -1,0,1,0 }, distY[] = { 0,1,0,-1 };
for (int k = 0; k < 4; k++) {
if (i + distX[k] >= 0 && i + distX[k] < 11 && j + distY[k] >= 0 && j + distY[k] < 16
&& (pMaze[(i + distX[k]) * 16 + j + distY[k]] == '.' || pMaze[(i + distX[k]) * 16 + j + distY[k]]=='X')) {//下一步通路
pMaze[i * 16 + j] = '*';//当前封路
path.push_back((i + distX[k]) * 16 + j + distY[k]);//下一步入栈
if (!Walk(pMaze, i + distX[k], j + distY[k], path)) {
path.pop_back();
pMaze[i * 16 + j] = '.';//开路
continue;
}
return true;
}
}
return false;
}

Main函数测试如下:

int main(){
KeyGen("key.bit", Maze, "Thanks, pediy!");//注册机
if (KeyCode("key.bit", Maze))//解码
printf("Valid Key file\n");
else
printf("Contact me to get Key file\n");
system("pause");
}

代码测试图

关于KeyFile的破解,含注册机源代码的更多相关文章

  1. SecureCRT 7.3.4破解版(含注册机)

    不用说你肯定知道SecureCRT用途是什么,这个号称最好用的ssh连接工具却不是免费的,所以找了很久才找到最新版本的SecureCRT 7.3.4破解版,其实只要是SecureCRT 7.3.x版本 ...

  2. Sublime Text 3 破解版 + 注册机 + 汉化包 + 教程

    SublimeText 是一个代码编辑器,也是HTML和散文先进的文本编辑器. SublimeText 是由程序员 Jon Skinner 于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展 ...

  3. Adobe Photoshop CC 2018 v19.0 简体中文正式版下载安装破解(附注册机+破解教程) 32/64位(安装破解注意事项是什么)

    Adobe Photoshop CC 2018 v19.0 简体中文正式版下载安装破解(附注册机+破解教程) 32/64位(安装破解注意事项是什么) 一.总结 一句话总结:下载安装破解教程文中都有,需 ...

  4. SQLPrompt_7.2.2.273〖含注册机〗(支持低版本和最高版本SQL2016+VS2015)

    SQLPrompt_7.4.1.564[含注册机](支持低版本和最高版本SQL2016+VS2015) http://download.csdn.net/detail/wozengcong/97601 ...

  5. 韩梦飞沙-屏幕录像专家 win10 含注册机

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 韩梦飞沙-屏幕录像专家 win10 含注册机 百度云盘下载地址:https://pan. ...

  6. iTrash for Mac(卸载工具)破解版含注册机

    iTrash for Mac是一款专为Mac用户打造非常好用的卸载工具,itrash mac版简单好用,只需要把需要卸载的程序的拖拽到iTrash Mac版窗口内就可以删除应用程序.现为大家带来itr ...

  7. BurpSuite 汉化版(含注册机)安装教程

      1.注册机使用方法 首先需要完成java安装及环境变量配置. 打开burp-loader-keygen.jar(注册机)--点击run--license text (随意写)--然后将生成的lic ...

  8. BurpSuite 1.7.32 Cracked 破解版[注册机]下载【无后门版】

    首先看一下我的注册后的: 注册机的使用也很简单,首先打开burp-loader-keygen.jar文件,然后随便填写license text,比如我填写的是:mrxn.net效果如下图: 然后点击m ...

  9. navicate for mysql mac 含注册机 亲测可用

    百度网盘:https://pan.baidu.com/s/1hrXnRes

随机推荐

  1. 以点类 Point 及平面图形类 Plane 为基础设计圆类 Circle

    学习内容:以点类 Point 及平面图形类 Plane 为基础设计圆类 Circle 代码示例: import java.util.Scanner; class Point2{ private dou ...

  2. 安装Python到Linux(Pyenv)

    pyenv是一个多Python版本的托管工具,我们可以使用它安装Python和随意的切换系统环境中默认使用的Python版本. 运行环境 系统版本:CentOS Linux release 7.6.1 ...

  3. 浅谈BSGS和EXBSGS

    我的 BSGS 和各位犇犇的差不多,但是不需要求逆元 Luogu [ TJOI2007 ] 可爱的质数 原题展现 题目描述 给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现 ...

  4. Scalable Multi-Party Private Set-Intersection-解读

    本文记录阅读该paper的笔记. 摘要 本文给出两种MPSI协议,采用的是星型拓扑结构,即有一个leader,需要和其他参与者交互.优点是并非所有各方都必须同时在线: (1)能抗半诚实攻击 通信复杂度 ...

  5. Spring Ioc源码分析系列--容器实例化Bean的四种方法

    Spring Ioc源码分析系列--实例化Bean的几种方法 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到bean真正通过那些方式实例化出来的时候,并没有继续分 ...

  6. JAVA - error(错误)和exception(异常)有什么区别?

    JAVA - error(错误)和exception(异常)有什么区别? error 表示恢复不是不可能但很困难的情况下的一种严重问题.比如说内存溢出.不可能指望程序能处理这样的情况. excepti ...

  7. 解决python 导入selenium 库后自动化运行成功但是报错问题

    本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...

  8. PyTorch - torch.eq、torch.ne、torch.gt、torch.lt、torch.ge、torch.le

    PyTorch - torch.eq.torch.ne.torch.gt.torch.lt.torch.ge.torch.le 参考:https://flyfish.blog.csdn.net/art ...

  9. mac上使用Vmware Fusion虚拟机配置Centos的静态ip

    一.背景 本文简单记录一下,在mac arm 架构下使用 Vmware Fusion虚拟机下Centos7下如何配置静态ip地址.如果使用dhcp静态ip地址的动态分配,那么可能ip地址会发生变化,因 ...

  10. 如何安装TypeScript编译器?

    首先需要nodejs和npm工具.如果没有点击这里下载node(默认会附带安装npm工具):https://nodejs.org/en/ npm安装TypeScript npm install -g ...