Загрузка...

The simplest injector for Android

Thread in Cheats for Android games created by Limon4ik3491 Aug 19, 2025. 836 views

  1. Limon4ik3491
    Limon4ik3491 Topic starter Aug 19, 2025 1 Mar 4, 2023
    Всех приветствую!
    В этой статье речь пойдёт о AndroidSilentInject. Сразу скажу, что полный исходный код уже залит на GitHub. Найти скомпилированную версию можно там же.
    • Попробовать применить свои знания.
    • Залить что-то на гит.
    • Показать, что подобные проекты не сложны с технической части.
    • Стабильность.
    • Простота и поддержка.
    • Как ни странно, но новизна.
    Пожалуй самый главный вопрос. В Android для открытия библиотек внутри процесса используется dlopen, которому на вход нужны два аргумента: указатель на константный массив символов, содержащий путь до нашей библиотеки и флаг. Если с флагом всё легко и понятно (RTLD_NOW), то с указателем на строку всё не так просто.

    Тут возникает первый нюанс: как создать указатель на строку в целевом процесса? Благо в KittyMemoryEx можно вызывать функции в целевом процессе, используя ptrace. Дальше все очень просто: находим в целевом процессе символ mmap и с помощью ptrace вызываем найденную функцию, передав в качестве size длину строки + 1, чтобы не забыть завершающий символ. После успешного выделения виртуальной памяти необходимо сунуть туда саму строку, с этим нам поможет функция writeMemStr из KittyMemoryEx. Таким образом мы создали указатель на строку, который доступен из целевого процесса. В коде это выглядит так:
    C

    uint64_t mmap_addr = memory.findRemoteOfSymbol(KT_LOCAL_SYMBOL(mmap));
    if (!mmap_addr) {
    return InjectCode_NullMmap;
    }

    uint64_t remote_lib_path_addr = trace.callFunction(mmap_addr, 6, nullptr,
    lib_path.size() + 1, PROT_READ | PROT_WRITE,
    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (!remote_lib_path_addr) {
    return InjectCode_NullRemoteString;
    }

    if (!memory.writeMemStr(remote_lib_path_addr, target_path)) {
    return InjectCode_WriteMemStrFailed;
    }
    После успешного "внедрения" строки в целевую память процесса нужно вызвать dlopen. Делается это аналогично: находим dlopen в целевом процессе и стучимся в него с просьбой открыть нашу библиотеку.
    C

    uint64_t dlopen_addr = memory.findRemoteOfSymbol(KT_LOCAL_SYMBOL(dlopen));
    if (!dlopen_addr) {
    return InjectCode_NullDlopen;
    }

    uint64_t handle = trace.callFunction(dlopen_addr, 2, remote_lib_path_addr,
    RTLD_NOW);
    if (!handle) {
    return InjectCode_DlopenFailed;
    }
    Из известных проблем и недочётов:
    • Чтобы сделать библиотеку доступной для процесса, её приходиться переносить в /data/data/<package name>.
    Спасибо за внимание!
    Если Вам понравился мой проект, то закиньте звёздочку на GitHub.
     
Loading...