상세 컨텐츠

본문 제목

파이썬 바인딩_1

모바일 해킹의 개념

by ser-ser 2025. 4. 9. 15:44

본문

프리다를 활용해 모바일 애플리케이션 분선 및 디버깅 작업을 할 때, 파이썬 바인딩을 사용하면 작업을 훨씬 효율적으로 자동화할 수 있습니다. 이번 글에서는 파이썬 바인딩을 통해 프리다 작업을 자동화하는 방법을 자세히 다뤄보겠습니다.


프리다 작업 자동화의 주요 기능

  • 파이썬 코드를 실행하면 다음과 같은 기능을 쉽게 구현할 수 있습니다:
    • 프로세스 식별 및 연결: 대상 애플리케이션의 프로세스를 찾아 연결합니다.
    • 디바이스와 세션 연결: 연결된 디바이스에서 원하는 프로세스와 세션을 설정합니다.
    • 페이로드 자동 삽입: 자바스크립트로 작성된 페이로드를 자동으로 삽입하여 실행합니다.

왜 파이썬 바인딩을 사용하는가?

  • 이전 글들을 보면 자바스크립트 코드를 프리다 CLI  쉘에 직접 복사-붙혀넣기하거나, 한 줄씩 입력해 삽입했습니다. 하지만 이 방식은 코드 재사용이 어렵다는 단점이 있었습니다. 이를 해결하기 위해 자바스크립트 파일로 저장한 뒤 필요할 때마다 로드하는 방법을 사용하기도 했지만, 여전히 번거로움이 있었습니다. 이제 파이썬 바인딩을 활용하면 파이썬 코드 하나로 모든 과정을 한번에 처리할 수 있어 효율성이 크게 향상됩니다.

파이썬 바인딩의 기본 구조

  • 프리다 작업 시 파이썬 바인딩의 구조는 대상  프로세스가 이미 실행 중인지, 아니면 시작 전이지에 따라 조금 다릅니다. 아래에서 두 가지 경우를 살펴보겠습니다.

메인 스트립 실행 중일 때

  • 대상 애플리케이션이 이미 실행 중인 경우, 아래와 같은 뼈대 구조를 사용합니다.
    import frida, sys
    # frida와 sys 모듈 가져오기
    
    jscode = """payload_code"""
    # 삽입할 자바스크립트 코드 작성
    
    session = frida.get_remote_device().attach("패키지 이름")
    # 연결된 디바이스의 프로세스에 연결
    
    script = session.create_script(jscode)
    # 자바스크립트 코드를 프리다에서 실행 가능하도록 생성
    
    script.load()
    # 생성된 스크립트를 로드
    
    sys.stdin.read()
    # 스크립트가 실행되기 전에 프로세스가 종료되는 문제 방지

메인 스트림 시작 전

  • 대상 애플리케이션이 아직 실행되지 않은 상태라면, 프로세스를 생성하고 실행하는 단계를 추가해야 합니다.
    import frida, sys
    # frida와 sys 모듈 가져오기
    
    jscode = """payload_code"""
    # 삽입할 자바스크립트 코드 작성
    
    device = frida.get_remote_device()
    # 연결된 디바이스 가져오기
    
    pid = device.spawn(["패키지 이름"])
    # 연결된 USB 장치에서 패키지 프로세스 생성
    
    session = device.attach(pid)
    # 생성된 프로세스에 연결
    
    script = session.create_script(jscode)
    # 자바스크립트 코드를 프리다에서 실행 가능하도록 생성
    
    script.load()
    # 생성된 스크립트를 로드
    
    device.resume(pid)
    # 프로세스의 메인 스레드 실행
    
    sys.stdin.read()
    # 스크립트가 실행되기 전에 프로세스가 종료되는 문제 방지

파이썬 바인딩 테스트 예제

  • 이제 실제로 동작하는 예제를 작성해보겠습니다. 아래 코드는 onResume 함수가 호출될 때마다 콘솔 로그를 출력하는 스크립트 파이썬 바인딩으로 구현한 것입니다. 테스트 대상은 파이어폭스(org.mozilla.firefox)입니다.
    import frida, sys
    
    jscode = """
    Java.perform(function() {
        var act = Java.use("android.app.Activity");
        act.onResume.implementation = function() {
            console.log("[*] onResume() got called!");
            this.onResume();
        };
    });
    """
    # 자바스크립트 코드: Activity의 onResume 호출 시 로그 출력
    
    session = frida.get_remote_device().attach("org.mozilla.firefox")
    # 파이어폭스 프로세스에 연결
    
    script = session.create_script(jscode)
    # 자바스크립트 코드를 스크립트로 생성
    
    script.load()
    # 스크립트 로드
    
    sys.stdin.read()
    # 프로세스 종료 방지




패키지 이름을 찾을 수 없을 때 (오류)

  • 만약 대상 패키지의 이름을 찾거나 연결하는 데 문제가 생긴다면, ADB를 통해 포트를 열어주는 방법이 유용합니다. CMD열어 py3에 접속합니다 이후 adb forward tcp:27042 tcp:27042를 입력하여 포트를 조정합니다.

테스트 실행 및 결과 확인

  • 아무렇게나 이름을 지어주고 파일을 저장합니다. 저는 binding_test.py 파일명으로 저장을 진행했습니다.
  • CMD 창에서 python binding_test.py를 입력하여 파이썬 파일을 실행합니다.


  • 오류 없이 실행되면 성공입니다. 파이어폭스를 클릭해 onResume 로그가 출력되는지 확인합니다.

종료 명령어 추가

    • 기본 코드에서는 sys.stdin.read() 때문에 스크립트가 끝나지 않아 CMD 창을 강제로 꺼야 하는 불편함이 있습니다. 이를 해결하기 위해 exit 명령어를 추가해 스크립트를 종료할 수 있도록 수정해보겠습니다.
      import frida, sys
      
      jscode = """
      Java.perform(function() {
          var act = Java.use("android.app.Activity");
          act.onResume.implementation = function() {
              console.log("[*] onResume() got called!");
              this.onResume();
          };
      });
      """
      
      session = frida.get_remote_device().attach("org.mozilla.firefox")
      script = session.create_script(jscode)
      script.load()
      
      # 종료 명령어 추가
      while True:
          line = sys.stdin.readline().strip()
          if line.lower() == 'exit':
              session.detach()
              break

      • sys.stdin.read()를 제거하고, while 루프를 추가했습니다.
      • 이제 콘솔에 exit를 입력하면 스크립트가 종료됩니다.
    • 수정된 파일을 저장하고 다시 CMD창을 여러 파이썬 코드를 실행합니다.
    • exit 입력 시 스크립트가 정상적으로 종료되는지 확인합니다.

이렇게 파이썬 바인딩을 활용하면 프리다 작업을 보다 효율적이고 간편하게 자동화할 수 있습니다. 특히 exit 명령어를 추가하면 작업 후 깔끔하게 종료할 수 있어 더욱 편리합니다.

'모바일 해킹의 개념' 카테고리의 다른 글

파이썬 바인딩_2  (0) 2025.04.09
프리다 자바스크립트 활용하기_2  (1) 2025.04.09
프리다 자바스크립트 활용하기  (0) 2025.04.08
프리다 CLI 사용하기  (0) 2025.04.08
프리다 기본 문법  (0) 2025.04.05

관련글 더보기