美文网首页
每日总结-第五十二天-Android脱壳

每日总结-第五十二天-Android脱壳

作者: SamiraG | 来源:发表于2020-06-15 23:09 被阅读0次

参考链接

ApkShelling脱壳和FART脱壳
Frida从入门到入门—安卓逆向菜鸟的frida食用说明
初识Frida--Android逆向之Java层hook

ApkShelling

https://github.com/OakChen/ApkShelling

  • 修改XposedEntry.java中的targetPackages
private static final String[] targetPackages =
            new String[]{"com.sfysoft.shellingtest", "com.sfysoft.shellingtest2", "com.example.how_debug"};
  • 重启手机运行加壳程序
$ adb logcat -s Xposed
06-15 14:58:01.091  6048  6048 I Xposed  : Found com.SecShell.SecShell.ApplicationWrapper
06-15 14:58:01.119  6048  6064 I Xposed  : Thread: 246, File: /data/data/com.example.how_debug/00246-01.dex
06-15 14:58:01.228  6048  6064 I Xposed  : Thread: 246, File: /data/data/com.example.how_debug/00246-02.dex
  • pull 生成的dex
    如果出现Not found object的问题,可以先把文件移动到/sdcard/
root@angler:/data/data/com.example.how_debug # cp 00246-01.dex /sdcard/01.dex
root@angler:/data/data/com.example.how_debug # cp 00246-02.dex /sdcard/02.dex

Frida框架使用

push frida-server-arm64 /data/local/tmp
chmod 777 frida-server-arm64
./frida-server-arm64
# 端口转发
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042
# 检查是否成功
frida-ps -U

frida自带的Messages机制与进程交互

import frida, sys
 
//hook代码,采用javascript编写
jscode = """
//javascript代码,重点
"""
 
//自定义回调函数
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
 
#重点的4行代码
# 获取手机设备并附加到进程
process = frida.get_usb_device().attach('应用完整包名')
script = process.create_script(jscode)
# 回调
script.on('message', on_message)
# 在服务端就启动javascript脚本了
script.load()
sys.stdin.read()

这里用到的语言分别是python和javascript,他们之间的关系是python作为载体,javascript作为在android中真正执行代码。
运行给的两个实例

  1. 直接hook MainActivity中的OnCreate()方法,获取calc函数的返回值
    js代码解释
//Java.Perform 开始执行JavaScript脚本。
Java.perform(function () {
//定义变量MainActivity,Java.use指定要使用的类
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    //hook该类下的onCreate方法,重新实现它
    MainActivity.onCreate.implementation = function () {
        send("Hook Start...");
        //调用calc()方法,获取返回值
        var returnValue = this.calc();
        send("Return:"+returnValue);
        var result = (1000+returnValue)*107;
        //解出答案
        send("Flag:"+"SECCON{"+result.toString()+"}");
    }
});

完整实现

import frida, sys
 
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
 
jscode = """
Java.perform(function () {
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    MainActivity.onCreate.implementation = function () {
        send("Hook Start...");
        var returnValue = this.calc();
        send("Return:"+returnValue);
        var result = (1000+returnValue)*107;
        send("Flag:"+"SECCON{"+result.toString()+"}");
    }
});
"""

process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
  1. 修改MainActivity中的变量
    js代码
Java.perform(function () {
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    //hook onClick方法,此处要注意的是onClick方法是传递了一个View参数v
    MainActivity.onClick.implementation = function (v) {
        send("Hook Start...");
        //调用onClick,模拟点击事件
        this.onClick(v);
        //修改参数
        this.n.value = 0;
        this.m.value = 2;
        this.cnt.value = 999;
        send("Success!")
    }
});

完整代码实现

import frida, sys
 
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
 
jscode = """
Java.perform(function () {
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    MainActivity.onClick.implementation = function (v) {
        send("Hook Start...");
        this.onClick(v);
        this.n.value = 0;
        this.m.value = 2;
        this.cnt.value = 999;
        send("Success!")
    }
});
"""
 
process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()

由于关键的实现部分其实在于js代码,下面是frida js中的一些关键函数
https://www.frida.re/docs/javascript-api/

相关文章

网友评论

      本文标题:每日总结-第五十二天-Android脱壳

      本文链接:https://www.haomeiwen.com/subject/gxhhxktx.html