首页
社区
课程
招聘
[求助]关于Hook so不需要root权限的方法
发表于: 2014-7-28 12:32 12656

[求助]关于Hook so不需要root权限的方法

2014-7-28 12:32
12656
小弟现在要做一个hook掉系统中的ioctl调用的工作,但是只要hook一个apk本身的系统调用,不要注入系统的进程,请问大大们有没有不要root权限的方法啊。

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我猜你是要搞root
2014-7-28 14:29
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
额古河大哥那个通过root权限inject的方法我现在能跑,但是老板说不要通过root权限。有没有办法只改本进程的GOT表而不root的方法啊?吧古河大哥那段代码嵌入到apk里面也是不行的。
2014-7-28 23:27
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自己顶,解决了。在Application创建前run下hook的代码就能把函数hook到自己的函数了。
2014-7-30 21:23
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
5
直接修改符号的st_value,指向你的代理函数就好。
2014-7-31 09:17
0
雪    币: 11
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
玩命大侠放点代码出来吧 方便下我们这些懒人
2014-7-31 09:50
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
符号指向何处呢? 另一个动态库? 那怎么添加DT_NEEDED项。 请指教~~~~~~~
2014-7-31 15:51
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
8
楼主问的是如何hook本地的。 首先你写个壳附加上去, 然后写好桩函数,记录到这个桩的va,然后遍历目标程序的符号表,获取st_value值,将桩的va替换上去。写得好点就引出一个全局变量把原先st_value记录到上面,作为返回。 这套就搞定了。

你也可以指向另外一个动态库,这个实现比较复杂。代码写的多些。 如果单只添加一个DT_NEEDED也不是很难。 你把原先的PT_DYNAMIC复制出来。然后添加一项DT_NEEDED项。 在把原先的字符串表复制出来,添加一个你要加载的so名称,核算一下字符串的索引,把这个索引给到新的DT_NEEDED就好了。  这个字符串和符号表与哈希表都没啥关系。所以可以任意添加。
2014-7-31 16:35
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
9
楼主要是仅hook自己,连壳都不用写,直接在自己的代码中写好就行...
2014-7-31 16:37
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢斑竹大人回复

我现在也在做这一块,我的做法是修改被hook的函数的符号名称,然后添加一个NEEDED项把自己的so添加到目标文件依赖项上。

这样做有个难点我找了个相对取巧的方法,我把DT_RELENT项给换成DT_NEEDED了,从android的linker源码看,这一项必须有但是linker不处理。

伪造段我想过,也试过,主要是段的问题;段是连续的,比如字符串section所在的段有好几个段,我想伪造一个字符串section(符号名称、库名称都在这里),就得伪造整个段(字符串section所在),而且偏移、vaddr都会变化(因为字符串section变长了),非常麻烦,斑竹大人能否指点一下看是否有更好的方法。

加壳这块我不太明白,斑竹大人是否能够指点一下。

最后祝工作顺心。
2014-8-1 09:02
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
11
直接替换DT_RELENT确实没什么问题。但是只能添加一项,至于你说的第二点我没看懂你说的?  这也不算什么伪造段, PT_DYNAMIC本来就包含在第二个段里。 你新添加的PT_DYNAMIC可以追加到后面更新一下段表的长度就好了。或者直接内存粒度展开直接拍成一个段,你随意添加东西,然后更新段大小就成了。
2014-8-1 22:15
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我的意思是这样,PT_LOAD类型的段里面包含若干节(section),如下:
Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame

处于同一segment中的section,他们都是连续的,如下:
[ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000020 04   A  5   0  4
  [ 5] .dynsym           DYNSYM          080481cc 0001cc 000050 10   A  6   1  4
  [ 6] .dynstr           STRTAB          0804821c 00021c 00004c 00   A  0   0  1
  [ 7] .gnu.version      VERSYM          08048268 000268 00000a 02   A  5   0  2
  [ 8] .gnu.version_r    VERNEED         08048274 000274 000020 00   A  6   1  4
  [ 9] .rel.dyn          REL             08048294 000294 000008 08   A  5   0  4
  [10] .rel.plt          REL             0804829c 00029c 000018 08   A  5  12  4
  [11] .init             PROGBITS        080482b4 0002b4 00002e 00  AX  0   0  4
  [12] .plt              PROGBITS        080482f0 0002f0 000040 04  AX  0   0 16

如果我将dynstr section中添加一个字符串,那这个section肯定变大了,将会影响到后续section的偏移以及他们的vaddr,修改起来很麻烦。

若我再做一个section(比如是dynstr)放在文件结尾,则与原有的处于同一个segment的section不再连续,貌似载入会出现问题。

关于这个问题我没有找到很舒服的解决办法,请斑竹指教。
2014-8-4 08:45
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
13
section是文件形式的才有效果的。 在内存中就是段。 你修复section表干嘛。不用管它,直接全部删掉。 在之前记录到它的位置就好。 连续不连续没关系,修复了PT_DYNAMIC里的对应项目就好。总给加起来不到100行代码就搞定 你说的东西了。
2014-8-4 19:35
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我试试看
2014-8-5 08:34
0
雪    币: 7
活跃值: (248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个不用root的吧  直接Hook自身进程  直接HOOK就可以了吧
2016-5-13 15:01
0
游客
登录 | 注册 方可回帖
返回
//