apk逆向__滴答清单去会员

android apk : 滴答清单7.0.2.1 ( dida_dida_7021_release.apk )
frida version : frida 16.1.0

最近在使用滴答清单做记录,记录每天做的一些事情,但是看到基本的周表格都要会员,正好拿来练练手。

升级需要开通会员

逆向分析

先搜索会员,可以看到“already_pro_account” 的字符串。

搜索“already_pro_account” 的字符串,可以看到有一个 user.isPro() 函数。

进入到这个函数中,可以看到

this.title.setText(getString(user.isPro() ? R.string.alreay_pro_account : R.string.upgrade_to_premium));

这段代码的意思是,如果获取到 user.isPro()函数为true,那么就显示alreay_pro_account (你已经是高级会员了)。
如果不是,那就显示为(升级到高级会员)

查看 isPro() 的代码

绕过会员

方法一

在 1431 行 直接 return v1 。 绕过判断。

方法二

直接使用 Frida 的来hook 这个函数isPro()。

1
2
3
4
5
6
7
let User = Java.use("com.ticktick.task.data.User");
User["isPro"].implementation = function () {true
console.log('isPro is called');
let ret = this.isPro();
console.log('isPro ret value is ' + ret);
return true;
};

查看进程,这里要注意,可以看到这边进程中看到包名是 “cn.ticktick.task”, 但hook 的时候,会找系统中应用的base.apk内的实际函数路径,因此是“com.ticktick.task.data;”

hook 思路: 让isPro 函数永远返回true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
'''
Author       : tigerHu
Version      : V1.0
Date         : 2023-12-21 20:36:52
Description  :
'''

#-*- coding:utf-8 -*-
import frida
import sys
import os

def adb_forward():
    os.system('adb forward tcp:27042 tcp:27042')
    os.system('adb forward tcp:27043 tcp:27043')

jscode = """
    Java.perform(function(){
        let User = Java.use("com.ticktick.task.data.User");
        User["isPro"].implementation = function () {
            console.log('isPro is called');
            let ret = this["isPro"]();
            console.log('isPro ret value is ' + ret);
            return true;
        };
    });
"""

def on_message(message, data):
    if message['type'] == 'send':
        print("[*]  {0}".format(message['payload']))
    else:
        print(message)
       
adb_forward()
# 查找远程设备并附加到目标进程
# frida.get_remote_device() 远程设备,模拟器
# frida.get_usb_device  获取usb 设备
process = frida.get_usb_device().attach(9288)
#pid = device.spawn(["com.android.chrome"])
#session = device.attach(pid)
#device.resume(pid)

# 在目标进程里创建脚本
script = process.create_script(jscode)
# 注册消息回调
script.on("message", on_message)
print('[*] Hook Start Running')
# 加载创建好的javascript 脚本
script.load()
# 读取系统输入
sys.stdin.read()


apk逆向__滴答清单去会员
https://tig3rhu.github.io/2024/01/02/66__逆向_滴答清单去会员/
Author
Tig3rHu
Posted on
January 2, 2024
Licensed under