简单hook一下
arch3rn4r

使用的例题是**[CISCN 2022 东北]crackme_Android,**虽然这题的关键点在MD5爆破,但是它的主逻辑函数包括了“成功”和“失败”的判断,可以验证是否成功hook函数

我的环境

frida 16.4.2

雷电模拟器(adb也是使用的雷电模拟器自带的)

jadx

IDEA

初步分析

初步分析,拖入模拟器后运行,随便输一个数,得到报错信息

image

在jadx里使用文本搜索找到相应报错信息并得到判断条件

image

点击if判断里的“check”找到check函数

image

通过分析可知格式是flag{},然后还有个MD5,爆破,以下是爆破脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import hashlib

# 待破解MD5值
target_md5s =[]
flag=""str='8393931a16db5a00f464a24abe24b17a9040b57d9cb2cbfa6bdc61d12e9b51f2789e8a8ae9406c969118e75e9bc65c4327fbc7c3accdf2c54675b0ddf3e0a6099b1b81046d525495e3a14ff6eae76eddfa1740cd6bd483da0f7684b2e4ec84b371f07bf95f0113eefab12552181dd832af8d1eb220186400c494db7091e402b0'for i in range(8):
target_md5s.append(str[32*i:32*(i+1)])

# 生成所有可能的4位信息的列表
passwords = []
for a in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_':
for b in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_':
for c in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_':
for d in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_':
passwords.append(a+b+c+d)



# 逐个比较MD5值for md5 in target_md5s:
for password in passwords:
if hashlib.md5(password.encode('utf-8')).hexdigest() == md5:
flag+=password
print("Password found: " + password)
breakprint("flag{"+flag+"}")

好了题目解出来了,现在继续看hook函数

hook

先找到包名 com.example.crackme1,这一步可以使用MT管理器,但是现在不需要一步一步构建

找到所需hook的函数”check”,在jadx里直接右键复制代码就行,接下来演示是使用frida就复制frida的

image

前置准备

连接上模拟器,我用的是雷电模拟器,它的启动命令如下

1
.\adb start-server

然后连接frida服务(之前我把frida-server装在了data/local/tmp文件

1
2
3
4
.\adb shell
su
cd data/local/tmp
./frida-server

然后再开一个窗口进行端口转发

1
2
.\adb forward tcp:27042 tcp:27042
27042

之后可以检查一下有没有连上,有信息出来了就是连上了

1
2
frida-ls-devices
frida-ps -U

开始hook

frida-ps -U 找到进程名(这一步前需要你先在模拟器打开crackme1软件才行,不然就不会出现进程名)

image

然后连接

frida -U "进程名“ -l 脚本文件

frida -U CrackMe1 -l hook.js 我的脚本文件就是hook.js

连上了

image

这是hook.js文件,按照这个模板写就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function set_return() {
let MainActivity = Java.use("com.example.crackme1.MainActivity");
MainActivity["check"].implementation = function (flag) {
console.log(`MainActivity.check is called: flag=${flag}`);
let result = this["check"](flag);
console.log(`MainActivity.check result=${result}`);
return true;
};
}

function main() {
Java.perform(function() {
set_return();
});
}

setImmediate(main);

这里直接改为true,无论怎样都返回true

image

然后随便输入一个字符,此时点击它的判断就是Right了,就代表hook成功

image

真机hook

基本流程

在手机开发者模式打开usb调试,不同的手机开启方式稍有不同,可以在网上搜索打开方式

将usb线连上手机,在手机确认连接,可以使用以下指令检测有没有成功安装

1
.\adb devices

将apk安装到手机

1
.\adb install 电脑路径  

使用shell启动fs

1
2
3
4
.\adb shell
su
cd data/local/tmp
./fs

然后进行端口转发

1
./adb forward tcp:27042 tcp:27042

将hook.js文件连接上手机

frida -U CrackMe1 -l hook.js

image

和模拟器没有很大区别,最后也hook成功了

image

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 55.5k 访客数