ActiveX를 작성해야할 일이 생겨서, Windows 10에 Viusal 6.0을 설치하는데 너무도 많은 삽질에 블로그에 기록합니다..

 

Visual Studio 6.0 iso 파일 다운로드 혹은 CD를 통해 파일 로드 후, 로컬 PC 내 임의 폴더로 설치 파일을 모두 복사합니다.

설치 파일 중, SETUPWIZ.INI 내 VmPath 의 내용을 삭제합니다.

(VmPath를 기존값대로 설정하면, 예전 XP 시절의 javx를 읽어서 에러가 난다고 하네요)

그 후, setup.exe파일의 설정을 변경해줍니다

호환 모드를 Windows XP SP3으로 변경해주고, 관리자 권한으로 실행에 체크합니다

설정 및 실행하여 라이센스 키 입력 및 다음을 누르다 보면, 아래와 같은 화면을 만나실 수 있습니다.

Visual FoxPro, InterDev, SourceSafe는 필요가 없으니 체크 해제 하고, Data Access를 클릭한 후 오른쪽 화면의 Change Option...을 클릭합니다.

ADO, RDS and OLE ~~~를 체크해제 하고 OK를 클릭합니다. 

저 설정이 체크되어 있으면 Windows 10에서 설치 시 에러가 발생합니다.

다시 Enterprise Tools를 체크하고 Change Option..를 클릭 후, 하단의 Visual Studio Analyzer를 체크해제 합니다.

 

OK 및 Continue 하여 설치하고 도중에 나오는 팝업은 그냥 다음 혹은 OK만 눌러주세요

설치가 완료되면 다음과 같은 화면을 확인 할 수 있습니다

Windows 재부팅합니다

재부팅하고 나면, 다음과 같은 팝업이 출력되는데 Install MSDN 체크 해제 해주시고 넥스트 및 중간에 나오는 Register도 체크해제 해주세요

그 후에, SP6 설치를 해줘야 합니다.

다운로드 페이지는 링크와 같습니다.

 

SP 6 설치 후후 Visual studio 6.0 C++을 실행해서 ActiveX 프로젝트 생성하자마자 테스트 겸 컴파일을 했는데... 아래와 같은 에러가 출력되더군요 ㅠ

midl\oleaut32.dll : error MIDL2020 : error generating type library : SaveAllChanges Failed : .\Debug\1234.tlb

여기서 한참 고생했는데요....

visual studio 6.0 C++를 관리자 권한으로 실행한 뒤에 컴파일 하면 정상적으로 컴파일이 됩니다..(ㅂㄷㅂㄷ..)

 

APP의 소스코드가 담긴 DEX파일을 숨기는 것은 매우 중요합니다

 

DEX 파일만 획득할 수 있다면, 원본 소스코드에 가깝게 복호화가 가능하므로 많은 개발자들 혹은 악성코드 제작자들은 DEX파일을 숨기기 위해 다양한 방법을 사용합니다

 

DEX파일 숨기기 위해, 많은 앱들이 Multi Dex를 이용합니다

MultiDex에 대한 내용은 아래 포스팅을 참고하고, MultiDex로 작성된 앱에 대한 동적디버깅 방법을 다뤄보고자 합니다

https://taesun1114.tistory.com/entry/Dynamic-Code-Loading-in-Android-featDexClassloader

다만, 해당 방법은 원본 DEX를 획득했다는 가정하에 두개의 DEX파일을 이용한 동적 디버깅 방법입니다

 

JEB를 통해 APK파일 로드 및 단말기에서 다음과 같은 명령으로 디버깅보드로 앱을 실행합니다

DEX파일 내 코드에서 DEX를 로드하는 DexClassLoader함수 직전에 BP설정(Ctrl+B) 및 원본 DEX에서 디버깅하고자 하는 코드에 같은 방법으로 BP를 설정합니다

 

JEB 메뉴 중 [파일] - [아티팩트 추가]를 통해 획득한 원본 DEX파일 추가 및 디버깅 하고자 하는 코드에 BP를 설정합니다

 

[디버거] - [시작]을 통해 단말기에서 앱을 실행하면 첫번째 DEX의 BP(DexClassLoader)에서 대기합니다.

Ctrl + F6을 통해 DexClassLoader함수를 실행하면 아래와 같이 원본 DEX의 BP를 설정한 부분에서 대기하는 것을 볼 수 있습니다

 

출처 : www.pnfsoftware.com/blog/debugging-dynamically-loaded-dex-files-with-jeb/

'Mobile' 카테고리의 다른 글

INSTALL_FAILED_INVALID_APK (with. zipalign)  (0) 2020.12.03
Frida cheat sheet  (0) 2020.10.11
Dynamic Code Loading in Android (feat.DexClassloader)  (3) 2020.05.08
odex to dex  (0) 2020.05.08
ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23

안드로이드 악성코드 분석 시, 원본 dex를 숨기기 위해 dex파일 동적로딩을 하는 경우가 많이 있습니다.

 

동적으로 Dex파일을 로드하기 위해선 파일 혹은 메모리에서 로드하는데 다음과 같은 함수를 사용하게 됩니다.

 

From file:
dalvik.system.DexFile.loadDex depreciated after API 26
dalvik.system.DexClassLoader
dalvik.system.PathClassLoader


From memory:
dalvik.system.InMemoryDexClassLoader (not common in malwares)

 

파일을 통한 동적로딩 중 DexClassLoader함수를 이용하여 동적로딩하는 코드 작성 및 분석 방법을 확인하겠습니다.

android developer를 통해 확인한 dexclassloader 함수 형식입니다.

아래는 dexclassloader를 이용하여 외부 apk의 dex를 로드하는 코드 예제입니다.

 

dexclassloader.java


public class MainActivity extends AppCompatActivity {
   static final int BUF_SIZE = 8 * 1024;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      findViewById(R.id.button).setOnClickListener(
      new Button.OnClickListener(){
         public void onClick(View v){
         String text = loadClass2();
         Toast.makeText(getApplicationContext(),text,Toast.LENGTH_LONG).show();
         }
      });

   }

 

   private String loadClass2(){
      String APPJS = "test.apk";   // 불러올 apk 이름 명시
      File dexInternalStoragePath = new File(getDir("cache",Context.MODE_PRIVATE), APPJS);
      BufferedInputStream bis = null;
      OutputStream dexWriter = null;

      try {                             // asset 폴더 내 저장된 apk파일을 앱 내 read가 가능한 영역으로 복사                    

                                        // (/data/data/<app>/app_cache/)
         bis = new BufferedInputStream(getAssets().open(APPJS));
         dexWriter = new BufferedOutputStream(new FileOutputStream(dexInternalStoragePath));
         byte[] buf = new byte[BUF_SIZE];
         int len;
         while ((len = bis.read(buf, 0, BUF_SIZE)) > 0) {
            dexWriter.write(buf, 0, len);
         }
         dexWriter.close();
         bis.close();
      } catch (Exception e) {
// TODO Auto-generated catch block
         e.printStackTrace();
      }

      final File optimizedDexOutputPath = getDir("cache",Context.MODE_PRIVATE);    // 복사한 apk파일 경로 획득
      DexClassLoader dexClassLoader = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(), null,getClassLoader());     //dex 파일 로드
     try {
        Class clazz = dexClassLoader.loadClass("com.example.user.test.test");  // dex 파일 내 class 로드
        Object object = clazz.newInstance();
        Method method = clazz.getMethod("get_Message");    //class 내 method 로드
        String text = (String) method.invoke(object);   //method 호출
        return text;
      }catch (Exception e){
        e.printStackTrace();
      }
      return "Error..!!";
   }

}


test.java(test.apk)

 

package com.example.user.flag;

 

 

public class test{
  public String get_Message(){
      return "Catch Me!";
   }

}

 

test.java의 경우 앱 실행은 되지 않지만 빌드를 통해 apk파일 생성 및 dexclassloader.java가 있는 프로젝트 assets 파일 내 apk파일 복사


이렇게 작성된 앱의 경우, assets파일 내 apk파일이 존재하는 것을 모른다면 test.java의 내용을 알기 어렵습니다.

 

원본 Dex 추출을 위해 앱 실행 및 단말기 내 /proc/<pid>/maps를 확인하여 불러오는 dex파일의 위치를 확인합니다.

그 후 해당 위치(위 예제 앱의 경우 /data/data/<package_name>/app_cache/)에 복사한 dex파일이 존재합니다.

 

다만, 복사한 dex파일은 odex파일로 dex형식으로 변환하여 원본소스코드 확인이 가능합니다.

'Mobile' 카테고리의 다른 글

Frida cheat sheet  (0) 2020.10.11
MultiDex Dynamic Debug(feat. JEB)  (0) 2020.05.18
odex to dex  (0) 2020.05.08
ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23
IDA DEX,SO 동적디버깅  (0) 2019.09.23

what is odex file?

- Android에서 앱 설치 시점에 컴파일하여 실행을 위한 최적화된 파일로 변환하며, 현재 단말기에서 최적화를 위해 변환되어 저장되는 파일

 

안드로이드 분석 시, apk 내 dex파일이 없는 앱이 존재하는데 해당 앱에는 dex 파일 대신 odex파일을 통해 앱을 실행시킵니다.

odex파일의 경우 안드로이드에서 자체적으로 앱 설치 시 컴파일 되는 파일이므로 리눅스 실행파일 헤더를 가지게 되며, 이를 dex파일로 변환해줘야 기존의 디컴파일 툴을 통해 원본 소스코드 확인이 가능합니다.

 

odex to dex

odex 파일 변환을 위해서는 baksmali/smali.jar가 필요하며 아래 주소를 통해 다운받을 수 있습니다.

 

www.bitbucket.org/JesusFreke/smali/downloads/

 

JesusFreke / smali / Downloads — Bitbucket

 

bitbucket.org

baksmali / smali.jar 다운로드 후 변환하고자 하는 odex파일을 같은 디렉토리에 위치 시킨 후 다음 명령어를 입력합니다.

java -jar baksmali.jar d <변환하고자 하는 odex파일 및 경로> -o <결과값이 저장될 폴더명>

 

명령어를 실행하면 아래와 같이 odex파일에서 smali 파일을 추출합니다

smali.jar를 통해 획득한 smali코드를 dex파일로 변환합니다.

java -jar smali.jar a <결과값이 저장된 폴더명> -o classes.dex

명령어를 실행하면 classes.dex파일을 획득할 수 있으며, jadx/jd-gui와 같은 툴을 통해 원본 소스코드 확인이 가능합니다.

 

참고

odex : www.howlling.tistory.com/55

'Mobile' 카테고리의 다른 글

MultiDex Dynamic Debug(feat. JEB)  (0) 2020.05.18
Dynamic Code Loading in Android (feat.DexClassloader)  (3) 2020.05.08
ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23
IDA DEX,SO 동적디버깅  (0) 2019.09.23
DVIA (Binary Patching)  (0) 2019.09.03

https://securitynote.tistory.com/13

 

[Android] DirtyCow(더티카우) 취약점 (CVE-2016-5195)

DirtyC0w(더티카우) 취약점 (CVE-2016-5195) 개요 1) DirtyC0w (더티카우) 취약점이란? : 2016년 10월 CVE-2016-5195 취약점 : 루트 권한으로도 변경할 수 없었던 default.prop 파일을 익스플로잇을 통해 수정 가..

securitynote.tistory.com

ro.debuggable을 변경하면 앱 manifest.xml파일에 android:debuggable="true" 옵션이 없어도 동적 디버깅이 가능하다는 내용이다.

 

하지만... root explorer로 ro.debuggable을 변경한 후 설레는 맘으로 동적 디버깅을 시도했으나...

 

??

 

이상하게 ro.debuggable=1인데도 동적디버깅이 되지 않았다.

 

https://www.bodkin.ren/index.php/archives/533/

 

Android 「动态分析」打开调试开关的三种方法 - SewellDinG @ 老 锥

应用的动态调试是Android逆向的大类,而打开可调试开关则是动态调试的第一步,总结一下打开开关的三种方法; AndroidManifest.xml 最常规的方法,拿到一个应用后,直接反编译,在AndroidManifest.xml的application中添加android:debuggable="true"字段,在回编译、签名、安装、然后进行动态调试; mprop 修改系统调试的总开关字段,由于系统文件只可读,强制修改重新编译镜像再刷入设备又很复杂还不安全,这里可以注入init进程,修改内存中的ro.d

www.bodkin.ren

위 포스팅을 통해 해답을 찾았는데

 

default.prop의 값을 변경해도 메모리에 올라와있는 속성 값은 그대로 0 이기 때문에 동적 디버깅이 되지 않는다.

 

위 블로그에서 mprop라는 파일을 다운받아, 실행하면 ro.debuggable값이 1로 패치 된다.

 

Usage

./mprop ro.debuggable 1

 

어떤 원리인지 궁금해서 살펴본 결과, /proc/1/maps의 /dev/__properties__안의 값을 변경하고 있다.

 

실제 단말기에서 확인한 결과, /init 프로세스의 /dev/__properties__의 메모리 주소를 확인한 후 인자로 받은 변경하고자 하는 속성값을 검색 후 값을 변경하는 것으로 보인다.

 

해당 메모리 주소의 값을 살펴보니 인자로 넣어 준 debuggable의 값이 들어있고 정상적으로 0x31(1)로 값이 변경된 것을 확인할 수 있었다.

 

이 후, manifest.xml 파일에 android:debuggable="true"값이 없어도 정상적으로 동적 디버깅이 가능함.

 

갓 중국...

'Mobile' 카테고리의 다른 글

Dynamic Code Loading in Android (feat.DexClassloader)  (3) 2020.05.08
odex to dex  (0) 2020.05.08
IDA DEX,SO 동적디버깅  (0) 2019.09.23
DVIA (Binary Patching)  (0) 2019.09.03
Cydia Impactor 에러 모음  (1) 2019.09.03

How to debug Dalvik and ARM code together?

 

안드로이드 동적 디버깅 시, SO파일을 동적 디버깅해야 하는 경우가 종종 생깁니다. (사실상 거의 필수...)

 

IDA에서 classes.dex파일과 so파일을 같이 디버깅하는 법은 다음과 같습니다.

 

먼저 아이다 설치 위치(default : C:\Program Files\IDA 7.0)의 dbgsrv 폴더 내 android_server파일을 단말기에 업로드 후 실행시켜 줍니다.

ex)

$ adb push android_server /data/local/tmp

$ adb forward tcp:23946 tcp:23946

$ adb shell

$ su

$ chmod 777 /data/local/tmp/android_server

$ /data/local/tmp/android_server &

실행 후, 디버깅하려는 dex파일과 so파일을 각각 IDA를 통해 로드하고 종단점을 설정합니다.

classes.dex파일을 로드한 IDA의 [Debugger] - [Debugger options..] 내 다음 내용을 입력합니다.

Activity는 앱 처음 실행 시 로드되는 activity명을 입력해주시면 됩니다.

Process Start (F9)하여 앱 실행시키고 종단점을 설정한 부분에서 대기하는 것을 확인합니다.

so파일을 로드한 IDA로 돌아와서, debugger를 Remote ARM Linux/Android debugger로 변경합니다.

[Debugger] - [Process options..]의 Hostname을 설정합니다. (default : 127.0.0.1)

[Debugger] - [Attach Process]를 통해 디버깅하려는 앱 선택 후 다음과 같은 화면이 나타나면 왼쪽 상단의 start버튼을 클릭합니다.

dex파일을 로드한 IDA로 돌아와 F8버튼으로 so파일 로드하는 함수를 실행하면 Running이라는 알람이 출력됩니다.

So파일을 로드한 IDA로 돌아오면 기존에 설정한 종단점에서 대기하는 것을 확인할 수 있습니다.

 

출처 : https://www.hexblog.com/?p=809

 

IDA Dalvik debugger: tips and tricks – Hex Blog

One of the new features of IDA 6.6 is the Dalvik debugger, which allows us to debug Dalvik binaries on the bytecode level. Let us see how it can help when analysing Dalvik files. Encoded strings Let us consider the package with the encrypted strings: STRIN

www.hexblog.com

 

'Mobile' 카테고리의 다른 글

odex to dex  (0) 2020.05.08
ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23
DVIA (Binary Patching)  (0) 2019.09.03
Cydia Impactor 에러 모음  (1) 2019.09.03
DVIA (Jailbreak Detection 2 ... Frida)  (0) 2019.08.28

DVIA 앱의 [MENU] - [Binary Patching]을 풀어보겠습니다.

 

첫 화면이고, 여러 문제를 볼 수 있는데 Login Method 1 / Check For Jailbreak / Show alert / Kill Application이 있지만 Login Method 1만 풀이를 올리도록 하겠습니다. 사실 하나만 풀면 나머지도 다 풀 수 있는거라.. ;)

 

IDA를 통해 login 문자열이 들어간 함수를 확인한 결과 ApplicationPatchingDetailsVC loginMethod1Tapped:를 확인할 수 있었습니다.

 

사실 소스코드를 좀만 살펴보면 소스에 ID/PW가 노출되어 있지만, 목적은 이게 아니니까 넘어가서 비교 후 분기문이나 인증 성공 함수 호출하는 부분을 찾아보겠습니다.

 

