App启动界面

  • 启动时,直接进入了这个界面,这是个Main界面
  • 需要输入密码,才能进入界面
  • 要想知道验证规则,需要看源代码
  • 这应该是个判断语句,要么把验证规则删掉,要么 Hook 直接返回True

查壳

JADX打开 apK ,查看apk有没有壳:一览无余,也没有混淆

反编译

做这一步的目的是为了找到 Main 主界面,一个 activity 就是一个界面,根据 name 值,在编译器中找到这个类。

查找验证规则

  • 粉色区域:获取输入的文本信息转化字符串的过程
  • 蓝色区域:将字符串做校验

我们再通过查找用例,看一下 securityCheck这个方法再哪

1
public native boolean securityCheck(String str);

发现这是一个 native 层的校验,也就是在.so

Hook代码

我们可以利用hook,控制 securityCheck 让他直接返回true

首先运行安卓服务端,以下代码依次执行:

1
2
3
4
adb shell su
cd /data/local/tmp
chmod 777 frida-server-12.11.13-android-arm64
./frida-server-12.11.13-android-arm64

再开启另一个命令行,映射端口:

1
2
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042

python脚本:

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
import frida, sys


def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)


js_code = """
Java.perform(function () {
var TestSig = Java.use('com.yaotong.crackme.MainActivity');
TestSig.securityCheck.implementation = function (str) {
// 下面这句话是无用的。
send('I am here');
return true;
};
});
"""
# 绑定类,返回process对象
process = frida.get_usb_device().attach('com.yaotong.crackme')
script = process.create_script(js_code)
script.on('message', on_message)
print('[*] Running CTF')
# 注入
script.load()
# 不让程序断掉
sys.stdin.read()

最终结果