1.原理

安卓运行原理以及hook so库,hook启动阶段和重载_hook

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
标签: android