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

tree_fly

前言

最近接触到Frida,读完文档,这是逆向神器。做了一期简短教程视频,介绍了一些入门操作,欢迎观看。

这里记录一些操作步骤。

0x1 初识软件

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

0x2 Hopper Disassembler分析

接下来,启动Hopper Disassembler v4.x 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,中断后,按下键盘上的”上方向键👆”,显示最近一条历史命令,这样不用重新输入命令,按下回车执行命令。

回到App的注册界面,点击激活按钮,iTerm2中就打印出内存中的用户名和激活码。

0x5 一行代码走天下

再次修改代码,添加博主经常走天下的一行代码

{
...

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

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

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

视频观看链接:
- 【MacOS】 Frida+Hopper v4.5.19 Demo,调试Ummy Video Downloader

tree_fly/P.Y.G

2020-01-19

  • 标题: 一行代码走天下,Frida + Hopper v4.x Demo,分析Ummy Video Downloader的注册验证算法
  • 作者: tree_fly
  • 创建于: 2020-01-19 15:20:50
  • 更新于: 2020-01-19 15:20:50
  • 链接: https://itreefly.com/posts/f9ee0805.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
一行代码走天下,Frida + Hopper v4.x Demo,分析Ummy Video Downloader的注册验证算法