如何挂接我的Android应用程序的系统调用

杰·潘迪特

我想拦截connect()系统调用并使用自己的自定义实现。自定义实现将执行某些操作,例如为简单起见打印日志,然后进一步调用系统实现。

我看了Audrey的博客,其中介绍了修补PLT的方法。但是不幸的是,当尝试更改重定位表中的地址时,此代码崩溃。

闲逛了一会儿后,我遇到了这个已经回答的问题但是这里描述的方法给了我以下错误。

*****跳转到案例标签[-fpermissive] jni / test.cpp:107:20:错误:交叉初始化'uint32_t entry_page_start'jni / test.cpp:106:15:错误:交叉初始化'uint32_t page_size '*****

建议的更改之后Andrey博客中的hook调用方法Here,看起来像这样。

int hook_call(char *soname, char *symbol, unsigned newval) {  
soinfo *si = NULL;  
Elf32_Rel *rel = NULL;  
Elf32_Sym *s = NULL;   
unsigned int sym_offset = 0;  
if (!soname || !symbol || !newval)  
 return 0;  
si = (soinfo*) dlopen(soname, 0);  
if (!si)  
 return 0;  
s = soinfo_elf_lookup(si, elfhash(symbol), symbol);  
if (!s)  
 return 0;  
sym_offset = s - si->symtab;  
rel = si->plt_rel;  
/* walk through reloc table, find symbol index matching one we've got */  
for (int i = 0; i < si->plt_rel_count; i++, rel++) {  
  unsigned type = ELF32_R_TYPE(rel->r_info);  
  unsigned sym = ELF32_R_SYM(rel->r_info);  
  unsigned reloc = (unsigned)(rel->r_offset + si->base);  
  unsigned oldval = 0;  
  if (sym_offset == sym) {  
   switch(type) {  
     case R_ARM_JUMP_SLOT:
      // YOUR LINES
      uint32_t page_size = getpagesize();
      uint32_t entry_page_start = reloc& (~(page_size - 1));
      mprotect((uint32_t *)entry_page_start, page_size, PROT_READ | PROT_WRITE);

      /* we do not have to read original value, but it would be good   
       idea to make sure it contains what we are looking for */  
     oldval = *(unsigned*) reloc;  
     *((unsigned*)reloc) = newval;  
     return 1;  
   default:  
     return 0;  
}  

我在做什么错,我将mProtect()方法放在错误的位置吗?我们有没有人在Andrey的博客的帮助下做到了这一点?还有其他方法吗?我被封锁了。任何帮助,将不胜感激。

约翰·A

该错误与mProtect()没有任何关系。实际上,这也是我放置代码段的确切位置。这是我的代码,它可以正常工作:

void* hook_call(char *soname, char *symbol, void* newval) {
 soinfo *si = NULL;
   Elf32_Rel *rel = NULL;
   Elf32_Sym *s = NULL;
   unsigned int sym_offset = 0;
   if (!soname || !symbol || !newval)
      return 0;

   si = (soinfo*) dlopen(soname, RTLD_LAZY);
   if (!si)
    return 0;


   s = soinfo_elf_lookup(si, elfhash(symbol), symbol);
   if (!s)
     return 0;

   sym_offset = s - si->symtab;
   rel = si->plt_rel;


   const char *strtab = si->strtab;
   Elf32_Sym *symtab = si->symtab;

   /* walk through reloc table, find symbol index matching one we've got */
   int i;

   for (i = 0; i < si->plt_rel_count; i++, rel++) {
    unsigned type = ELF32_R_TYPE(rel->r_info);
    unsigned sym = ELF32_R_SYM(rel->r_info);
    unsigned reloc = (unsigned)(rel->r_offset + si->base);
    //unsigned oldval = 0;
    void* pOldFun;

    if (sym_offset == sym) {

     switch(type) {
       case R_ARM_JUMP_SLOT:
          //Set appropriate memory access rights
          uint32_t page_size = getpagesize();
          uint32_t entry_page_start = reloc& (~(page_size - 1));
          mprotect((uint32_t *)entry_page_start, page_size, PROT_READ | PROT_WRITE);

         pOldFun = (void *)*((unsigned *)reloc);

          *((unsigned int*)reloc)= (unsigned)newval;  

          return pOldFun;
       default:
          return 0;
     }
    }
   }
   return 0;

}

*跳转到案例标签...错误:使用开关案例时,变量未正确初始化(即在一种情况下初始化而在另一种情况下使用),通常会发生交叉初始化。看看这个问题发生了类似的错误,并已解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何挂接我的Android应用程序(非root用户的设备)的系统调用

来自分类Dev

如何挂接我的Android应用程序(非root用户设备)的系统调用

来自分类Dev

当android系统杀死应用程序时,如何保存我的应用程序状态?

来自分类Dev

播放应用程序关闭时未调用停止挂接

来自分类Dev

如何在我的android应用程序的用户界面中调用另一个android应用程序?

来自分类Dev

如何防止android操作系统缩放我的应用程序?

来自分类Dev

当我在Android应用程序中单击“笔记”按钮时,如何调用我的NoteMain类

来自分类Dev

如何布局我的Android应用程序?

来自分类Dev

如何翻译我的Android应用程序?

来自分类Dev

如何翻译我的Android应用程序?

来自分类Dev

如何布局我的android应用程序?

来自分类Dev

如何运行我的Android应用程序?

来自分类Dev

是否可以在Windows上阻止其他应用程序挂接到系统DLL中

来自分类Dev

将我的android应用程序签名为系统应用程序

来自分类Dev

将我的android应用程序签名为系统应用程序

来自分类Dev

Android:如何从我的应用程序获取应用程序列表或调用主应用程序菜单/启动器?

来自分类Dev

如何完全卸载Android系统应用程序?

来自分类Dev

如何通过adb卸载android系统应用程序的更新?

来自分类Dev

如何以编程方式卸载android系统应用程序?

来自分类Dev

如何设置从Android应用程序的系统性能?

来自分类Dev

Android 应用程序:如何控制系统设置?

来自分类Dev

调用getWritableDatabase()时,我的Android应用程序崩溃了;方法

来自分类Dev

当我调用 EditText 时,android 应用程序崩溃

来自分类Dev

在我的Web应用程序项目上进行MSBuild期间无法挂接到CopyAllFilesToSingleFolderForMsdeployDependsOn

来自分类Dev

如何使我的应用程序可以从其他应用程序调用

来自分类Dev

我的Android应用程序如何与本机守护程序通信?

来自分类Dev

如何确保我的Android 6 Cordova应用程序在尝试访问文件系统之前提示用户授予权限?

来自分类Dev

我应该如何索引我的Android应用程序的内容

来自分类Dev

我应该如何存储我的android应用程序的图像?

Related 相关文章

  1. 1

    如何挂接我的Android应用程序(非root用户的设备)的系统调用

  2. 2

    如何挂接我的Android应用程序(非root用户设备)的系统调用

  3. 3

    当android系统杀死应用程序时,如何保存我的应用程序状态?

  4. 4

    播放应用程序关闭时未调用停止挂接

  5. 5

    如何在我的android应用程序的用户界面中调用另一个android应用程序?

  6. 6

    如何防止android操作系统缩放我的应用程序?

  7. 7

    当我在Android应用程序中单击“笔记”按钮时,如何调用我的NoteMain类

  8. 8

    如何布局我的Android应用程序?

  9. 9

    如何翻译我的Android应用程序?

  10. 10

    如何翻译我的Android应用程序?

  11. 11

    如何布局我的android应用程序?

  12. 12

    如何运行我的Android应用程序?

  13. 13

    是否可以在Windows上阻止其他应用程序挂接到系统DLL中

  14. 14

    将我的android应用程序签名为系统应用程序

  15. 15

    将我的android应用程序签名为系统应用程序

  16. 16

    Android:如何从我的应用程序获取应用程序列表或调用主应用程序菜单/启动器?

  17. 17

    如何完全卸载Android系统应用程序?

  18. 18

    如何通过adb卸载android系统应用程序的更新?

  19. 19

    如何以编程方式卸载android系统应用程序?

  20. 20

    如何设置从Android应用程序的系统性能?

  21. 21

    Android 应用程序:如何控制系统设置?

  22. 22

    调用getWritableDatabase()时,我的Android应用程序崩溃了;方法

  23. 23

    当我调用 EditText 时,android 应用程序崩溃

  24. 24

    在我的Web应用程序项目上进行MSBuild期间无法挂接到CopyAllFilesToSingleFolderForMsdeployDependsOn

  25. 25

    如何使我的应用程序可以从其他应用程序调用

  26. 26

    我的Android应用程序如何与本机守护程序通信?

  27. 27

    如何确保我的Android 6 Cordova应用程序在尝试访问文件系统之前提示用户授予权限?

  28. 28

    我应该如何索引我的Android应用程序的内容

  29. 29

    我应该如何存储我的android应用程序的图像?

热门标签

归档