Android 진단 시 유용하게 사용중인 frida를 이용하여 좀더 편리하게 작업하고자 후킹 자동화 코드를 개발하게 되었다.

# 어디까지나 내가 쓰기 편하기 위해 만든 내 입맛 맞춤용이다.


이러한 코드를 개발하게된 계기는 house 라는 반자동화(?) 모듈을 사용하는데 너무나도 훌륭한 모듈이지만 몇가지 기능이 아쉬워 직접 개발해보게 되었다.

그래서 house 코드들을 참고/분석하여 짜집기 식으로 개발하고 있다. (house 추천!!)


#house URL : https://github.com/nccgroup/house


코드 실행 시 다음의 입력을 요구하며, 요구에 맞게 선택하면 관련 기능의 스크립트를 자동으로 생성하여 Attach 하게된다.

  • class명을 입력하면 class내 method 목록이 나열되며, 목록 중 후킹 대상 method 선택(입력) 
  • method argument 타입 등의 정보는 자동으로 인식
  • method arg와 ret 데이터를 조회만 할것인지 조작까지 할 것인지 선택
  • arg와 ret 데이터 중 어떤 정보를 조작할지 선택
  • 후킹 함수의 실행 여부 선택(함수 실행을 못하도록 제한하는 경우를 고려)


아직 개선이 많이 필요한 코드이기에 전체 코드가 아닌 주요 부분만 포스트 하도록 하겠다.



Class 내 선언된 Method 정보(권한, 리턴타입, 함수명, 인자타입) 확인

1
2
3
4
5
6
7
8
9
10
Java.perform(function() {
    var method = "Methods:";
    var hook = Java.use("%s");
    var ownMethod = hook.class.getDeclaredMethods();
    ownMethod.forEach(function(value){
        method += String(value) + "/";
    });
    send(method);
    hook.$dispose;
});


후킹 대상 함수의 실행 콜 스택을 나열

1
2
3
function getCaller(){
    return clazz_Thread.currentThread().getStackTrace().slice(2,5).reverse().toString();
}



후킹 대상 함수를 지정 시 overload 함수가 있는지 알수 있으며, 반복문을 통해 모두 후킹

# 특정 함수만으로 제한하도록 구현할까 하다 우선 모두 후킹하도록 구현

1
2
3
4
5
6
hook0 = Java.use("클래스명");
var overloadz_hook0 = eval("hook0.메서드.overloads");
var count_over_hook0 = overloadz_hook0.length;
 
for (var i = 0; i < count_over_hook0; i++)
    hget_hook = eval('overloadz_hook0[i]');


후킹 대상 함수의 리턴 타입

1
var ret_type = String(hget_hook.returnType['className']);



동적으로 데이터를 입력하고 스크립트에서 받기

1
2
#python code
script.post({'type''input''payload': data})


1
2
3
4
5
6
7
//hook script
while (true){
    var op = recv('input'function(value) {
        recv_data = value.payload;
    });
    op.wait();
}



+ Recent posts