前几天因为以为几次蓝屏是硬盘的问题而装上了以前用过的HDD Regenerator 2011破解版,然后这软件给我推送了更新的版本,就上网更新了下。
由于现在用的破解版是Patch形式而不是KeyGen,所以新版自然没有破解。出于好奇,就想自己破破看。
我的目标很简单,HDDREG不是有写到U盘上的DOS版本么,我只需要找到注册版的这个DOS程序就够了。
事实证明,我手贱了。。。这是我接触逆向这么多年来碰到的最厉害的软件保护。
==================华丽丽的分割线==================
用winhex看了下安装目录下个各个文件,发现DOS版本是放在DSCK.TR这个文件里的,以磁盘扇区的形式。看到文件头就是磁盘0扇区熟悉的55AA结尾,就把这个文件拖到WinImage里,结果打开是打开了,但是里面就一个文件。
由于生成的U盘中HDDREG是打包成了一个cab文件,所以在这个文件里搜索了MSCF文件头标记,找到了,但是往后翻cab的文件大小却发现翻了不久就是0字节了——这说明DSCK.TR中数据的存放是打乱顺序的!解密的关键看来在EXE文件中。
于是用ProcessMonitor监视下文件读写,然后运行一次写U盘,果真看到乱序的读取Log。然后找到其中一个开头的位置,在WinHex中打开程序的内存搜索这个数据,搜到了看似是顺序表的东西——68 四字节位置 68 四字节长度——Wait。。。这是硬编码的push指令。。。给跪。。
既然知道Key在程序内存里,那么我们Debug它一下。。。拿出OD神器。。。Bang——无法附加到指定的进程。
第一次见到这种问题,还以为是软件做了什么手脚。于是跟踪父进程(这个软件运行后会启动一个相同的子进程,然后工作都是子进程做)。调查许久才发现附加不进去的原因是——父进程是子进程的调试器。
这样看来就没办法调试了。好吧,我们考虑Dump下来静态法分析。于是打开WinHex,打开子进程的EXE映射空间,另存为。Bang——无法读取内存。。。内存中几乎所有的区域都是UNREADABLE PAGE。
同时对父进程下Log在WriteProcessMemory,会发现每当打开软件的什么功能都会出现一大堆的Log,写入的位置都是1000的整数,长度都是1000。显然这意味着程序需要执行某段代码而引发访问违规的时候才由父进程把这段代码的内容写入内存,也就是说这个程序手动地实现了类似缺页中断的机制。
既不能调试也不能dump。好样的。不过办法还是有的,就是写个shellcode注入到子进程中,访问不能访问的内存引发缺页,当父进程写入正确的数据后再dump。不过实验起来总是不明原因的崩溃,但是还好,每次运行程序可以dump一个页面出来。基于这样的思路,我用vb写了个程序,自动运行软件300多次,每次dump 0x1000个字节,自动化耗时近半小时(因为需要Sleep,不然可能还没来及写入正确的数据),终于把软件给dump了出来。
你以为这样就完了么。。。。。。。。事实证明我在dump出来的代码中并没有找到注册版写U盘的硬编码的代码。。。这说明作者编译了非注册版和注册版的两个EXE,然后在程序的起始以动态代码技术只加载其中一个。
于是我白忙活了。
后记:以后可以尝试学习一下调试器技术。。。
高人啊