Why should I know this?

Android에서 so파일 injection 하는 쉬운 방법 본문

Knowledge/Android

Android에서 so파일 injection 하는 쉬운 방법

die4taoam 2019. 2. 18. 23:09


Android에서 특별한 목적으로 shared object를 injection하고자 할 때, 사용할 수 있는 가장 쉬운 방법이다. 아래처럼 app_main.cpp 소스를 수정하여 zygote가 app_process를 실행하기 전에 LD_PRELOAD 환경을 지정하여 shared object를 우선적으로 로드하도록 만들 수 있고 여러 재밌는 행위를 할 수 있다.



frameworks/base/cmds/app_process/app_main.cpp:166


      char value[PROPERTY_VALUE_MAX];
      property_get("ro.kernel.qemu", value, "");
      bool is_qemu = (strcmp(value, "1") == 0);
      if ((getenv("NO_ADDR_COMPAT_LAYOUT_FIXUP") == NULL) && !is_qemu) {
          int current = personality(0xFFFFFFFF);
          if ((current & ADDR_COMPAT_LAYOUT) == 0) {
              personality(current | ADDR_COMPAT_LAYOUT);
              setenv("NO_ADDR_COMPAT_LAYOUT_FIXUP", "1", 1);
~             ALOGE("[%s : %d]", __FILE__, __LINE__);
~             for (int index=0;index<sizeof(argv);index++) {
+                 ALOGE("%s", argv[index]);
+             }
+
+             const char* hooker = "/data/local/tmp/lib___.so";
+             if (access(hooker, F_OK) == 0) {
+                 ALOGE("[%s : %d]", __FILE__, __LINE__);
+                 char buf[128] = {0,};
+                 sprintf(buf, "LD_PRELOAD=%s", hooker);
+                 char* envp[] = {buf, NULL};
+                 setenv("LD_PRELOAD", hooker, 1);
+                 execv("/system/bin/app_process", argv);
+                 return -1;
+             } else {
+                 execv("/system/bin/app_process", argv);
+                 return -1;
+             }
+
          }
      }


zygote keep old shared object information and copy that when forked. for that reason, if you change shared object that to be injected, must restart the zygote.

Comments