[Frida] 안드로이드 루팅 탐지 우회하기 2

Native Function

루팅 탐지 기법 우회를 위해 libc 모듈에서 실행되는 메소드를 후킹한다.

앱 리소스 보안을 위해 보안 솔루션을 적용한 경우 java레벨의 난독화와 최소화(mininalize)를 통해 어떤 메소드가 실행되는지 정적 분석을 통해 알 수 없다. 그렇기 때문에 시스템에 더 가까운 Native 함수를 후킹하여 루팅 패키지 검사, 시스템 권한 필요 명령어("su") 실행 등을 후킹한다.

 

앞선 포스트를 통해 조사한 루팅 탐지 기법은 다음과 같다.

 

Interceptor.attach()

Frida 스크립트에서 타켓 바이너리의 특정 함수가 호출되는 시점과 실행 후 반환되는 시점에 후킹을 하려면 Intercetpor.attach()을 통해서 흐름을 보거나 변경할 수 있다. 선언되어 있는 함수에 붙어서 함수 내부의 메모리에 접근한다.

 

Interceptor.attach(target,
	{
		onEnter: function(args)
		{
			args[1] = ptr("100"); // 인자값 '정수형 100'으로 조작

		},
		onLeave: function(retVal)
		{
			retVal.replace(830); // 반환값 '정수형 830'으로 조작
		}
	});

Interceptor.attach의 onEnter() 시점은 호출되는 시점, onLeave 시점에는 리턴정보가 저장된다. args는 후킹한 함수가 전달받는 인수의 배열이다. retval은 후킹한 함수의 리턴 값이다. 여기서 주의할 것은 실제 저장된 값이 아니라 해당 값을 가지고 있는 포인터가 전달된다.

 

Interceptor.replace()

replace는 attach와 다르게 함수를 완전히 대체한다. 새로운 함수를 작성하는 것이다. new NativeCallback()을 통해 콜백 함수를 정의할 수 있고, return 값 조작 뿐만 아니라 완전히 함수를 새로 정의할 수 있다.

 

Interceptor.replace(target, new NativeCallback(function()
	{
        return 123.4; // 반환값 'float형 123.4' 조작

	},'float',[]));

위의 예시는 기존 정수형(int)의 함수의 반환값을 실수형(float)으로 새로 작성(replace)하기 위한 코드이다. 단순히 return 값만 변경한 attach의 경우와는 달리 반환형의 자료형까지 변경하여 새로 정의 것이다.

Android Bypass Rooting

이제 목적인 안드로이드 루팅 탐지 우회를 구현한다. 루팅 탐지를 위해 다양한 기법들이 사용 되고 있고 그 중 몇 가지를 연구하고 소개하려 한다.

 


References

  1. https://py0zz1.tistory.com/m/154?category=867529
반응형