@oro-oro
2015-08-18T11:16:26.000000Z
字数 2465
阅读 2422
JebAPI
这个类代表正在被JEB处理的DEX文件。
要想更好的了解这个类定义的方法,可以去读一下DEX文件格式的说明。
这里的类/方法/变量格式,跟smali一样:
Class: Lcom/foo/bar/Blob;
Method: Lcom/foo/bar/Blob;->methodX([BILjava/lang/String;)V
Field: Lcom/foo/bar/Blob;->var:J
感兴趣的方法列表
方法 | 说明 |
---|---|
getClass(int index) | 通过序号获得Class对象 |
getClass(java.lang.String name) | 通过名字获得Class对象 |
getClassCount() | 获取Dex文件里面定义的类的数量 |
getField(int index) | 通过序号获得一个变量(DexField) |
getFieldCount() | 获得DEX文件中定义的变量的数量 |
getFieldData(java.lang.String name) | 通过名字获得一个变量(DexFieldData) |
getMethod(int index) | 通过索引获得一个方法() |
getMethodCount() | 获取DEX中方法数量 |
getMethodData(java.lang.String name) | 通过名字获得一个方法() |
getStrings() | 从DEX字符串池中获取所有字符串 |
getType(int index) | 返回类型字符串 |
getTypeCount() | 获得类型字符串的数量 |
# coding:utf-8
from jeb.api import IScript
class TestDexGetType(IScript):
def run(self, jeb):
dex = jeb.getDex()
jeb.print("type number : " + str(dex.getTypeCount()))
jeb.print("type 1 : " + dex.getType(1))
jeb.print("type 20 : " + dex.getType(20))
jeb.print("type 30 : " + dex.getType(30))
这个类表示的是DEX的class_def_item
对象。
jeb.api.dex.Dex的getClass方法可以拿到DexClass对象。
方法 | 说明 |
---|---|
getClasstypeIndex() | 获得该类的类型索引 |
getData() | 获得该类的DexClassData对象 |
getInterfaceIndexes() | 获取实现的接口的索引 |
getSuperclassIndex() | 获取父类索引 |
# coding:utf-8
from jeb.api import IScript
class TestDexClass(IScript):
def run(self, jeb):
dex = jeb.getDex()
jeb.print("class number : " + str(dex.getClassCount()))
cls = dex.getClass(10)
cls_type_index = cls.getClasstypeIndex()
jeb.print(str(cls_type_index))
jeb.print("class name : " + dex.getType(cls_type_index))
super_cls_idx = cls.getSuperclassIndex()
if super_cls_idx != -1:
jeb.print("super class name : " + dex.getType(super_cls_idx))
if_idx = cls.getInterfaceIndexes()
for idx in if_idx:
jeb.print("inerface name : " + dex.getType(idx))
该类对应了DEX的field_id_item
对象。
# coding:utf-8
from jeb.api import IScript
class TestDexField(IScript):
def run(self, jeb):
dex = jeb.getDex()
dex_field = dex.getField(110)
idx = dex_field.getIndex()
jeb.print("Field Index : " + str(idx))
cls_type_idx = dex_field.getClassTypeIndex()
jeb.print("Class Type : " + dex.getType(cls_type_idx))
jeb.print("Field Name : " + dex_field.getName())
jeb.print("Field Type : " + dex.getType(dex_field.getTypeIndex()))
jeb.print("field sig : " + dex_field.getSignature(True))
参考 DexClass、DexField的用法。
有时候分析会遇到一些混淆过的类名、方法名、变量名,如果是abc还好,有一些根本就不是人看的字符。
通过前面了解的API,我们可以拿到类名、方法名、变量名,又有rename系列方法,则可以对这些混淆的名字进行重命名。
JEB的脚本例子:
https://www.pnfsoftware.com/jeb1/downloads
其中有一个是简单的重命名混淆类名的脚本:
https://github.com/SecureBrain/JEB-sample-scripts/blob/master/RenameObfuscatedClasses.py
这只是一个例子,要完全实用的话,还得自己去修改。