4

[分享]python 版本的 dex 解析器

SyserDebug 2015-3-31 13:55 19556
2年前为了 了解 dex 文件格式. 顺手写了一个 dex 解析器.  支持 dex 的反汇编功能.
同时也支持把 dex 中的 java 类 导出一个类似   C/C++ 语言的头文件功能.

类似下面的头文件

class com_android_internal_os_ProcessStats
{
private:
        const boolean DEBUG = false;
        const int[] LOAD_AVERAGE_FORMAT = NULL;
        const int[] PROCESS_FULL_STATS_FORMAT = NULL;
public:
        const int PROCESS_FULL_STAT_MAJOR_FAULTS = 02 ;
        const int PROCESS_FULL_STAT_MINOR_FAULTS = 01 ;
        const int PROCESS_FULL_STAT_STIME = 04 ;
        const int PROCESS_FULL_STAT_UTIME = 03 ;
        const int PROCESS_FULL_STAT_VSIZE = 05 ;
private:
        const int[] PROCESS_STATS_FORMAT = NULL;
public:
        const int PROCESS_STAT_MAJOR_FAULTS = 01 ;
        const int PROCESS_STAT_MINOR_FAULTS = 00 ;
        const int PROCESS_STAT_STIME = 03 ;
        const int PROCESS_STAT_UTIME = 02 ;
private:
        const int[] SYSTEM_CPU_FORMAT = NULL;
        const String TAG = "ProcessStats";
        const boolean localLOGV = 0;
        const Comparator sLoadComparator = 0;
////////////////////////////////////////////////////////
private:
        long mBaseIdleTime;
        long mBaseIoWaitTime;
        long mBaseIrqTime;
        long mBaseSoftIrqTime;
        long mBaseSystemTime;
        long mBaseUserTime;
        byte[] mBuffer;
        long[] mCpuSpeedTimes;
        long[] mCpuSpeeds;
        int[] mCurPids;
        int[] mCurThreadPids;
        long mCurrentSampleRealTime;
        long mCurrentSampleTime;
        boolean mFirst;
private:
        boolean mIncludeThreads;
private:
        long mLastSampleRealTime;
        long mLastSampleTime;
        float mLoad1;
        float mLoad15;
        float mLoad5;
private:
        float[] mLoadAverageData;
        ArrayList mProcStats;
        long[] mProcessFullStatsData;
        String[] mProcessFullStatsStringData;
        long[] mProcessStatsData;
private:
        long[] mRelCpuSpeedTimes;
        int mRelIdleTime;
        int mRelIoWaitTime;
        int mRelIrqTime;
        int mRelSoftIrqTime;
        int mRelSystemTime;
        int mRelUserTime;
private:
        long[] mSinglePidStatsData;
        long[] mSystemCpuData;
        ArrayList mWorkingProcs;
private:
        boolean mWorkingProcsSorted;
public:
        void <clinit>();
public:
        void <init>(boolean includeThreads);
private:
        int[] collectStats(String statsFile,int parentPid,boolean first,int[] curPids,ArrayList);
        long[] getCpuSpeedTimes(long[] out);
        void getName(ProcessStats$Stats st,String cmdlineFile);
        void printProcessCPU(PrintWriter pw,String prefix,int pid,String label,int totalTime,int user,int system,int iowait,int irq,int softIrq,int minFaults,int majFaults);
        void printRatio(PrintWriter pw,long numerator,long denominator);
        String readFile(String file,char endChar);
//////////////////////virtual method//////////////////////////////////
public:
        virtual void buildWorkingProcs();
public:
        virtual int countStats();
        virtual int countWorkingStats();
public:
        virtual long getCpuTimeForPid(int pid);
        virtual long[] getLastCpuSpeedTimes();
public:
        virtual int getLastIdleTime();
        virtual int getLastIoWaitTime();
        virtual int getLastIrqTime();
        virtual int getLastSoftIrqTime();
        virtual int getLastSystemTime();
        virtual int getLastUserTime();
        virtual ProcessStats$Stats getStats(int index);
        virtual float getTotalCpuPercent();
        virtual ProcessStats$Stats getWorkingStats(int index);
public:
        virtual void init();
        virtual void onLoadChanged(float load1,float load5,float load15);
        virtual int onMeasureProcessName(String name);
public:
        virtual String printCurrentLoad();
        virtual String printCurrentState(long now);
public:
        virtual void update();
}

dex 解析输出类似以下信息:
void android.media.videoeditor.AudioTrack::extractAudioWaveform(android.media.videoeditor.ExtractAudioWaveformProgressListener)
                registers_size      :0000000d:        13
                insns_size          :0000009e:       158
                debug_info_off      :0089ba78:   9026168
                ins_size            :00000002:         2
                outs_size           :00000009:         9
                tries_size          :00000000:         0
                insns               :002c9da0:   2923936
                tries               :00000000:         0
                handlers            :00000000:         0
