安卓运行原理以及hook so库,hook启动阶段和重载
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.原理
2.常用模块
hook so库
Module模块
Module.findExportByName(moduleName|null, exportName)
moduleName:lib名字
exportName:函数名字
返回exportName的地址
Module.findBaseAddress(moduleName)
moduleName:lib名字
返回lib的基地址
Process模块
Process.findModuleByAddress(address)
address:lib的指针地址
返回一个Module对象
Momery模块
Memory.readCString(pointer)
pointer:指针地址
把pointer还原成字符串
Memory.readUtf8String(pointer);
Memory.readAnsiString(pointer)
Interceptor模块:监听
.attach(target, callbacks)
target:指针地址
callbacks:回调函数
onEnter
onLeave
常Hook的系统so库
libc.so
常调用的函数:
void * dlopen(const char *filename, int flag)加载动态链接库
hook app启动阶段
思路是先hook
住包,然后重启
jscode= """
Java.perform(
function(){
var TestSig = Java.use('com.yaotong.crackme.MainActivity');
TestSig.onCreate.overload('android.os.Bundle').implementation = function(){
send('i am here')
return true;
}
}
)
"""
device = frida.get_usb_device()
//先hook住
pid = device.spawn(['com.yaotong.crackme'])
process = device.attach(pid)
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
、、 然后重启
device.resume(pid)
sys.stdin.read()
打印地址js
代码
//打印基地址
var base_address = Module.findBaseAddress('libc.so')
send('base_address:'+base_address)
//打印dlopen地址
var mod_address = Module.findExportByName('libc.so', 'dlopen');
send('mod_address:'+ mod_address);
//打印module地址
var lib_module = Process.findModuleByAddress(base_address);
send('lib_module_name:' + lib_module.name)
//监听
Interceptor.attach(mod_address, {
onEnter: function(args){
send("open(" + Memory.readUtf8String(args[0]) + "," + args[1] + ")")
},
onLeave:function(retval){
send("retval:" + retval)
}
})
如何进行重载
function printstack(){
send(Java.use('android.util.Log').getStackString(Java.use('java.lang.Exception').$new()))
}
function array2string(array){
var buffer = Java.array('byte', array)
var result = ""
for(var i=0;i<buffer.length;i++){
result += (String.fromCharCode(buffer[i]))
}
return result
}
Java.perform(
function(){
var MessageDigest = Java.use('java.security.MessageDigest');
//重载
MessageDigest.update.overload('[B').implementation = function(bytesarray){
send('i am here 0')
send('orig:' + array2string(bytesarray))
printstack()
this.update(bytesarray)
},
MessageDigest.update.overload('byte').implementation = function(bytesarray){
send('i am here 1')
send('orig:' + array2string(bytesarray))
printstack()
this.update(bytesarray)
},
MessageDigest.update.overload('java.nio.ByteBuffer').implementation = function(bytesarray){
send('i am here 2')
send('orig:' + array2string(bytesarray))
printstack()
this.update(bytesarray)
},
MessageDigest.update.overload('[B', 'int', 'int').implementation = function(bytesarray){
send('i am here 3')
send('orig:' + array2string(bytesarray))
printstack()
this.update(bytesarray)
},
MessageDigest.getInstance.overloads[0].implementation = function(algorithm){
send('i am here 4');
send('call ->getInstance for:' + algorithm)
return this.getInstance.overloads[0].apply(this, arguments)
}
}
)
getExportByName: 返回名为 exportName 的导出的绝对地址。 如果找不到这样的导出,找不到抛出异常
findExportByName: 返回名为 exportName 的导出的绝对地址。 如果找不到这样的导出,找不到就返回null
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |