使用libinject在模拟器上执行时出现EPERM
whnet 当前离线

使用的inject库为:http://bbs.pediy.com/showthread.php?t=141355
源码打包如附件。
编译hello-jni.so makefile如下
代码:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.c \ shellcode.sLOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRARY)
使用的libhello.so 代码及makefile如下
代码:
//#include 
#include 
#include 
#include 
#define LOG_TAG "debug"#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)  int hook_entry(char * a){  LOGD("Hello ARM! %s pid:%d\n",a,getpid());while(1){usleep(100);}  return 0;}
代码:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llogLOCAL_ARM_MODE := armLOCAL_MODULE    := helloLOCAL_SRC_FILES := hello.cinclude $(BUILD_SHARED_LIBRARY)
代码都放到一个目录是因为ndk-build 时,需在工程目录下。
最终生成libhello-jni.so 由apk打包。
另外  adb push  /home/libhello.so  /dev/  将inject 使用的库传上去。
jni中使用如下
代码:
target_pid = find_pid_of("/system/bin/servicemanager");int success = inject_remote_process( target_pid, "/dev/libhello.so", "hook_entry", "I'm parameter!", strlen("I'm parameter!") );
按说效果应当是servicemanager 进程将被注入我提供的libhello.so 库,并执行hook_entry函数, 但在下面的代码中出错
代码:
int ptrace_attach( pid_t pid ){    DEBUG_PRINT( "ptrace_attach1111111" );  if ( ptrace( PTRACE_ATTACH, pid, NULL, 0  ) < 0 )  {      DEBUG_PRINT( "ptrace_attach  errno:%d",errno );    if(errno == EPERM)    {        DEBUG_PRINT( "ptrace_attach EPERM errno:%d",errno );    }        DEBUG_PRINT( "ptrace_attach  errno:%d",errno );    return -1;  }  waitpid( pid, NULL, WUNTRACED );  //DEBUG_PRINT("attached\n");  if ( ptrace( PTRACE_SYSCALL, pid, NULL, 0  ) < 0 )  {    DEBUG_PRINT( "ptrace_syscall" );    return -1;  }  waitpid( pid, NULL, WUNTRACED );    DEBUG_PRINT( "ptrace_attach22222222222" );  return 0;}
输出如下。
D/debug   (  760): [+] Injecting process: 27
D/debug   (  760): ptrace_attach1111111
D/debug   (  760): ptrace_attach  errno:1
D/debug   (  760): ptrace_attach EPERM errno:1
D/debug   (  760): ptrace_attach  errno:1
D/debug   (  760): pid:760 error1
也就是在执行ptrace 时。 提示权限不正确。
在java代码中同时也考虑到了提权的问题
代码:
     try {      Process process = Runtime.getRuntime().exec("su");      TextView  tv = new TextView(this);      tv.setText( stringFromJNI() );      process.waitFor();                        setContentView(tv);    } catch (Exception e) {      // TODO: handle exception      e.printStackTrace();    }
请问这种ptrace失败应当如何处理??是由于何种原因导致的。多谢~~~
 
上传的附件
文件类型: rar (380.2 KB, 56 次下载)
 
 
 

最佳答案 - 作者:
如图:
whnet
级别:24 | 在线时长:674小时 | 升级还需:51小时
级别:24 | 在线时长:674小时 | 升级还需:51小时
级别:24 | 在线时长:674小时 | 升级还需:51小时
普通会员
普通会员
资 料:
注册日期: Nov 2009
帖子:
pc小波 品行端正
精华:
现金: 293 Kx
致谢数: 5
获感谢文章数:3
获会员感谢数:3
未读 2013-03-26, 19:24:43
默认
pc小波 当前离线

如图:
 
上传的图像
 
 
 
 
pc小波
级别:4 | 在线时长:39小时 | 升级还需:6小时
初级会员
初级会员
资 料:
注册日期: Dec 2012
帖子:
whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
未读 2013-03-26, 19:39:57
默认
whnet 当前离线

嗯。 吹了会风,想明白了。是因为应用本身依然没有root的权限。仅仅是新开的shell有而已。
 
 
 
 
whnet
级别:4 | 在线时长:39小时 | 升级还需:6小时
初级会员
初级会员
资 料:
注册日期: Dec 2012
帖子:
whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
未读 2013-03-27, 09:03:42
默认
whnet 当前离线

额。早上来试了一下。我在adb shell 下su .然后执行pm install -r Hellojni.apk 并不能让应用获取特权,应用仍然是普通权限。
 
 
 
 
whnet
级别:4 | 在线时长:43小时 | 升级还需:2小时
初级会员
初级会员
资 料:
注册日期: Nov 2007
帖子:
booz 品行端正
精华: 0
现金: 104 Kx
致谢数: 1
获感谢文章数:0
获会员感谢数:0
未读 2013-03-27, 09:25:30
默认
booz 当前离线

pm install 只是安装而以, 权限是由APK的描述决定的.
总不能说以ROOT权限安装的程序都有了ROOT权限吧?!
 
 
 
 
booz
级别:4 | 在线时长:39小时 | 升级还需:6小时
初级会员
初级会员
资 料:
注册日期: Dec 2012
帖子:
whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
未读 2013-03-27, 10:40:41
默认
whnet 当前离线

引用:
最初由 booz发布
pm install 只是安装而以, 权限是由APK的描述决定的.
总不能说以ROOT权限安装的程序都有了ROOT权限吧?!
嗯。这个是有问题。 不过好像得版主才能来修改~~~ 现在可以在shell 下执行了。在java中还是有点问题。
 
 
 
 
whnet
级别:1 | 在线时长:6小时 | 升级还需:6小时
初级会员
初级会员
资 料:
注册日期: Mar 2013
帖子:
ysguet 品行端正
精华: 0
现金: 39 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
未读 2013-04-08, 10:24:38
默认
ysguet 当前在线

楼主解决了吗?怎么回事来自呀?
 
 
 
 
ysguet
级别:4 | 在线时长:39小时 | 升级还需:6小时
初级会员
初级会员
资 料:
注册日期: Dec 2012
帖子:
whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
未读 2013-04-08, 15:57:26
默认
whnet 当前离线

引用:
最初由 ysguet发布
楼主解决了吗?怎么回事来自呀?
两个问题。
一:java代码中的提权不正确。不过这个不重要,因为在模拟器上本身可以不用提权
二:经调试,发现模拟器不能正常运行代码,但在实际的设备上可以。提权命令使用的是 "su -c /dev/inject /dev/libhello.so "