컴퓨터공학 전공생의 보안 도전기✌

[안드로이드 리버싱] Week 7: Android Hooking 본문

Security/Mobile

[안드로이드 리버싱] Week 7: Android Hooking

A7uly 2022. 2. 23. 02:08

Hooking

운영 체제나 각종 프로그램에서 소프트웨어 구성 요소 간에 발생하는 이벤트, 함수 호출 등을 중간에서 바꾸거나 가로채는 방법.
이러한 간섭된 함수 호출, 이벤트 등을 처리하는 코드를 훅이라고 한다.
즉 특정 함수 코드를 가로채서 원하는 행위를 한 후 원래의 코드로 돌려놓는 기법.

윈도우, 리눅스

PLT 후킹 기법

ELF 프로그램에서 공유 라이브러리 함수(printf, memcpy 등)를 호출하여 사용할 때 PLT와 GOT를 호출한다.
PLT : Procedure Linkage Table. 외부 프로시저를 연결하는 테이블. 다른 라이브러리에 포함되어 있는 프로시저를 호출하여 사용할 수 있다.
GOT : Global Offset Table. PLT가 참조하는 테이블이며 실제 사용하는 함수의 주소들을 담는 테이블
GOT에 있는 함수의 주소값을 임의로 바꾸어서 원래의 동작이 아닌 다른 함수를 실행하도록 하는 방식.
import 함수만 후킹이 가능. 내부 함수는 불가능하다.
내가 실행시키는 것이 아니라 프로그램 내부에서 함수 호출을 통해 이루어지므로 너무 빈번하면 오히려 성능저하. 그래서 방어 목적으로 주로 사용
http://linforum.kr/bbs/board.php?bo_table=android&wr_id=731

 

안드로이드 ARM 후킹 기술 강좌

이번편에는 안드로이드 후킹 기술에 대하여 살펴보려고 합니다. 'Hook'이라는 단어만 들었을때에는 갈고리가 먼저 생각이 나는데, 단어 그대로 갈고리로 낚아채는 방법이라고 생각하시면 이해가

linforum.kr

Inline Hook

원본 함수 자체를 패치해서 함수를 악성코드로 리다이렉션하는 방식. 일반적으로 공격 대상 함수가 호출되어 시작하는 몇 바이트를 악성코드로 분기할 수 있도록 코드 패치를 사용한다.

Frida

DBI(Dynamic Binary Instrumentation) 도구이다. 즉 바이너리를 동적으로 실행하며 분석할 수 있는 도구이다.
파이썬 기반이며, native app에 대한 hooking으로 분석에 도움을 주는 도구이다.
실행중인 앱에 코드 명령어를 삽입하여 프로세스를 추적, 분석, 디버깅할 수 있는 도구.

실습 1

frida 설치

실행 안됨...?

package p000sg.vantagepoint.uncrackable1;



import android.util.Base64;

import android.util.Log;

import p000sg.vantagepoint.p001a.C0000a;



/* renamed from: sg.vantagepoint.uncrackable1.a */

/* loaded from: classes.dex */

public class C0005a {

    /* renamed from: a */

    public static boolean m1a(String str) {

        byte[] bArr = new byte[0];

        try {

            bArr = C0000a.m7a(m0b("8d127684cbc37c17616d806cf50473cc"), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0));

        } catch (Exception e) {

            Log.d("CodeCheck", "AES error:" + e.getMessage());

        }

        return str.equals(new String(bArr));

    }



    /* renamed from: b */

    public static byte[] m0b(String str) {

        int length = str.length();

        byte[] bArr = new byte[length / 2];

        for (int i = 0; i < length; i += 2) {

            bArr[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i + 1), 16));

        }

        return bArr;

    }

}

'Security > Mobile' 카테고리의 다른 글

[안드로이드 리버싱] Week 5  (0) 2022.02.10
[안드로이드 리버싱] Week 3  (0) 2022.01.20