002c9da0: 1208                                 |0000: const/4 v8 , 0
002c9da2: 54b0 9035                            |0001: iget-object v0 , v11 , field@mAudioWaveformFilename  //java.lang.String mAudioWaveformFilename
002c9da6: 3900 6300                            |0003: if-nez v0 , 0066
002c9daa: 54b0 9935                            |0005: iget-object v0 , v11 , field@mMANativeHelper  //android.media.videoeditor.MediaArtistNativeHelper mMANativeHelper
002c9dae: 6e10 5342 0000                       |0007: invoke-virtual v0 , meth@getProjectPath  //java.lang.String android.media.videoeditor.MediaArtistNativeHelper::getProjectPath()
002c9db4: 0c0a                                 |000a: move-result-object v10
002c9db6: 2200 0e17                            |000b: new-instance v0 , type@Ljava/lang/StringBuilder;
002c9dba: 7010 e0eb 0000                       |000d: invoke-direct v0 , meth@<init>  //void java.lang.StringBuilder::<init>()
002c9dc0: 6e20 eceb a000                       |0010: invoke-virtual v0 , v10 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(java.lang.String)
002c9dc6: 0c00                                 |0013: move-result-object v0
002c9dc8: 1a01 6a0e                            |0014: const-string v1 , "/audioWaveformFile-"
002c9dcc: 6e20 eceb 1000                       |0016: invoke-virtual v0 , v1 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(java.lang.String)
002c9dd2: 0c00                                 |0019: move-result-object v0
002c9dd4: 6e10 e741 0b00                       |001a: invoke-virtual v11 , meth@getId  //java.lang.String android.media.videoeditor.AudioTrack::getId()
002c9dda: 0c01                                 |001d: move-result-object v1
002c9ddc: 6e20 eceb 1000                       |001e: invoke-virtual v0 , v1 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(java.lang.String)
002c9de2: 0c00                                 |0021: move-result-object v0
002c9de4: 1a01 2a0e                            |0022: const-string v1 , ".dat"
002c9de8: 6e20 eceb 1000                       |0024: invoke-virtual v0 , v1 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(java.lang.String)
002c9dee: 0c00                                 |0027: move-result-object v0
002c9df0: 6e10 feeb 0000                       |0028: invoke-virtual v0 , meth@toString  //java.lang.String java.lang.StringBuilder::toString()
002c9df6: 0c00                                 |002b: move-result-object v0
002c9df8: 2381 471b                            |002c: new-array v1 , v8 , type@[Ljava/lang/Object;
002c9dfc: 7120 a1eb 1000                       |002e: invoke-static v0 , v1 , meth@format  //java.lang.String java.lang.String::format(java.lang.String,java.lang.Object[])
002c9e02: 0c03                                 |0031: move-result-object v3
002c9e04: 54b0 9935                            |0032: iget-object v0 , v11 , field@mMANativeHelper  //android.media.videoeditor.MediaArtistNativeHelper mMANativeHelper
002c9e08: 52b1 8f35                            |0034: iget v1 , v11 , field@mAudioType  //int mAudioType
002c9e0c: 6e20 4442 1000                       |0036: invoke-virtual v0 , v1 , meth@getAudioCodecType  //int android.media.videoeditor.MediaArtistNativeHelper::getAudioCodecType(int)
002c9e12: 0a09                                 |0039: move-result v9
002c9e14: 2b09 5000 0000                       |003a: packed-switch v9 , string@80
002c9e1a: 2200 f016                            |003d: new-instance v0 , type@Ljava/lang/IllegalStateException;
002c9e1e: 2201 0e17                            |003f: new-instance v1 , type@Ljava/lang/StringBuilder;
002c9e22: 7010 e0eb 0100                       |0041: invoke-direct v1 , meth@<init>  //void java.lang.StringBuilder::<init>()
002c9e28: 1a02 52a4                            |0044: const-string v2 , "Unsupported codec type: "
002c9e2c: 6e20 eceb 2100                       |0046: invoke-virtual v1 , v2 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(java.lang.String)
002c9e32: 0c01                                 |0049: move-result-object v1
002c9e34: 6e20 e7eb 9100                       |004a: invoke-virtual v1 , v9 , meth@append  //java.lang.StringBuilder java.lang.StringBuilder::append(int)
002c9e3a: 0c01                                 |004d: move-result-object v1
002c9e3c: 6e10 feeb 0100                       |004e: invoke-virtual v1 , meth@toString  //java.lang.String java.lang.StringBuilder::toString()
002c9e42: 0c01                                 |0051: move-result-object v1
002c9e44: 7020 fdea 1000                       |0052: invoke-direct v0 , v1 , meth@<init>  //void java.lang.IllegalStateException::<init>(java.lang.String)
002c9e4a: 2700                                 |0055: throw v0
002c9e4c: 1254                                 |0056: const/4 v4 , 5
002c9e4e: 1306 a000                            |0057: const/16 v6 , 160
002c9e52: 54b0 9935                            |0059: iget-object v0 , v11 , field@mMANativeHelper  //android.media.videoeditor.MediaArtistNativeHelper mMANativeHelper
002c9e56: 54b1 9d35                            |005b: iget-object v1 , v11 , field@mUniqueId  //java.lang.String mUniqueId
002c9e5a: 54b2 9635                            |005d: iget-object v2 , v11 , field@mFilename  //java.lang.String mFilename
002c9e5e: 1225                                 |005f: const/4 v5 , 2
002c9e60: 07c7                                 |0060: move-object v7 , v12
002c9e62: 7409 3d42 0000                       |0061: invoke-virtual/range
002c9e68: 5bb3 9035                            |0064: iput-object v3 , v11 , field@mAudioWaveformFilename  //java.lang.String mAudioWaveformFilename
002c9e6c: 2200 2017                            |0066: new-instance v0 , type@Ljava/lang/ref/SoftReference;
002c9e70: 2201 e406                            |0068: new-instance v1 , type@Landroid/media/videoeditor/WaveformData;
002c9e74: 54b2 9035                            |006a: iget-object v2 , v11 , field@mAudioWaveformFilename  //java.lang.String mAudioWaveformFilename
002c9e78: 7020 c943 2100                       |006c: invoke-direct v1 , v2 , meth@<init>  //void android.media.videoeditor.WaveformData::<init>(java.lang.String)
002c9e7e: 7020 36ec 1000                       |006f: invoke-direct v0 , v1 , meth@<init>  //void java.lang.ref.SoftReference::<init>(java.lang.Object)
002c9e84: 5bb0 9f35                            |0072: iput-object v0 , v11 , field@mWaveformData  //java.lang.ref.SoftReference mWaveformData
002c9e88: 0e00                                 |0074: return-void
002c9e8a: 1304 0a00                            |0075: const/16 v4 , 10
002c9e8e: 1306 4001                            |0077: const/16 v6 , 320
002c9e92: 28e0                                 |0079: goto 0059
002c9e94: 1304 2000                            |007a: const/16 v4 , 32
002c9e98: 1306 0004                            |007c: const/16 v6 , 1024
002c9e9c: 28db                                 |007e: goto 0059
002c9e9e: 1304 2400                            |007f: const/16 v4 , 36
002c9ea2: 1306 8004                            |0081: const/16 v6 , 1152
002c9ea6: 28d6                                 |0083: goto 0059
002c9ea8: 1304 4000                            |0084: const/16 v4 , 64
002c9eac: 1306 0008                            |0086: const/16 v6 , 2048
002c9eb0: 28d1                                 |0088: goto 0059
002c9eb2: 0000                                 |0089: nop
上传的附件:
最新回复 (16)
1
exile 2015-3-31 15:12
2
感谢分享
YwdxY 2015-3-31 15:25
3
感谢分享
a白小痴 2015-3-31 22:08
4
感谢分享,神器啊
a白小痴 2015-4-1 08:47
5
话说还真没用过py,,,不知道怎么使用楼主能给份详细的教程吗?
2
万抽抽 2015-4-1 09:19
6
感谢分享
4
SyserDebug 2015-4-1 11:47
7
在机器上安装 python .
然后把 附件中的 zip 文件解压开.

执行    python   dex.py    your_class_dex_file
zylyy 2015-4-1 11:49
8
不错,有很小的几率会用到
a白小痴 2015-4-1 11:59
9
楼主能留个联系方式吗?或者联系企鹅990927037指点
忆海拾贝 2015-4-1 18:12
10
我也收集了一个python解析的工具,老外写的代码很棒,可以根据偏移得到很多的数据

DexParse.rar





https://github.com/rchiossi/dexlib
解析的时候依赖于这个库:
https://github.com/rchiossi/libparse
上传的附件:
忆海拾贝 2015-4-1 18:20
11
下载下来运行了下楼主的程序,太赞了!
4
SyserDebug 2015-4-2 00:08
12
你是在赞 我的程序,还是 github 上的程序啊?
忆海拾贝 2015-4-2 18:04
13
赞你的啊,你的比他写的牛逼
4
ycmint 2015-4-4 09:02
14
mark
川美 2015-4-4 10:07
15
感谢分享
bagkky 2015-4-13 21:48
16
mark
opL 2017-8-11 15:53
17

这个dex解析会报错,有人遇到这个问题么?

上传的附件:
返回