很久没搞过破解了。最近有需要,所以来练练手,破解了兄弟萌也好使用。

IDA 打开看一眼, 调用了很多 win API 。

过运行环境检查

软件从光盘启动,会判断自身启动的位置。用 windbg 运行程序进行调试,找到判断启动位置的代码。

如何找呢?

因为不清楚它代码怎么写的,只能凭经验猜它会使用到什么样的 win API。

可能是:GetCurrentDirectory,GetModuleFileName,GetDriveType …

最终用 windbg 把疑似的点都打上断点。来跑一下,最终命中的函数是:GetDriveType

1
2
3
4
5
6
7
8
9
10
11
12
13
//声明:
GetDriveType(
lpRootPathName: PChar {磁盘根目录}
): UINT;

//返回值:
DRIVE_UNKNOWN = 0; {未知}
DRIVE_NO_ROOT_DIR = 1; {可移动磁盘}
DRIVE_REMOVABLE = 2; {软盘}
DRIVE_FIXED = 3; {本地硬盘}
DRIVE_REMOTE = 4; {网络磁盘}
DRIVE_CDROM = 5; {CD-ROM}
DRIVE_RAMDISK = 6; {RAM 磁盘}

上层逻辑如下。

改一下代码就可以过这个检查。

密码校验

密钥校验似乎复杂了些。我开始走了些弯路,我想找到密码校验的算法,如下图。被我找到了。

它的逻辑是在调用另一个 dll 来做密码这一块处理。而且密码是动态验证的,一段时间就会失效。

我最初竟然想破解它密码是怎么计算的。很明显,这个不太可能。

换个方向,观察它密码算出来之后的去处,最后在某一次找到比对的逻辑。

这里的 if 干了一件事:不为 1 则出错,设置为 1 则进入系统。

那么干掉这个 if 就可以了。