博客很久都没动了,懒了。。
入正题:
平时我们可能都有遇到过这种被加密的PDF,但我们又需要提取里面的内容或更改。这个时候就需要找PDF解密去除工具了,有人说网上在线破解的一大把,也是的,但如果文档有隐私你还会直接在网页上上传吗?
我直接搜了下,发现有很多这类的软件,我随手下了一个:http://app.pdfdo.com/download.aspx (网上标价15元/永久)
可我是搞逆向破解爱好者啊,我肯定要练练手啊!
代码被.NET Reactor(4.5-4.7)混淆加密保护了。
第一想法,应该能做注册机。
先脱壳,用到的工具是:de4dot-Reactor5.0(因为是.NET Reactor(4.x),其他版本都没有脱掉壳)
脱壳后的程序能正常运行
丢进dnSpy-x86,简单的分析了下流程,发现注册机是没法做了(因为用了RSA非对称算法),只能尝试爆破。
//关键代码,注册逻辑
private void method_1()
{//打开注册表 HKEY_CURRENT_USER\SoftWare\PDFdo\PasswordRemover
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(BLL.strRegistry);if (registryKey != null)
{//获取注册表中"NowTimes"的值
object value = registryKey.GetValue("NowTimes");
if (value != null)
{
int.TryParse(value.ToString(), out this.reVal);
}//获取注册表中"Register"的值,这个值不能为空,这个也就是注册码,如果为空一定是试用版
value = registryKey.GetValue("Register");
if (value != null)
{//将注册码赋值给s_Code变量
this.s_Code = value.ToString();
}//获取机器码与"PWRemover_"字符串连接
this.s_MKey = "PWRemover_" + RegisterBLL.getMNum();
}
if (this.s_Code != "" && this.s_MKey != "")
{
this.Rres = this.register_0.button2_Click(this.s_MKey, this.s_Code);
if (this.Rres == RegType.Registered)
{//隐藏注册窗体
this.btnRegister.Visible = false;
return;
}
}
if (this.Flag == "")
{//弹出软件注册
this.register_0.ShowDialog();
}
}
从上面的代码可以看出来,只要满足if (this.Rres == RegType.Registered)这个条件,那么软件就不会出现软件注册了。
先满足注册表的条件,手动加了一个Register
这段就是RSA的算法,但是这个只是验证部分,所以注册机是没法做了。
图中箭头指向的三个地方其实就是一个结构体。
Unregiste=0 //未注册
Registered =1 //已注册
Unknow=2 //未知
因为这个验证的返回值是regType,只要regType=1 就表示验证成功。
尝试把Unregiste赋值为1 Unknow赋值为1 ,这样return regType的时候就为1了
在return regType处下断点,然后需要改一下返回值
最后return regType 返回的都是1 就表示验证成功。
这个时候 F5运行,程序就破解了。
最后记得保存
15块的软件引发的一篇文章,这里我虽然没有写分析得过程,但破解的地方写的很详细了。