Frida를 이용한 훅스크립트 자동 생성 기능 2차 내용이다.

완벽한 자동화를 목표했으나, 하면 할수록 넘어야할 산이 매우 많은 것을 느끼고 있다.


개발 2차시에 큰 목표는 다음과 같다.

  • 다중 Class/Method 후킹 스크립트 생성
  • Arg/Ret 입력/출력 시 데이터형에 따른 이슈 확인



이번에도 추가된 주요 기능만을 설명하겠다.


다중 함수 후킹 코드는 기본 후킹 코드을 세분화하여 필요한 횟수만큼 반복하는 형태로 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# self.target 은 타겟 Class정보를 Dic{}형태로 가진 List[] 변수
for i in range(len(self.target)):
    tClass = self.target[i]['class']
    tMethod = self.target[i]['method']
    mode = self.target[i]['mode']
    
    if self.target[i]['exe'> 0:
        exe = 'true'
 
    hcode += self.hook_head % (i, tClass, i, i, tMethod, i, i, tClass, tMethod, i, i, tMethod, i, tMethod, tMethod, tMethod)
            
    if (mode%2== 0:
        hcode += self.hook_arg_input
            
    if mode > 2:
        hcode += self.hook_tail % (exe, tMethod, tMethod, 'true')
    else:
        hcode += self.hook_tail % (exe, tMethod, tMethod, 'false')



후킹한 함수의 Argument Type이 object인 경우 해당 클래스 인스턴스의 멤버변수 정보(type, name, value)를 출력하는 기능이다.

arguments[index].class.getDeclaredFields() 해당 함수 실행 시 클래스멤버변수 정보를 배열로 반환한다.

# getDeclaredMethods( )는 클래스멤버함수 정보를 반환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(String(typeof(arguments[index])) == "object"){
    var var_name;
    var var_type;
    ownVars = arguments[index].class.getDeclaredFields();
 
    for(var i in ownVars){
        var_name = String(ownVars[i]).split('.');
        var_name = var_name[var_name.length-1];
 
        if(var_name!='$change' && var_name!='serialVersionUID') {
            var_type = String(ownVars[i]).split(' ');
            var_type = var_type[var_type.length-2];
            arg_dump += gubunja + "           L (" + var_type + ") " + var_name + " = " + String(eval("arguments[index]."+var_name+"['value']"));
        }
    }
}



+ Recent posts