使用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-jni
LOCAL_SRC_FILES := hello-jni.c \ shellcode.s
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)
使用的libhello.so 代码及makefile如下

代码:
//#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <android/log.h>
#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 -llog
LOCAL_ARM_MODE := arm
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c
include $(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失败应当如何处理??是由于何种原因导致的。多谢~~~
 
上传的附件
文件类型: rarhello-jni.rar (380.2 KB, 56 次下载)
 
 
回复时引用此帖 返回顶端
 

最佳答案 - 作者: pc小波
如图:

pc小波 的头像

普通会员
普通会员

资 料:
注册日期: Nov 2009
帖子: 436 pc小波 品行端正
精华: 1
现金: 293 Kx
致谢数: 5
获感谢文章数:3
获会员感谢数:3
2 未读 2013-03-26, 19:24:43 默认
pc小波 当前离线

如图:
 
上传的图像
未命名.jpg  
 
 
回复时引用此帖 返回顶端
 

初级会员
初级会员

资 料:
注册日期: Dec 2012
帖子: 53 whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
3 未读 2013-03-26, 19:39:57 默认
whnet 当前离线

嗯。 吹了会风,想明白了。是因为应用本身依然没有root的权限。仅仅是新开的shell有而已。
 
 
 
回复时引用此帖 返回顶端
 

初级会员
初级会员

资 料:
注册日期: Dec 2012
帖子: 53 whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
4 未读 2013-03-27, 09:03:42 默认
whnet 当前离线

额。早上来试了一下。我在adb shell 下su .然后执行pm install -r Hellojni.apk 并不能让应用获取特权,应用仍然是普通权限。
 
 
 
回复时引用此帖 返回顶端
 

初级会员
初级会员

资 料:
注册日期: Nov 2007
帖子: 28 booz 品行端正
精华: 0
现金: 104 Kx
致谢数: 1
获感谢文章数:0
获会员感谢数:0
5 未读 2013-03-27, 09:25:30 默认
booz 当前离线

pm install 只是安装而以, 权限是由APK的描述决定的.
总不能说以ROOT权限安装的程序都有了ROOT权限吧?!
 
 
 
回复时引用此帖 返回顶端
 

初级会员
初级会员

资 料:
注册日期: Dec 2012
帖子: 53 whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
6 未读 2013-03-27, 10:40:41 默认
whnet 当前离线

引用:
最初由 booz发布 查看帖子
pm install 只是安装而以, 权限是由APK的描述决定的.
总不能说以ROOT权限安装的程序都有了ROOT权限吧?!
嗯。这个是有问题。 不过好像得版主才能来修改~~~ 现在可以在shell 下执行了。在java中还是有点问题。
 
 
 
回复时引用此帖 返回顶端
 

ysguet 的头像

初级会员
初级会员

资 料:
注册日期: Mar 2013
帖子: 5 ysguet 品行端正
精华: 0
现金: 39 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
7 未读 2013-04-08, 10:24:38 默认
ysguet 当前在线

楼主解决了吗?怎么回事来自呀?
 
 
 
回复时引用此帖 返回顶端
 

初级会员
初级会员

资 料:
注册日期: Dec 2012
帖子: 53 whnet 品行端正
精华: 0
现金: 49 Kx
致谢数: 3
获感谢文章数:0
获会员感谢数:0
8 未读 2013-04-08, 15:57:26 默认
whnet 当前离线

引用:
最初由 ysguet发布 查看帖子
楼主解决了吗?怎么回事来自呀?
两个问题。

一:java代码中的提权不正确。不过这个不重要,因为在模拟器上本身可以不用提权


二:经调试,发现模拟器不能正常运行代码,但在实际的设备上可以。提权命令使用的是 "su -c /dev/inject /dev/libhello.so "