android逆向神器之firda

这东西ios和android有部分相似
ios装插件,android是个原生的arm包,放进去运行一下。不过要端口转发如下:

echo hello world!!
source ~/.bash_profile
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
echo work

写成了脚本,没啥好说的。
花了些时间写了个挂钩脚本模版,留着以后用:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import frida
import sys
import optparse
import re

global session

def enume_proc():
    global session
    rdev = frida.get_remote_device()
    session = rdev.attach("com.tencent.mm")  
    modules = session.enumerate_modules()
    for module in modules:
        print module
        export_funcs = module.enumerate_exports()
        print "\tfunc_name\tRVA"
        for export_func in export_funcs:
            print "\t%s\t%s"%(export_func.name,hex(export_func.relative_address))

#枚举某个进程加载的所有模块
def proc_module_show():
    global session
    rdev = frida.get_remote_device()
    session = rdev.attach("com.tencent.mm")  #如果存在两个一样的进程名可以采用rdev.attach(pid)的方式
    modules = session.enumerate_modules()
    for module in modules:
        print module
        export_funcs = module.enumerate_exports()
        print "\tfunc_name\tRVA"
        for export_func in export_funcs:
            print "\t%s\t%s"%(export_func.name,hex(export_func.relative_address))


#hook native函数
def native_hook(name):
    global session
    rdev = frida.get_remote_device()
    session = rdev.attach(name)
    scr = """
    Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
        onEnter: function(args) {
            send("open("+Memory.readCString(args[0])+","+args[1]+")");
        },
        onLeave:function(retval){

        }
    });
    """
    script = session.create_script(scr)
    script.on("message" , on_message)
    script.load()
    sys.stdin.read()


'''如下代码为hook微信(测试版本为6.3.13,不同版本由于混淆名字的随机生成的原因或者代码改动导致名称不一样)com.tencent.mm.sdk.platformtools.ay类的随机数生成函数,让微信猜拳随机(tye=2),二摇色子总是为6点(type=5)'''
def hook(name):
    global session
    print name
    rdev = frida.get_remote_device()
    session = rdev.attach(name)
    scr = """
    Java.perform(function () {
    var ay = Java.use("com.sina.deviceidjnisdk.DeviceId");
    DeviceId.getDeviceId.implementation = function(){
        var type = arguments[0];
        send("type="+type);
        var result=this.getDeviceId();
        send("reuslt="+result)
        return result;
    };
    });
    """
    script = session.create_script(scr)
    script.on("message" , on_message)
    script.load()
    sys.stdin.read()
def on_message(message ,data):
    print message

'''枚举手机进程'''
def enume_proc():
    rdev = frida.get_remote_device()
    processes = rdev.enumerate_processes()
    for process in processes:
        print process
def find_proc(name):
    rdev = frida.get_remote_device()
    processes = rdev.enumerate_processes()
    for process in processes:
        if process.name==name:
            return True
    return False
def main():
    if len(sys.argv)>2:
        name=sys.argv[2]
    else:
        name="com.sina.weibo"

    if sys.argv[1]=='ps':
        enume_proc()

    elif sys.argv[1]=='hookjava':
        #等待程序启动,直接附加
        print "please app waiting launched..."
        while True:
            if find_proc(name)==False:
                continue
            else:
                break
        print "find process"
        hook(name)


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        if session:
            session.detach()
        sys.exit()
    else:
        pass
    finally:
        pass

据说还可以注入dex没试,记录下:



'''通过friada向android进程注入dex'''

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

jscode = """
Java.perform(function () {
    var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
    var context = currentApplication.getApplicationContext();
    var pkgName = context.getPackageName();
    var dexPath = "%s";
    var entryClass = "%s";
    Java.openClassFile(dexPath).load();
    console.log("inject " + dexPath +" to " + pkgName + " successfully!")
    Java.use(entryClass).%s("%s");
    console.log("call entry successfully!")
});
"""

def checkRequiredArguments(opts, parser):
    missing_options = []
    for option in parser.option_list:
        if re.match(r'^\[REQUIRED\]', option.help) and eval('opts.' + option.dest) == None:
            missing_options.extend(option._long_opts)
    if len(missing_options) > 0:
        parser.error('Missing REQUIRED parameters: ' + str(missing_options))

if __name__ == "__main__":
    usage = "usage: python %prog [options] arg\n\n" \
            "example: python %prog -p com.android.launcher " \
            "-f /data/local/tmp/test.apk " \
            "-e com.parker.test.DexMain/main " \
            "\"hello fridex!\""
    parser = optparse.OptionParser(usage)
    parser.add_option("-p", "--package", dest="pkg", type="string",
                      help="[REQUIRED]package name of the app to be injected.")
    parser.add_option("-f", "--file", dest="dexPath", type="string",
                      help="[REQUIRED]path of the dex")
    parser.add_option("-e", "--entry", dest="entry", type="string",
                      help="[REQUIRED]the entry function Name.")

    (options, args) = parser.parse_args()
    checkRequiredArguments(options, parser)
    if len(args) == 0:
        arg = ""
    else:
        arg = args[0]

    pkgName = options.pkg
    dexPath = options.dexPath
    entry = options.entry.split("/")
    if len(entry) > 1:
        entryClass = entry[0]
        entryFunction = entry[1]
    else:
        entryClass = entry[0]
        entryFunction = "main"

    process = frida.get_usb_device(1).attach(pkgName)
    jscode = jscode%(dexPath, entryClass, entryFunction, arg)
    script = process.create_script(jscode)
    script.on('message', on_message2)
    print('[*] Running fridex')
    script.load()
    sys.stdin.read()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值