记一次失败的简单逆向

日常

我姑家的电脑突然坏了(修不好的那种坏),而我弟有个围棋的考试需要用某软件来练习。然而奸商说原来的激活码不能再用了,必须再买一个激活码才能接着用。我看到这是个小作坊做出来的小软件,于是打算看看能不能绕过激活码。

下载,是个免安装的压缩包。解压,里面就exe,dll和一些资源文件。打开直接输原来的激活码,提示正在连接服务器,过了两秒说激活码已被使用。原来是联网查的,那就好办了。抓个包,看看服务器返回的格式,改下 hosts 本地跑个类似的 web 服务,说不定都不用逆向了。果然是小作坊,HTTP 请求就直接返回了一个单词 “reused”,如果输入错误的激活码,则返回一个"invalid"。我靠,这不好办了,正常一定是 “valid” 呗!我还是太天真了。接连试了 “ok, yes, yeah, success, pass, oh yeah” 等等,全都不对。

算了,这解空间太大了,我还是逆向一发。因为是小作坊出品,软件果然一丁点防御措施没加。找字符串 “reused” 果然在某个 dll 里面找到了验证的逻辑。原来只要输入字符串里有 ‘|’ 这个字符即可正常继续。试了一下,果然提示注册成功,进到主界面了!

插句题外话,逆向的代码里面出现了好几个以 fxxk 命名的函数。里面还有很多含有 fxxk 的字符串。程序员在写这个小学生下棋用的软件的时候是有多不情愿?

可惜事情并没有这么简单。作为一个学下棋的软件,进去之后棋盘竟然显示不出来。没辙,只好网上搜一下这个软件的信息。在唯一与这个软件相关的网站——一篇博客里面,竟然讲到了如果遇到没有棋盘怎么解决。解决方案就是到注册表删除某个路径,然后重新输入激活码。删掉之后,果然是像第一次打开一样,经过测试发现 ‘|’ 之后出现的字符串被写入了注册表。手上没有可用激活码,没办法验证正确的值应该是多少了。代码里好像也并没有找到相关的内容(也许是我太菜了)。我又试了一下看看能不能找到服务器上 web 服务的漏洞,拿到那台服务器的 shell, 水平比较有限也没成功。

最终逆向宣告失败。

虽然逆向失败了,不过这样看来,只要保证注册表项的值全部一样,手动在第二台机子上加注册表,激活码完全是可以重复使用的嘛。

总之作为一个没什么实战经验菜鸟,我逆向的水平真是太菜了,这种小软件都搞不定,有空的话还是要多多练习学学基本的技巧。