рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐, рдПрдВрдбрд╣реБрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХреЙрд▓ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рдирд┐рд░реНрдпрд╛рдд рдХрд╛рд░реНрдпреЛрдВ) рдФрд░ рдЧреИрд░-рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ, рджреЛрдиреЛрдВ рдХреЛ рд╕реАрдзреЗ рдЙрдирдХреЗ рдкрддреЗ рдкрд░ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛ рдкреГрд╖реНрда рдкрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдврд╛рдВрдЪрд╛ рдЖрдкрдХреЛ xposed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд┐рдирд╛ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, рдореИрдВ Windows рдХреЗ рд▓рд┐рдП Visual Studio рдФрд░ BatchApkTool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдЬреАрд╕реАрд╕реА рдпрд╛ рдХреНрд▓реИрдВрдЧ (рдЙрдиреНрдирдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред BatchApkTool рдХреЗ рдмрдЬрд╛рдп, рдЖрдк apktool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ BatchApkTool рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ BatchApkTool рдпрд╛ apktool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдХреЗ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рд▓рд┐рдВрдХ рдФрд░ рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреА рд╣реЛрдЧреА ред (рдореБрдЭреЗ рдХрдореНрдкреЗрдЯрд┐рдЬрд╝рди рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд╢рд╛рдпрдж рд╡реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗ)
NDK рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Visual Studio рдХреА рд╕реНрдерд╛рдкрдирд╛рдирд┐рдореНрди рдШрдЯрдХ Visual Studio рдЗрдВрд╕реНрдЯрд╛рд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

.
рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛, , , .
" (Android)", .
:

. : , : < >, API 14 ARM X86, ARM64 X64 21 .
.
-> , :
, , , , .
. .
. .
, .cpp
#include "AndHook.h"
рдЖрдЗрдП JNI_OnLoad рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд╣реБрдХ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗредJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
LOGD("JNI_OnLoad start!");
if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("JNI_OnLoad! GetEnv failed");
return -1;
}
RegisterHooks();
result = JNI_VERSION_1_4;
LOGD("JNI_OnLoad! finished!");
return result;
}
RegisterHooks рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ:
#ifdef __arm__
#define Test_Offset 0x1234
#elif __aarch64__
#define Test_Offset 0x1235
#elif __i386__
#define Test_Offset 0x1236
#elif __x86_64__
#define Test_Offset 0x1237
#endif
void (*Old_Test)();
void Test()
{
LOGD("Test!");
Old_Test();
}
void (*Old_Test2)();
void Test2()
{
LOGD("Test2!");
Old_Test2();
}
void RegisterHooks() {
const void* libil2cpp = AKGetImageByName("libil2cpp.so");
if (libil2cpp == NULL) {
LOGW("AKGetImageByName return null!");
return;
}
AKHookFunction(AKFindAnonymity(libil2cpp, Test_Offset), reinterpret_cast<void*>(&Test), reinterpret_cast<void**>(&Old_Test));
AKHookFunction(AKFindSymbol(libil2cpp, "Test2"), reinterpret_cast<void*>(&Test2), reinterpret_cast<void**>(&Old_Test2));
void (*Test3)();
Test3 = reinterpret_cast<void (*)()>(AKFindAnonymity(libil2cpp, 0x12345));
Test3();
const uint8_t data[] = { 0x00, 0xF0, 0x20, 0xE3 };
AKPatchMemory(reinterpret_cast<const void*>(AKFindAnonymity(libil2cpp, 0x123456)), reinterpret_cast<const void*>(&data), 4);
AKCloseImage(libil2cpp);
}
рдХрдИ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рддрд╣рдд рдкреИрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА #define рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ
рдЙрджрд╛рд╣рд░рдг#ifdef __arm__
#define Patch_Offset 0x1234
#define Patch_Data { 0x00, 0xF0, 0x20, 0xE3 }
#elif __aarch64__
#define Patch_Offset 0x1234
#define Patch_Data { 0x1F, 0x20, 0x03, 0xD5 }
#endif
const uint8_t data[] = Patch_Data;
const size_t len = sizeof(data) / sizeof(uint8_t);
AKPatchMemory(reinterpret_cast<const void*>(AKFindAnonymity(libil2cpp, Patch_Offset)), reinterpret_cast<const void*>(&data), len);
рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдордиреЗ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
рд▓рдХреНрд╖реНрдп рдордВрдЪ рдЪреБрдиреЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЛ рдпрджрд┐ рдХрдИ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо 1-2 рдЪрд░рдг рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред
AndHook lib . ( ).
. MainActivity . onCreate MainActivity :
const-string v0, "SharedObject1"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
SharedObject1 lib .so
il2cpp- MainActivity onCreate smali/com/unity3d/player/UnityPlayerActivity.smali.
.
:
https://github.com/asLody/AndHook/
http://armconverter.com/
http://armconverter.com/hextoarm/