1. leb128 编码解析
public static byte[] readUnsignedLeb128(byte[] srcByte, int offset){
List<Byte> byteAryList = new ArrayList<Byte>();
byte bytes = Utils.copyByte(srcByte, offset, 1)[0];
byte highBit = (byte)(bytes & 0x80);
byteAryList.add(bytes);
offset ++;
while(highBit != 0){
bytes = Utils.copyByte(srcByte, offset, 1)[0];
highBit = (byte)(bytes & 0x80);
offset ++;
byteAryList.add(bytes);
}
byte[] byteAry = new byte[byteAryList.size()];
for(int j=0;j<byteAryList.size();j++){
byteAry[j] = byteAryList.get(j);
}
return byteAry;
}
/**
* 解码leb128数据
* 每个字节去除最高位,然后进行拼接,重新构造一个int类型数值,从低位开始
* @param byteAry
* @return
*/
public static int decodeUleb128(byte[] byteAry) {
int result = 0;
int a =0;
int offset = 0;
while (byteAry[a] != 0) {
result |= ((byteAry[a] & 0x7f) << offset);
offset += 7;
if ((byteAry[a] & 0x80) == 0) break;
a += 1;
}
return result;
}
具体解析可参考:http://blog.csdn.net/liwugang43210/article/details/50475928
leb128 编码,就是取 7 位数字。第一位为是否继续取的标识
下面以10000为例,编码过程:
二进制形式为 10 0111 0001 0000
以7bits为整体 1001110 0010000
添加标识组合成新的字节(从后往前,即低bits到高bits) 01001110(0x4E) 10010000(0x90) (最高位标识设置为0,表示没有后续字节)
LEB128 则为 0x90 0x4F (小端存放)
解码过程:
LEB128 0x90 0x4E
二进制形式 10010000 01001110
去掉标识信息 0010000(低7bits) 1001110(高7bits)
组合的结果为 10011100010000 (10000)
2. 加密特定函数
可参考:http://www.wjdiankong.cn/archives/553
里面讲解了对 DEX 文件的分析,但有错误的地方
3. dex code 编码对照
http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html
https://source.android.com/devices/tech/dalvik/dalvik-bytecode Dalvik 字节码
https://source.android.com/devices/tech/dalvik/instruction-formats Dalvik 可执行指令格式
网友评论