Frida로 라이브러리 로드 정리 ( 내용추가 )
1. 동작중인 패키지의 특정 라이브러리를 후킹하고 싶을 경우. ( 메소드명 )
var moduleName = "libil2cpp.so";
var hookFunctions = [
{
name: "_ZN9Character17calculateCoolTimeEf", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
},
onLeave: function(ret){
// TODO: your code here
}
},
{
name: "sample1", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
console.log('hi')
},
onLeave: function(ret){
// TODO: your code here
}
},
{
name: "sample2", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
console.log('hi')
},
onLeave: function(ret){
// TODO: your code here
}
},
];
hookNative();
function hookNative(){
for(var i = 0; i < hookFunctions.length; i++){
Interceptor.attach(Module.findExportByName(moduleName, hookFunctions[i].name),{
onEnter: hookFunctions[i].onEnter,
onLeave: hookFunctions[i].onLeave
});
}
}
1-1. 동작중인 패키지의 특정 라이브러리를 후킹하고 싶을 경우. ( 주소값 )
var moduleName = "libil2cpp.so";
var hookFunctions = [
{
offset: "0x8456", // 오프셋 입력
onEnter: function(args){
// TODO: your code here
},
onLeave: function(ret){
// TODO: your code here
}
},
];
hookNative();
function hookNative(){
var base_offset = Module.getBaseAddress(moduleName);
for(var i = 0; i < hookFunctions.length; i++){
var offset = base_offset.add(hookFunctions[i].offset)
Interceptor.attach(offset, {
onEnter: hookFunctions[i].onEnter,
onLeave: hookFunctions[i].onLeave
});
}
}
2. 특정 라이브러리가 로드 되었을 때, 후킹하고 싶을 경우. ( 메소드명 )
var moduleName = "libMyGame.so";
var moduleLoaded = 0
var hookFunctions = [
{
name: "_ZN9Character17calculateCoolTimeEf", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
},
onLeave: function(ret){
// TODO: your code here
}
},
{
name: "sample1", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
console.log('hi')
},
onLeave: function(ret){
// TODO: your code here
}
},
{
name: "sample2", //후킹할 메서드명 입력
onEnter: function(args){
// TODO: your code here
console.log('hi')
},
onLeave: function(ret){
// TODO: your code here
}
},
];
Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
// console.log("[*] android_dlopen_ext( " + path + " )");
if(path.indexOf(moduleName) != -1){
moduleLoaded = 1
}
},
onLeave: function(args) {
if(moduleLoaded == 1) {
moduleLoaded = 0
hookNative();
}
}
});
Interceptor.attach(Module.findExportByName(null, "dlopen"), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
// console.log("[*] dlopen( " + path + " )");
if(path.indexOf(moduleName) != -1){
moduleLoaded = 1
}
},
onLeave: function(args) {
if(moduleLoaded == 1) {
moduleLoaded = 0
hookNative();
}
}
});
function hookNative(){
for(var i = 0; i < hookFunctions.length; i++){
Interceptor.attach(Module.findExportByName(moduleName, hookFunctions[i].name),{
onEnter: hookFunctions[i].onEnter,
onLeave: hookFunctions[i].onLeave
});
}
}
2-2. 특정 라이브러리가 로드 되었을 때, 후킹하고 싶을 경우. ( 주소값 )
var moduleName = "libMyGame.so";
var moduleLoaded = 0
var hookFunctions = [
{
offset: "0x8456", // 오프셋 입력
onEnter: function(args){
// TODO: your code here
},
onLeave: function(ret){
// TODO: your code here
}
},
];
Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
// console.log("[*] android_dlopen_ext( " + path + " )");
if(path.indexOf(moduleName) != -1){
moduleLoaded = 1
}
},
onLeave: function(args) {
if(moduleLoaded == 1) {
moduleLoaded = 0
hookNative();
}
}
});
Interceptor.attach(Module.findExportByName(null, "dlopen"), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
// console.log("[*] dlopen( " + path + " )");
if(path.indexOf(moduleName) != -1){
moduleLoaded = 1
}
},
onLeave: function(args) {
if(moduleLoaded == 1) {
moduleLoaded = 0
hookNative();
}
}
});
function hookNative(){
var base_offset = Module.getBaseAddress(moduleName);
for(var i = 0; i < hookFunctions.length; i++){
var offset = base_offset.add(hookFunctions[i].offset)
Interceptor.attach(offset, {
onEnter: hookFunctions[i].onEnter,
onLeave: hookFunctions[i].onLeave
});
}
}
설명 : hookFunctions 안이 Array로 되어있으니 첫번쨰 예제처럼 쭈욱 추가하시면 각각의 메서드를 후킹 하실수 있습니다.
1번째 방식은 attach 방식으로 실행하시면 되겠고, 2번쨰 방식은 Spawn 방식(-f 옵션)으로 실행하시면 될것 같습니다.
+ 내용추가
Method 명 이외의 Offset 기반의 코드를 추가했습니다.
Offset기반은 테스트를 못해봐서 문제있을시 댓글부탁드립니다