一行代码走天下,Frida+Hopper v4.5.19 Demo,调试Ummy Video Downloader的注册验证算法

前言

最新接触到Frida神器,读完文档后发现确实是逆向神器,做了一期简短视频,介绍了一些入门操作,欢迎观看。

- 【MacOS】 Frida+Hopper v4.5.19 Demo,调试Ummy Video Downloader

这里记录一些操作步骤。

0x1 初识软件

Ummy Video 是一款下载YouTube视频的小工具,未注册时有使用次数限制,本地注册方式,未采用网络验证,仔细分析的话加解密及注册验证比较容易,可以用来练习练习。

0x2 Hopper Disassembler分析

接下来,启动Hopper Disassembler v4.5.19 Demo版本,虽然是Demo版本的,但是可以查看伪代码,用来分析足矣~。

通过关键词license,很容易快速定位到软件使用的加解密类:EllipticLicense

0x3 Frida、Frida-trace跟踪类的运行流程

打开iTerm2,输入跟踪命令:

frida-trace "Ummy Video Downloader" -m "*[EllipticLicense *]"

关于frida-trace的使用可以参考官网文档。

激活Ummy Video Downloader界面后,点击注册按钮,很容易看到下面的信息:

读下来的意思就是:初始化类,导入公钥,设置黑名单,检测黑名单,注册码验证。

是不是很激动,如此高效的逆向分析工具,相见恨晚不。

0x4 初识劫持代码

打开当前文件夹,frida自动创建了文件夹 --handlers--,包含了已注入的一些方法对应的js文件。

我们把焦点放在这个文件__EllipticLicense_verifyLicenseK_eb1154d4.js

{
onEnter: function (log, args, state) {
log('-[EllipticLicense verifyLicenseKey:' + args[2] + ' forName:' + args[3] + ']');
},

onLeave: function (log, retval, state) {
}
}

首先尝试打印一下注册码和用户名,如下修改:

{
onEnter: function (log, args, state) {
log('-[EllipticLicense verifyLicenseKey:' + args[2] + ' forName:' + args[3] + ']');
var name = new ObjC.Object(args[3]);
var key = new ObjC.Object(args[2]);
console.log("name:", name.toString(), "key:", key.toString());
},

...
}

切换到iTerm2,按下Ctrl+C,中断后,按下向上方向键👆,激活上次命令,再次按下回车。

点击激活按钮,就显示了内存中的用户名和激活码。

0x5 一行代码走天下

再次修改代码,添加如下一行代码:

{
...

onLeave: function (log, retval, state) {
retval.replace(1); // add one line code.
}
}

这行代码的意思很明显了,就是修改函数:[EllipticLicense verifyLicenseKey: forName:]的返回值为True

好了,保存文档,再次注入,发现Ummy Video Downloader变成了注册版,可以使用下载功能了。

~ END ~