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數(shù)據(jù)
* 每個(gè)字節(jié)去除最高位炬称,然后進(jìn)行拼接,重新構(gòu)造一個(gè)int類型數(shù)值,從低位開(kāi)始
* @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 位數(shù)字。第一位為是否繼續(xù)取的標(biāo)識(shí)
下面以10000為例伟阔,編碼過(guò)程:
二進(jìn)制形式為 10 0111 0001 0000
以7bits為整體 1001110 0010000
添加標(biāo)識(shí)組合成新的字節(jié)(從后往前辣之,即低bits到高bits) 01001110(0x4E) 10010000(0x90) (最高位標(biāo)識(shí)設(shè)置為0,表示沒(méi)有后續(xù)字節(jié))
LEB128 則為 0x90 0x4F (小端存放)
解碼過(guò)程:
LEB128 0x90 0x4E
二進(jìn)制形式 10010000 01001110
去掉標(biāo)識(shí)信息 0010000(低7bits) 1001110(高7bits)
組合的結(jié)果為 10011100010000 (10000)
2. 加密特定函數(shù)
可參考:http://www.wjdiankong.cn/archives/553
里面講解了對(duì) DEX 文件的分析皱炉,但有錯(cuò)誤的地方
3. dex code 編碼對(duì)照
http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html
https://source.android.com/devices/tech/dalvik/dalvik-bytecode Dalvik 字節(jié)碼
https://source.android.com/devices/tech/dalvik/instruction-formats Dalvik 可執(zhí)行指令格式