해당 함수의 끝 부분에 분기문을 통해 인증 결과값으로 성공 혹은 실패 로직을 실행하고 있습니다.

그럼 분기문(B.EQ loc_100170C58)을 변조하여 인증실패일 경우 SuccessPage를 호출하는 것으로 Binary를 패치하겠습니다.

 

이 페이지에서 opcode의 hex값을 확인 할 수 있는데, BEQ는 000100, BNE는 000101인 것을 확인 할 수 있습니다.

 

다음과 같이 IDA에서 BEQ(000100)을 BNE(000101)로 변경해줍니다. 

 

IDA에서 확인하면 BNE로 변경된 것을 확인 할 수 있습니다.

다만.. IDA에서 Binary Patch가 안되서 Hopper라는 툴을 많이 이용한다고 하시는데요(IDA에서도 되나요?) 저는 그냥 IDA에서 분석하고 헥스에디터로 헥스값을 변경해 줍니다... (Hopper는 유료입니다)

 

IPA파일을 zip파일로 확장자 변경 후, 실제 실행파일을을 헥스에디터 프로그램으로 열어서 원하는 바이너리를 변경하고 Cydia Impactor로 재설치 해주세요

 

재설치 후에 임의의 문자열(aa/aa)를 입력한 결과,

 

인증 우회하여 로그인에 성공한 화면을 확인할 수 있습니다.

 

※ OPCode 출처 : https://opencores.org/projects/plasma/opcodes

'Mobile' 카테고리의 다른 글

ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23
IDA DEX,SO 동적디버깅  (0) 2019.09.23
Cydia Impactor 에러 모음  (1) 2019.09.03
DVIA (Jailbreak Detection 2 ... Frida)  (0) 2019.08.28
DVIA (Jailbreak Detection ... Frida)  (3) 2019.08.27

case 1)

Error - installation.cpp:42 The WatchKit 2.0 app being installed contains an invalid application executable

solution - Open .ipa as zip, delete directory Payload/xxx.app/Watch, save

 

에러 발견 시 마다 업데이트 예정...

'Mobile' 카테고리의 다른 글

IDA DEX,SO 동적디버깅  (0) 2019.09.23
DVIA (Binary Patching)  (0) 2019.09.03
DVIA (Jailbreak Detection 2 ... Frida)  (0) 2019.08.28
DVIA (Jailbreak Detection ... Frida)  (3) 2019.08.27
iOS 12 - 12.1.2 Jailbreak(with. Unc0ver)  (1) 2019.07.10

지난 포스팅(DVIA Jailbreak Detection 1)에 이어서 포스팅하겠습니다.

 

Jailbreak Test 1만 우회를 했었고, Jailbreak Test2 로직 분석 및 우회를 하겠습니다.

 

IDA로 실행파일을 뜯어보면,

 

jailbreak Test2 Tapped:라는 함수를 확인할 수 있습니다. 여기서 탈옥 여부 확인 후 showAlertForJailbreakTestisJailbroken 함수에서 Alert띄워주는 것 같네요.

 

인자로 boolean형을 받고 리턴타입은 없는 것을 확인할 수 있습니다.

 

인자로받은 값을 이용해서 탈옥폰인지 순정폰인지 Alert을 띄워주네요

 

그럼 Frida를 통해 인자값을 변조하도록 하겠습니다.

 

Frida 공홈에 들어가면 기본적으로 나와있는 소스인데, 해당 소스를 통해 앱이 가지고 있는 클래스명을 전부확인이 가능합니다.

 

실행시키면 다음과 같이 IDA에서 확인했던, Jailbreak클래스를 확인할 수 있습니다.

 

위에서 확인했던 클래스 내에 선언되어 있는 함수를 확인하는 소스입니다.

 

IDA에서 확인했던 jailbreakTest2Tapped:를 확인할 수 있네요.

 

이처럼 showAlertForJailbreakTestisJailbroken 함수를 찾아저 해당 함수명을 다 적어줘야 합니다.

앞뒤의 특수문자 - , : 까지 다 적어줘야 프리다에서 후킹이 가능합니다.(이부분에서 한참고생했네요...)

 

IDA에서 클래스 및 함수명까지 확인했는데 굳이 프리다로 또 찾아가는 이유는?

비교해 보면 IDA로 보는 함수명과 프리다로 출력한 함수명이 조금다른것을 볼 수 있는데요, 이 차이 때문에 Frida가 Method를 찾지 못하므로 정확하게 적어주셔야 합합니다.

 

