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資原始檔還會被編譯