初识Frida–Android逆向之Java层hook (二)
今天继续一个新的示例,同样采用CTF作为例子,难度稍微加大了一点,如果对Frida基本的使用还不是很了解,建议先看看之前的文章初识Frida–Android逆向之Java层hook (一)
文章涉及到的知识点:
- 怎么使用javascript实例化类并调用类方法
- 怎么在”jscode”中增加自定义javascript方法
- 怎么较为灵活的hook类方法
apk的安装与分析
示例下载:whyshouldIpay
下载apk后安装,一样还是先来看看是什么功能,这是一个比较简单的验证程序,简单的使用后,了解到PREMIUM CONETNT
内容需要输入License验证后才能查看。那估计PREMIUM CONETNT
按钮中的内容应该就是答案了吧。
流程分析
使用jadx将apk反编译出来,分析,在AndroidManifest.xml中找到了启动的Activity是LauncherActivity
。
找到其中验证的主要代码verifyClick
,分析如下:
public void verifyClick(View v) {
//第一个验证,将输入的Licese通过网络验证,但这个肯定是通不过的,这是一个可能需要绕过的点。
try {
InputStream in = new URL("http://broken.license.server.com/query?license=" + ((EditText) findViewById(R.id.text_license)).getText().toString()).openConnection().getInputStream();
StringBuilder responseBuilder = new StringBuilder();
byte[] b = new byte[0];
while (in.read(b) > 0) {
responseBuilder.append(b);
}
String response = responseBuilder.toString();
//网络验证需要服务器返回 "LICENSEKEYOK",才能进行下一步
if (response.equals("LICENSEKEYOK")) {
//当网络验证成功后,生成激活秘钥,并写入到preferences文件中
String activatedKey = new String(MainActivity.xor(getMac().getBytes(), response.getBytes()));
Editor editor = getApplicationContext().getSharedPreferences("preferences", 0).edit();
editor.putString("KEY", activatedKey);
editor.commit();
//这样便成功激活
new Builder(this).setTitle((CharSequence) "Activation successful").setMessage((CharSequence) "Activation successful").setIcon(