결론적으로, showAlertForJailbreakTestIsJailbroken: 함수를 후킹하는 코드입니다.

 

다만, 후킹할때 args[2]를 변조했는데 IDA에서 확인한 함수 인자는 한개밖에 없었습니다.

이유는

Frida공홈에서 확인이 가능한데, args[2]부터가 실제 파라미터이고 0,1은 self,selector로 정의되어 있다고 합니다.

 

자세한 내용은 다음 블로그에서 확인이 가능합니다.

https://www.letmecompile.com/objective-c-런타임runtime-내부-동작-분석/

DVIA라는 iOS 점검 실습용이 있는데, 실습용으로도 좋고 평소 안드로이드만 하다보니 iOS이 너무 약해서 공부할겸 풀어보고 있는데 괜찮은 앱인 것 같아 포스팅하려 합니다.

 

http://damnvulnerableiosapp.com/

 

DVIA (Damn Vulnerable iOS App) - A vulnerable iOS app for pentesting

A vulnerable iOS app for pentesting

damnvulnerableiosapp.com

앱 다운로드 주소는 다음과 같고, 현재 v2까지 나와있는데 v1부터 풀어보도록 하겠습니다.

 

앱 설치 후에 왼쪽 상단 [Menu] - [Jailbreak Detection]으로 들어갑니다.

 

그럼 다음과 같은 화면을 볼 수 있는데, Jailbreak Test 1,2를 각각 클릭하면 탈옥여부를 탐지하여 Alert창을 띄워줍니다.

 

그럼 실행파일을 IDA를 통해 분석해보겠습니다.

함수명 중 "jail"이란 문자가 들어간 함수명을 검색했을 때 왼쪽상단과 같이 출력됩니다. Test1,2가 있는것으로 보아 각각 Test1,2를 클릭했을 때 실행되는 함수로 추측이 가능합니다.

 

소스코드 중 빨간 네모박스 위의 $OBJC_CLASS_$_DamnVulnerableAppUtilities의 isJailbroken함수로 넘어가네요.

 

즉, jailbreakTest1Tapped: 함수에서 isJailbroken함수를 호출하는 것을 알 수 있습니다.

 

isJailbroken함수를 살펴보면 bool return형을 가진 함수고 내부 탈옥탐지 로직을 확인할 수 있습니다.

위 사진에서는 Cydia.app만 보이지만 소스코드를 더 살펴보면 /bin/bash, apt, 등등이 있는지 확인하는 것을 알 수 있습니다.

 

그 후에 해당 파일이 존재하면 true(탈옥), 존재하지 않다면 false(미탈옥)을 리턴해서 탈옥여부를 확인합합니다.

 

Frida를 통해 리턴함수를 조작하여 탈옥탐지를 우회하도록 하겠습니다.

 

if (ObjC.available) {

try {
var className = "JailbreakDetectionVC";    # 후킹할 클래스 명
var funcName = "- isJailbroken";   # 후킹할 클래스 내 함수명(앞의 -도 적어주셔야 합니다.) 
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');

 

Interceptor.attach(hook.implementation, {
onLeave
: function(retval) { console.log("[*] Class Name: " + className);  #onLeave함수를 통해 함수호출후 리턴값 조작 
console
.log("[*] Method Name: " + funcName);
console
.log("\t[-] Type of return value: " + typeof retval);
console
.log("\t[-] Original Return Value: " + retval);
newretval
= ptr("0x0")  
retval
.replace(newretval)   # true를 false로 변조하여 탈옥탐지 우회 시 
console
.log("\t[-] New Return Value: " + newretval) } });

}

catch(err) { console.log("[!] Exception2: " + err.message); } }

else { console.log("Objective-C Runtime is not available!"); }

위 소스파일을 js파일로 저장한 후, 파일을 저장한 경로에서 frida -U -l [js파일].js DVIA를 통해 실행하면

 

다음과 같이 탈옥탐지 우회가 가능합니다.

 

iOS는 Android와 다른 부분이 꽤 존재하는데 이부분때문에 상당히 시간이 많이 걸렸네요... 차후에 Try&Err과 주의점(?)도 포스팅 하겠습니다.

 

Frida가 Android는 자료가 많아지는데 iOS는 아직 많이 없는 것 같아 차근차근 올려보겠습니다.

 

 

출처 : https://blog.attify.com/bypass-jailbreak-detection-frida-ios-applications/

+ Recent posts