首页
社区
课程
招聘
[求助]!
2022-2-13 10:07 16174

[求助]!

2022-2-13 10:07
16174
收藏
点赞0
打赏
分享
最新回复 (19)
雪    币: 8050
活跃值: (5245)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mudebug 2022-2-13 14:49
2
0
调用雷电导出的接口,注入的so要arm的,他自动给你编译了。
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-13 14:59
3
0
mudebug 调用雷电导出的接口,注入的so要arm的,他自动给你编译了。
大佬 具体如何调用接口呢,能不能进一步说一下
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-2-13 15:43
4
0

正常注入,arm是走的houdini模拟执行的,注入后从libnativebridge里拿到houdini的接口调用你的函数也走模拟执行即可侵入arm层

最后于 2022-2-13 15:45 被不吃早饭编辑 ,原因:
雪    币: 2
活跃值: (1418)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
azd放 2022-2-13 22:50
5
0
不吃早饭 正常注入,arm是走的houdini模拟执行的,注入后从libnativebridge里拿到houdini的接口调用你的函数也走模拟执行即可侵入arm层
大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-2-13 22:54
6
0
azd放 大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
就像java层要用java代码处理,native层要用native代码处理,lua层要用lua代码处理,houdini模拟出来的arm层也要调用houdini的接口来让你的hack逻辑走模拟执行
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-2-13 22:56
7
0
azd放 大佬你的意思是我写一个x86的so注入目标进程,然后hook目标进程的libnativebridge?有没有相关代码贴出来看看,网上这方面没有任何资料,感谢!
这个觉得太麻烦的话,一个简单地做法是,注入后x86的so后,通过反射注入一个dex,然后在java层通过System.load等方法加载你的arm架构的so文件,jvm会帮你调用houdini的接口执行Jni_Onload以及jave层注册好的native方法
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-14 09:20
8
0
不吃早饭 这个觉得太麻烦的话,一个简单地做法是,注入后x86的so后,通过反射注入一个dex,然后在java层通过System.load等方法加载你的arm架构的so文件,jvm会帮你调用houdini的接口执 ...
大佬 能力有限能不能提供相关代码看看
雪    币: 1
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SunnySmart 2022-2-15 14:02
9
1
@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反而不行

还算比较稳定的这样做,希望可以帮到你

雪    币: 1
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SunnySmart 2022-2-15 14:07
10
0
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方法 每个模拟器符号不一样结构不一样 兼容性是个问题 此方法已经废弃

雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-2-15 15:41
11
0
SunnySmart void&nbsp;load_real_lib_5_5_1() { &nbsp;&nbsp;&nbsp;&nbsp;void*&nbsp;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);
}
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-15 15:51
12
0
SunnySmart @echo&nbsp;off set&nbsp;cwd=%~dp0 REM&nbsp;start&nbsp;%NDK_ROOT%/ndk-build ...

非常感谢你详细的解答 ,你的意思是在x86的so里面直接用by_open打开arm的so就可以是吧,但我现在的问题是 就连x86的so就注入不进去,后面的步骤无从实现

最后于 2022-2-15 15:53 被onlythis编辑 ,原因:
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-15 16:00
13
0
有一个大前提是 x86的so注入目标进程会失败,你这种做法只有x86的so注入成功了才能继续展开后续的步骤
最后于 2022-2-15 16:01 被onlythis编辑 ,原因:
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-15 16:04
14
0
SunnySmart @echo&nbsp;off set&nbsp;cwd=%~dp0 REM&nbsp;start&nbsp;%NDK_ROOT%/ndk-build ...
能否留一个联系方式?因为我这边是x86的注入器去注入x86的so都成功不了
雪    币: 618
活跃值: (1315)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Ssage泓清 2022-2-15 16:12
15
0
SunnySmart @echo&nbsp;off set&nbsp;cwd=%~dp0 REM&nbsp;start&nbsp;%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泓清编辑 ,原因:
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-2-15 17:33
16
0
限制?你们想绕过什么限制?SELinux限制修改so文件的SELinux标签即可,namespace限制的话,linker是根据dlopen调用时的返回地址来判断namespace的,只需要把远程调用dlopen时的返回地址改成系统库所在的任意地址即可
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-16 10:52
17
0
SunnySmart @echo&nbsp;off set&nbsp;cwd=%~dp0 REM&nbsp;start&nbsp;%NDK_ROOT%/ndk-build ...
大佬 能否给我你的注入器用用? 我这边按照你说的 注入x86的so都会失败 注入不进去
雪    币: 1
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SunnySmart 2022-2-16 11:19
18
0
onlythis 大佬 能否给我你的注入器用用? 我这边按照你说的 注入x86的so都会失败 注入不进去
99939534 来拿注入器
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
onlythis 2022-2-16 13:01
19
0
SunnySmart 99939534 来拿注入器
感谢大佬 用你的方案已经解决了
雪    币: 61
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
anuora 2022-7-13 22:55
20
0
大佬们,安卓9注入有什么方案吗
游客
登录 | 注册 方可回帖
返回