能力值:
( LV3,RANK:20 )
|
-
-
2 楼
调用雷电导出的接口,注入的so要arm的,他自动给你编译了。
|
能力值:
( LV1,RANK:0 )
|
-
-
3 楼
mudebug
调用雷电导出的接口,注入的so要arm的,他自动给你编译了。
大佬 具体如何调用接口呢,能不能进一步说一下
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
正常注入,arm是走的houdini模拟执行的,注入后从libnativebridge里拿到houdini的接口调用你的函数也走模拟执行即可侵入arm层
最后于 2022-2-13 15:45
被不吃早饭编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不吃早饭
正常注入,arm是走的houdini模拟执行的,注入后从libnativebridge里拿到houdini的接口调用你的函数也走模拟执行即可侵入arm层
大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
azd放
大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
就像java层要用java代码处理,native层要用native代码处理,lua层要用lua代码处理,houdini模拟出来的arm层也要调用houdini的接口来让你的hack逻辑走模拟执行
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
azd放
大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
这个觉得太麻烦的话,一个简单地做法是,注入后x86的so后,通过反射注入一个dex,然后在java层通过System.load等方法加载你的arm架构的so文件,jvm会帮你调用houdini的接口执行Jni_Onload以及jave层注册好的native方法
|
能力值:
( LV1,RANK:0 )
|
-
-
8 楼
不吃早饭
这个觉得太麻烦的话,一个简单地做法是,注入后x86的so后,通过反射注入一个dex,然后在java层通过System.load等方法加载你的arm架构的so文件,jvm会帮你调用houdini的接口执 ...
大佬 能力有限能不能提供相关代码看看
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
@echo off
set cwd=%~dp0
REM start %NDK_ROOT%/ndk-build
REM cp
adb shell rm -r /data/local/tmp/libparse.so
adb shell rm -r /data/local/tmp/inject
adb shell rm -r /data/local/tmp/libinject2.so
adb push %cwd%/libs/armeabi-v7a/libparse.so /data/local/tmp
adb push %cwd%/libs/x86/inject /data/local/tmp
adb push %cwd%/libs/x86/libinject2.so /data/local/tmp
adb shell < %cwd%/exec.sh
exit
REM pause
我也是用的雷电x86 7.12系统 & 注入方式也是ptrace 脚本可以看出 注入程序是x86架构 hook程序是armeabi-v7架构 void load_real_lib_7_1_2()
{
void* handle = 0;
const char *libpath = "/data/local/tmp/libparse.so";
handle = by_dlopen(libpath, RTLD_NOW);
if (handle == 0)
{
LOGD("----------------------------------");
LOGD("[-] [%s] libparse.so handler addr is %p <<<", __FUNCTION__, handle);
LOGD("----------------------------------");
return;
}
LOGD("[+] [%s] libparse.so handler addr is %p\n", __FUNCTION__, handle);
} 然后打开的时候采用 by_open绕过限制 直接加载armeabi-v7架构 好像x86反而不行 还算比较稳定的这样做,希望可以帮到你
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
void load_real_lib_5_5_1()
{
void* libnativebridge = 0, *NativeBridgeLoadLibrary = 0,
*librealinject = 0;
libnativebridge = dlopen("/system/lib/libnativebridge.so", RTLD_NOW);
LOGD("[+] [%s] libnativebridge.so handler addr is %p\n", __FUNCTION__, libnativebridge);
//_ZN7android23NativeBridgeLoadLibraryEPKci
NativeBridgeLoadLibrary = dlsym(libnativebridge, "_ZN7android23NativeBridgeLoadLibraryEPKci");
LOGD("[+] [%s] NativeBridgeLoadLibrary addr is %p\n", __FUNCTION__, NativeBridgeLoadLibrary);
if (!NativeBridgeLoadLibrary)
{
LOGD("----------------------------------");
LOGD("[-] [%s] NativeBridgeLoadLibrary 0x[%p] <<<", __FUNCTION__, NativeBridgeLoadLibrary);
LOGD("----------------------------------");
return;
}
librealinject = ((native_load_library*)NativeBridgeLoadLibrary)("/data/local/tmp/libparse.so", RTLD_NOW);
if (librealinject == 0)
{
LOGD("----------------------------------");
LOGD("[-] [%s] libparse.so handler addr is %p <<<", __FUNCTION__, librealinject);
LOGD("----------------------------------");
return;
}
LOGD("[+] [%s] libparse.so handler addr is %p\n", __FUNCTION__, librealinject);
#if 0
void *NativeBridgeGetTrampoline = 0, *RealInitFunc = 0;
NativeBridgeGetTrampoline = dlsym(libnativebridge, "_ZN7android25NativeBridgeGetTrampolineEPvPKcS2_j");
LOGD("NativeBridgeGetTrampoline addr is %p\n", NativeBridgeGetTrampoline);
RealInitFunc = ((native_bridge_get_trampoline*)NativeBridgeGetTrampoline)(librealinject, "real_init_func", 0, 0);
LOGD("RealInitFunc addr is %p\n", RealInitFunc);
((real_init_func*)RealInitFunc)("HelloWorld");
#endif
} 至于楼上说的libnativebridge方法 每个模拟器符号不一样结构不一样 兼容性是个问题 此方法已经废弃
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
SunnySmart
void load_real_lib_5_5_1()
{
void* libna ...
handle = dlopen(NK_OBFS("libhoudini.so"), RTLD_NOW);
if (handle) {
static NativeBridgeCallbacks *nativeBridgeCallbacks;
FIND_PTR(handle, NK_OBFS("NativeBridgeItf"), nativeBridgeCallbacks);
if (nativeBridgeCallbacks && nativeBridgeCallbacks->loadLibrary) {
hook_by_address((void *) nativeBridgeCallbacks->loadLibrary, (void *) new_dlopen_houdini,
(void **) &orig_dlopen_houdini, NK_OBFS("dlopen_houdini"));
}
dlclose(handle);
}
|
能力值:
( LV1,RANK:0 )
|
-
-
12 楼
SunnySmart
@echo off
set cwd=%~dp0
REM start %NDK_ROOT%/ndk-build
... 非常感谢你详细的解答 ,你的意思是在x86的so里面直接用by_open打开arm的so就可以是吧,但我现在的问题是 就连x86的so就注入不进去,后面的步骤无从实现
最后于 2022-2-15 15:53
被onlythis编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
13 楼
有一个大前提是 x86的so注入目标进程会失败,你这种做法只有x86的so注入成功了才能继续展开后续的步骤
最后于 2022-2-15 16:01
被onlythis编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
14 楼
SunnySmart
@echo off
set cwd=%~dp0
REM start %NDK_ROOT%/ndk-build
...
能否留一个联系方式?因为我这边是x86的注入器去注入x86的so都成功不了
|
能力值:
( LV3,RANK:20 )
|
-
-
15 楼
SunnySmart
@echo off
set cwd=%~dp0
REM start %NDK_ROOT%/ndk-build
... 关于ptrace注入so方面 我有一些小问题想要请教 比如ptrace让远程进程载入私人so的时候 我们call的是远程进程的dlopen函数 虽然我们自己的进程是可以通过by_open绕过限制的 但是远程进程的dlopen按理说依然受到限制才对吧? 大佬是如何解决这个问题的呢? 我先来说一下我这里自用的讨巧方法 将私人so改名为系统so的名字 比如libc.so 然后 ./Inject -so /data/local/tmp/libc.so 即可绕过限制 让远程进程的dlopen载入私人so 希望大佬指点一二 不甚感激 另外 希望大佬注意一下私信 非常希望能和大佬交流 谢谢~
最后于 2022-2-15 16:12
被Ssage泓清编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
限制?你们想绕过什么限制?SELinux限制修改so文件的SELinux标签即可,namespace限制的话,linker是根据dlopen调用时的返回地址来判断namespace的,只需要把远程调用dlopen时的返回地址改成系统库所在的任意地址即可
|
能力值:
( LV1,RANK:0 )
|
-
-
17 楼
SunnySmart
@echo off
set cwd=%~dp0
REM start %NDK_ROOT%/ndk-build
...
大佬 能否给我你的注入器用用? 我这边按照你说的 注入x86的so都会失败 注入不进去
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
onlythis
大佬 能否给我你的注入器用用? 我这边按照你说的 注入x86的so都会失败 注入不进去
99939534 来拿注入器
|
能力值:
( LV1,RANK:0 )
|
-
-
19 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
大佬们,安卓9注入有什么方案吗
|
|
|