1. 程式人生 > >Oatdump 反編譯過程分析

Oatdump 反編譯過程分析

art/oatdump/oatdump.cc

1475int main(int argc,char** argv) {

1476   return art::oatdump(argc, argv);

1477}

1351 static int oatdump(int argc,char** argv) {

1414   if (oat_filename != NULL) {

1415     OatFile* oat_file =

1416         OatFile::Open(oat_filename,oat_filename, NULL, false);

1417     if (oat_file == NULL) {

1418       fprintf(stderr, "Failed to open oatfile from %s\n", oat_filename);

1419       return EXIT_FAILURE;

1420     }

1421     OatDumperoat_dumper(*host_prefix.get(), *oat_file);

1422    oat_dumper.Dump(*os);

1423     return EXIT_SUCCESS;

1424   }

107  void Dump(std::ostream& os) {

 108    const OatHeader& oat_header = oat_file_.GetOatHeader();

 109

 110    os << "MAGIC:\n";

 111    os << oat_header.GetMagic() << "\n\n";

 112

 113    os << "CHECKSUM:\n";

 114    os << StringPrintf("0x%08x\n\n",oat_header.GetChecksum());

 115

 116    os << "INSTRUCTION SET:\n";

 117    os << oat_header.GetInstructionSet() << "\n\n";

 118

 119    os << "DEX FILE COUNT:\n";

 120    os << oat_header.GetDexFileCount() << "\n\n";

 121

 122    os << "EXECUTABLE OFFSET:\n";

 123    os << StringPrintf("0x%08x\n\n",oat_header.GetExecutableOffset());

 124

 125    os << "IMAGE FILE LOCATION OAT CHECKSUM:\n";

 126    os << StringPrintf("0x%08x\n\n",oat_header.GetImageFileLocationOatChecksum());

 127

 128    os << "IMAGE FILE LOCATION OAT BEGIN:\n";

 129    os << StringPrintf("0x%08x\n\n",oat_header.GetImageFileLocationOatDataBegin());

 130

 131    os << "IMAGE FILE LOCATION:\n";

 132    const std::stringimage_file_location(oat_header.GetImageFileLocation());

 133    os << image_file_location;

 134    if (!image_file_location.empty() && !host_prefix_.empty()) {

 135      os << " (" << host_prefix_ <<image_file_location << ")";

 136    }

 137    os << "\n\n";

 138

 139    os << "BEGIN:\n";

 140    os << reinterpret_cast<const void*>(oat_file_.Begin())<< "\n\n";

 141

 142    os << "END:\n";

 143    os << reinterpret_cast<const void*>(oat_file_.End())<< "\n\n";

 144

 145    os << std::flush;

 146

 147    for (size_t i = 0; i < oat_dex_files_.size(); i++) {

 148      const OatFile::OatDexFile* oat_dex_file = oat_dex_files_[i];

 149      CHECK(oat_dex_file != NULL);

 150       DumpOatDexFile(os, *oat_dex_file);

 151    }

 152   }

244  void DumpOatDexFile(std::ostream& os, const OatFile::OatDexFile&oat_dex_file){

 245    os << "OAT DEX FILE:\n";

 246    os << StringPrintf("location: %s\n",oat_dex_file.GetDexFileLocation().c_str());

 247    os << StringPrintf("checksum: 0x%08x\n",oat_dex_file.GetDexFileLocationChecksum());

 248    UniquePtr<const DexFile> dex_file(oat_dex_file.OpenDexFile());

 249    if (dex_file.get() == NULL) {

 250      os << "NOT FOUND\n\n";

 251      return;

 252    }

 253    for (size_t class_def_index = 0; class_def_index <dex_file->NumClassDefs(); class_def_index++) {

 254      const DexFile::ClassDef& class_def =dex_file->GetClassDef(class_def_index);

 255      const char* descriptor = dex_file->GetClassDescriptor(class_def);

 256      UniquePtr<const OatFile::OatClass>oat_class(oat_dex_file.GetOatClass(class_def_index));

 257      CHECK(oat_class.get() != NULL);

 258      os << StringPrintf("%zd: %s (type_idx=%d) (",class_def_index, descriptor, class_def.class_idx_)

 259         << oat_class->GetStatus() << ")\n";

 260      Indenter indent_filter(os.rdbuf(), kIndentChar, kIndentBy1Count);

 261      std::ostream indented_os(&indent_filter);

 262       DumpOatClass(indented_os,*oat_class.get(), *(dex_file.get()), class_def);

 263    }

 264

 265    os << std::flush;

 266   }

277  void DumpOatClass(std::ostream& os, const OatFile::OatClass&oat_class, const DexFile& dex_file,

 278                     constDexFile::ClassDef& class_def) {

 279    const byte* class_data = dex_file.GetClassData(class_def);

 280    if (class_data == NULL) {  //empty class such as a marker interface?

 281      return;

 282    }

 283    ClassDataItemIterator it(dex_file, class_data);

 284    SkipAllFields(it);

 285    uint32_t class_method_idx = 0;

 286    while (it.HasNextDirectMethod()) {

 287      const OatFile::OatMethod oat_method =oat_class.GetOatMethod(class_method_idx);

 288       DumpOatMethod(os, class_def,class_method_idx, oat_method, dex_file,

 289                     it.GetMemberIndex(),it.GetMethodCodeItem(), it.GetMemberAccessFlags());

 290      class_method_idx++;

 291      it.Next();

 292    }

 293    while (it.HasNextVirtualMethod()) {

 294      const OatFile::OatMethod oat_method =oat_class.GetOatMethod(class_method_idx);

 295       DumpOatMethod(os, class_def,class_method_idx, oat_method, dex_file,

 296                     it.GetMemberIndex(),it.GetMethodCodeItem(),it.GetMemberAccessFlags());

 297      class_method_idx++;

 298      it.Next();

 299    }

 300    DCHECK(!it.HasNext());

 301    os << std::flush;

 302   }

304  void DumpOatMethod(std::ostream& os, const DexFile::ClassDef&class_def,

 305                      uint32_tclass_method_index,

 306                      const OatFile::OatMethod& oat_method,const DexFile& dex_file,

 307                      uint32_t dex_method_idx,const DexFile::CodeItem* code_item,

 308                      uint32_tmethod_access_flags) {

 309    os << StringPrintf("%d: %s (dex_method_idx=%d)\n",

 310                        class_method_index,PrettyMethod(dex_method_idx, dex_file, true).c_str(),

 311                        dex_method_idx);

 312    Indenter indent1_filter(os.rdbuf(), kIndentChar, kIndentBy1Count);

 313    std::ostream indent1_os(&indent1_filter);

 314    {

 315      indent1_os << "DEX CODE:\n";

 316      Indenter indent2_filter(indent1_os.rdbuf(), kIndentChar,kIndentBy1Count);

 317      std::ostream indent2_os(&indent2_filter);

 318       DumpDexCode(indent2_os, dex_file,code_item);

 319    }

605  void DumpDexCode(std::ostream& os, const DexFile& dex_file,const DexFile::CodeItem* code_item) {

 606    if (code_item != NULL) {

 607      size_t i = 0;

 608      while (i < code_item->insns_size_in_code_units_) {

 609        const Instruction* instruction =Instruction::At(&code_item->insns_[i]);

 610        os << StringPrintf("0x%04zx: %s\n", i, instruction->DumpString(&dex_file).c_str());

 611        i += instruction->SizeInCodeUnits();

 612      }

 613    }

 614   }

386 std::stringInstruction::DumpString(const DexFile* file) const {

387   std::ostringstream os;

388   const char* opcode =kInstructionNames[Opcode()];

389   switch (FormatOf(Opcode())) {

390     case k10x: os << opcode; break;

546     casek35c: {

547       uint32_t arg[5];

548       GetArgs(arg);

549       switch (Opcode()) {

550         case INVOKE_VIRTUAL:

551         case INVOKE_SUPER:

552         case INVOKE_DIRECT:

553         case INVOKE_STATIC:

554         case INVOKE_INTERFACE:

555           if (file != NULL) {

556             os << opcode << "{";

557             uint32_t method_idx = VRegB_35c();

558             for (size_t i = 0; i <VRegA_35c(); ++i) {

559               if (i != 0) {

560                 os << ", ";

561               }

562               os << "v"<< arg[i];

563             }

564             os << "}, "<< PrettyMethod(method_idx, *file) << " // [email protected]"<< method_idx;

565             break;

566           } // else fall-through

567         case INVOKE_VIRTUAL_QUICK:

568           if (file != NULL) {

569             os << opcode << "{";

570             uint32_t method_idx = VRegB_35c();

571             for (size_t i = 0; i <VRegA_35c(); ++i) {

572               if (i != 0) {

573                 os << ", ";

574               }

575               os << "v"<< arg[i];

576             }

577             os << "},  // [email protected]" << method_idx;

578             break;

579           } // else fall-through

580         default:

581           os << opcode << "{v" << arg[0] << ", v" << arg[1] <<", v" << arg[2]

582                        << ",v" << arg[3] << ", v" << arg[4] <<"}, [email protected]" << VRegB_35c();

583           break;

584       }

585       break;

586     }

art//runtime/utils.cc

379 std::string PrettyMethod(uint32_tmethod_idx, const DexFile& dex_file, bool with_signature) {

 380   if(method_idx >= dex_file.NumMethodIds()) {

 381    return StringPrintf("<<invalid-method-idx-%d>>",method_idx);

 382  }         

 383   const DexFile::MethodId& method_id =dex_file.GetMethodId(method_idx);

 384   std::stringresult(PrettyDescriptor(dex_file.GetMethodDeclaringClassDescriptor(method_id)));

 385  result += '.';

 386   result += dex_file.GetMethodName(method_id);

 387   if(with_signature) {

 388    std::string signature(dex_file.GetMethodSignature(method_id));

 389    if (signature == "<no signature>") {

 390      return result + signature;

 391    }   

 392    result = PrettyReturnType(signature.c_str()) + " " + result +PrettyArguments(signature.c_str());

 393   }     

 394  return result;

 395 }

相關推薦

Oatdump 編譯過程分析

art/oatdump/oatdump.cc 1475int main(int argc,char** argv) { 1476   return art::oatdump(argc, argv); 1477} 1351 static int oatdump(int a

War包編譯過程

官網 我們 過程 size app web項目 sso ise 官網下載 War包反編譯過程 很多人可以將項目編譯為war發布,可是有時候得到war確看不到源碼。今天分享下war反編譯的過程: 1.首先下載一個小工具,在http://jd.benow.ca/官網下載jd

Ardupilot waf編譯過程分析

目錄 文章目錄 目錄 摘要 1.ardupilot為何使用waf編譯,而不使用make? 2.ardupilot如何進行程式碼編譯,下載? 1.編譯程式碼 2.下載程式碼 3 ./waf --help幫助命令

10 uboot的配置及編譯過程分析

uboot的配置及編譯過程分析 uboot的配置過程(make config_uboot): 1.orangepi_sdk目錄下的Makefile: 26 PHONY += config_uboot 27 config_uboot : 28

記錄編譯過程中遇到的問題

1.反編譯過程中遇到如下異常: I: Baksmaling... I: Loading resource table... Exception in thread "main" brut.androlib.AndrolibException: Could not de

Go 編譯過程分析(一) -- 編譯指令碼

http://blog.csdn.net/free2o/article/details/38417293 go 語言最近很火,與時俱進,我也看了看go 的語法。     看起來 go 還是不錯的,有很多新的feature。 就下載了程式碼研究了一下。     go

golang的編譯過程分析

cd . git clone https://github.com/go-errors/errors /Users/YDZ/Ele_Project/clairstormeye/src/github.com/go-errors/errors cd /Users/YDZ/Ele_Project/clair

IDA彙編/編譯靜態分析iOS模擬器程式

轉載自:http://blog.csdn.net/hursing 開刀的類名叫 PluginWidgetIOS,利用lldb可以得到: (lldb) image lookup -r -s PluginWidgetIOS   7 symbo

QBittorrent編譯過程分析

編譯 QBittorrent需要兩個步驟: 1、依賴庫的編譯 2、qBittorrent本身的編譯。 這裡概要講述第二步(很久以前做了第一步,現在忘了。過程很複雜)。 這裡使用的IDE環境是  QtCreator 2.5 , 編譯使用的是VS2010的庫,所以QT版本是

GCC編譯器原理(三)------編譯原理三:編譯過程(2-2)---編譯之語法分析

tails 需要 表達式 一個數 就是 out 和數 margin 操作符 2.2 語法分析 語法分析器(Grammar Parser)將對由掃描器產生的記號進行語法分析,從而產生語法樹(Syntax Tree)。整個分析過程采用了上下文無關語法(Context-free

Android編譯apk逆向分析

Android反編譯apk 反編譯、逆向 軟體下載地址 反編譯、逆向 反編譯 高階語言源程式經過 編譯 變成可執行檔案,反編譯就是逆過程。   但是通常不能把可執行檔案變成高階語言原始碼,只能轉換成彙編程式。   計算機

記一次某App編譯分析

每次尋找漏洞的時候,我都喜歡從抓包開始 噢噢,這裡有點尷尬~~請求和返回的資料都進行了加密處理,這波操作我挺喜歡的,證明人家公司的開發人員還是有點安全意識的,不過沒有關係,他有張良計,我有過牆梯,先反編譯一波看看,使用的工具是 jadx 很明顯,app用了360加固

轉自老羅 Android應用程式資源的編譯和打包過程分析

原文地址   http://blog.csdn.net/luoshengyang/article/details/8744683 轉載自老羅,轉載請說明   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過An

luac 格式分析編譯

前言 測試某遊戲時,遊戲載入的是luac指令碼: 檔案格式 - 010editor官方bt只能識別luac52版本 opcode對照表 - 這個遊戲luac的opcode對照表也被重新排序,unluac需要找到lua vm的opcode對照表,才能反編譯。

Android安卓APK編譯分析、簡單修改內容、二次打包簽名

一、需求:想要修改一個apk裡面一串字串 環境: dex2jar----https://github.com/pxb1988/dex2jar/ JD-GUI----http://jd.benow.ca/ jdk1.8.0環境 二、先反編譯解包分析: (明

UBOOT之分析編譯過程 make

開啟Makefile 117行的config.mk就是前面配置過程中生成的config.mk ,裡面定義了ARCH CPU BOARD SOC 165行是頂層目錄中的config.mk,根據上面四個變數的值確定編譯器、編譯選項等 而在Makefile

《旅行青蛙》編譯/破解過程

[email protected], 小學生 from 10.0.0.55 原文地址: 這篇部落格是應學姐之邀給學弟學妹寫的掃盲教程,較為基礎 前言 破解旅行青蛙的初衷很簡單,女朋友想養青蛙,三葉草長得太慢,作為一名二進位制黑闊又不願屈服於網上小廣告成堆又不知道有沒有後門的破解版,於是就參考

ARM Linux編譯連結過程分析

cmd_vmlinux := arm-iwmmxt-linux-gnueabi-ld -EL-p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_ta

內部類的編譯分析和總結

內部類:是指在類的內部又定義了一個類。根據位置的不同可以分為成員內部類和區域性內部類。 成員內部類 在成員變數的位置定義一個類。 1. 依賴外部類物件存在 2. 可以訪問外部類的成員變數和成員方法。 訪問方式: 1. 直接訪問,直接使用變數

Android應用程式資源的編譯和打包過程分析

   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過Android資源打包工具aapt(Android Asset Package Tool)打包到APK檔案裡面的。在打包之前,大部分文字格式的XML資原始檔還會被編譯