能力值:
( LV5,RANK:60 )
|
-
-
26 楼
前面也有传
模仿取得的数据
static int dlopenAddr = 0xD028; //opendl地址
static int InitArrayAddr = 0x00049E20 - 0x1000; //此处IDA的地址总是比UE中的多0x1000
static int asmAddr = 0x4A400; //代码插入位置
libc.so And libc_ok.so,附件
libc_and_libc_ok.rar
|
能力值:
( LV3,RANK:30 )
|
-
-
27 楼
static int asmAddr = 0x46260;
用这个值试试
另外 代码需要变动一下
第28行 插入
data[StrAddr + LibCkisSo.Length] = 0;
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
第二种方式 xposed+libc.so libc你修改的意义是什么呢?
|
能力值:
( LV3,RANK:30 )
|
-
-
29 楼
安卓有java层和jni(native)层
XPOSED只能HOOK JAVA层
那么JNI层如何HOOK?需要改 libc.so 为全局注入点的方式实现
|
能力值:
( LV5,RANK:60 )
|
-
-
30 楼
[QUOTE=ckis;1448424]static int asmAddr = 0x46260;
用这个值试试
另外 代码需要变动一下
第28行 插入
data[StrAddr + LibCkisSo.Length] = 0;[/QUOTE] 地址选这个位置可以,地址选择是有什么限制吗? 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace LibcInject
{
class Program
{
static int dlopenAddr = 0xD028; //opendl地址
static int InitArrayAddr = 0x00049E20 - 0x1000; //此处IDA的地址总是比UE中的多0x1000
static int asmAddr = 0x46260; //代码插入位置
static byte[] asm = { 0xFF,0x40,0x2D,0xE9,0x18,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x00,0x00,0x8F,0xE0,
0x01,0xF7,0xFF,0xEB,0xFF,0x40,0xBD,0xE8,0x08,0x00,0x9F,0xE5,0x00,0x00,0x8F,0xE0,
0x10,0xFF,0x2F,0xE1,0x9C,0x68,0x03,0x00,0x09,0xBF,0x01,0x00,0x00,0x00,0x00,0x00};
static int StrAddr = asmAddr + 0x40;
static void Main(string[] args)
{
BinaryReader br = null;
try
{
br = new BinaryReader(new FileStream("libc.so", FileMode.Open));
}
catch (IOException e)
{
Console.WriteLine(e.Message + "Cannot open file.");
return;
}
int length = Convert.ToInt32(br.BaseStream.Length);
byte[] data = br.ReadBytes(length);
br.Close();
byte[] LibCkisSo = System.Text.Encoding.ASCII.GetBytes("libckis.so");
Array.ConstrainedCopy(LibCkisSo, 0, data, StrAddr, LibCkisSo.Length);
data[StrAddr + LibCkisSo.Length] = 0;
int JmpReturnAddr = System.BitConverter.ToInt32(data, InitArrayAddr);
byte[] byAsmAddr = System.BitConverter.GetBytes(asmAddr);
Array.ConstrainedCopy(byAsmAddr, 0, data, InitArrayAddr, byAsmAddr.Length);
byte[] JmpOffset = System.BitConverter.GetBytes(JmpReturnAddr - asmAddr - 0x24);
Array.ConstrainedCopy(JmpOffset, 0, asm, 0x28, JmpOffset.Length);
byte[] StrOffset = System.BitConverter.GetBytes(StrAddr - asmAddr - 0x14);
Array.ConstrainedCopy(StrOffset, 0, asm, 0x24, StrOffset.Length);
byte[] DlopenOffset = System.BitConverter.GetBytes((dlopenAddr - asmAddr - 0x18) / 4);
Array.ConstrainedCopy(DlopenOffset, 0, asm, 0x10, StrOffset.Length - 1);
Array.ConstrainedCopy(asm, 0, data, asmAddr, asm.Length);
BinaryWriter bw = new BinaryWriter(new FileStream("libc_ok.so", FileMode.Create));
bw.Write(data);
bw.Close();
}
}
}
|
能力值:
( LV3,RANK:30 )
|
-
-
31 楼
位置没什么限制 应该是ELF文件格式的问题 你之前选的地址是在 data段的 但我给出的例子 是rodata段的 在text段arm机器码执行的偏移位置不一样
如果按你之前的地址 代码里需要+0x1000即可
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
感谢分享,学习一下思路
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
Mark下,感谢楼主分享
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
libc修改了后,怎么拦截jni层呢?是否有样例代码?
|
能力值:
( LV3,RANK:30 )
|
-
-
36 楼
http://www.weibo.com/ele7enxxh
https://github.com/ele7enxxh/Android-Inline-Hook
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
感谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
楼主分析相当仔细,感觉分享
|
能力值:
( LV6,RANK:80 )
|
-
-
39 楼
mark
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
如果有一些JNI层比较丰富的hook实例就棒棒了,不过还是非常感谢
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
楼主说的hook JNI层,说的是hook native方法吗?xposed不是支持native方法的hook吗?哪位大神解惑一下,非常感谢!!
|
能力值:
( LV3,RANK:30 )
|
-
-
42 楼
感谢楼主,能否解析下static byte[] asm这个数组的意思和怎样生成的呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
44 楼
第二种懵懵懂懂
|
能力值:
( LV3,RANK:30 )
|
-
-
45 楼
vurtneye
我之前一直研究探探,发现探探会检测java层的钩子,因为xpose是把hook的java方法改成native属性,探探会检测出来你是否hook,所以对于目前你说的这两种方案应该无法避过检测
把他要检测的Method的Native属性去掉 会吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
楼主,看了你得帖子很是受启发,可以帮我在安卓cydia框架上写个hook插件吗?报酬丰厚,QQ416359880
|
能力值:
( LV2,RANK:10 )
|
-
-
47 楼
ckis
把他要检测的Method的Native属性去掉 会吗?
这个检测的我已经去掉,但是还是被检测出来使用了xpose,看来自己功力不够深厚,还需要继续研究才行,看你的文章收益不少,感谢
|
能力值:
( LV2,RANK:10 )
|
-
-
48 楼
xposed是classloader被检测到的。
|
能力值:
( LV2,RANK:10 )
|
-
-
49 楼
感谢分享!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
50 楼
用ida看区段.rodata与.data中的插入代码一样的,但是.rodata可以hook,.data无法hook。 libc.so中.init_array: libc_rodata中asmAddr: libc_data中asmAddr: 生成代码如下: using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace LibcInject
{
class Program
{
static int dlopenAddr = 0xCF14; //opendl地址
static int InitArrayAddr = 0x48E20 - 0x1000; //此处IDA的地址总是比UE中的多0x1000
static int idaAsmAddr = 0x49350; //代码插入位置(带入插入的是.data区段)
static int offAsmAddr = idaAsmAddr - 0x1000;
static byte[] asm = { 0xFF,0x40,0x2D,0xE9,0x18,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x00,0x00,0x8F,0xE0,
0x01,0xF7,0xFF,0xEB,0xFF,0x40,0xBD,0xE8,0x08,0x00,0x9F,0xE5,0x00,0x00,0x8F,0xE0,
0x10,0xFF,0x2F,0xE1,0x9C,0x68,0x03,0x00,0x09,0xBF,0x01,0x00,0x00,0x00,0x00,0x00};
static int idaStrAddr = idaAsmAddr + 0x40;
static int offStrAddr = offAsmAddr + 0x40;
static void Main(string[] args)
{
BinaryReader br = null;
try
{
br = new BinaryReader(new FileStream("libc.so", FileMode.Open));
}
catch (IOException e)
{
Console.WriteLine(e.Message + "Cannot open file.");
return;
}
int length = Convert.ToInt32(br.BaseStream.Length);
byte[] data = br.ReadBytes(length);
br.Close();
byte[] LibCkisSo = System.Text.Encoding.ASCII.GetBytes("libckis.so");
Array.ConstrainedCopy(LibCkisSo, 0, data, offStrAddr, LibCkisSo.Length);
data[offStrAddr + LibCkisSo.Length] = 0;
int JmpReturnAddr = System.BitConverter.ToInt32(data, InitArrayAddr);
byte[] byAsmAddr = System.BitConverter.GetBytes(idaAsmAddr);
Array.ConstrainedCopy(byAsmAddr, 0, data, InitArrayAddr, byAsmAddr.Length);
byte[] JmpOffset = System.BitConverter.GetBytes(JmpReturnAddr - idaAsmAddr - 0x24);
Array.ConstrainedCopy(JmpOffset, 0, asm, 0x28, JmpOffset.Length);
byte[] StrOffset = System.BitConverter.GetBytes(idaStrAddr - idaAsmAddr - 0x14);
Array.ConstrainedCopy(StrOffset, 0, asm, 0x24, StrOffset.Length);
byte[] DlopenOffset = System.BitConverter.GetBytes((dlopenAddr - idaAsmAddr - 0x18) / 4);
Array.ConstrainedCopy(DlopenOffset, 0, asm, 0x10, StrOffset.Length - 1);
Array.ConstrainedCopy(asm, 0, data, offAsmAddr, asm.Length);
BinaryWriter bw = new BinaryWriter(new FileStream("libc_ok.so", FileMode.Create));
bw.Write(data);
bw.Close();
}
}
} 求指点为什么.data的不行,找了好久没找到原因。
|
|
|