[系統安全] 三.IDA Pro反彙編工具初識及逆向工程解密實戰

您可能之前看到過我寫的類似文章,爲什麼還要重複撰寫呢?只是想更好地幫助初學者瞭解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列。因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系統,更加深入,也是作者的慢慢成長史。換專業確實挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學到什麼程度,漫漫長征路,偏向虎山行。享受過程,一起加油~

系統安全系列作者將深入研究惡意樣本分析、逆向分析、攻防實戰和Windows漏洞利用等,通過在線筆記和實踐操作的形式分享與博友們學習,希望能與您一起進步。前文作者普及了逆向分析基礎知識,告訴大家如何學好逆向分析,並給出呂布傳遊戲逆向案例。這篇文章將詳細講解IDA Pro反彙編工具的基礎用法,並簡單講解一個EXE逆向工程解密實戰方法,希望您喜歡。

話不多說,讓我們開始新的征程吧!您的點贊、評論、收藏將是對我最大的支持,感恩安全路上一路前行,如果有寫得不好的地方,可以聯繫我修改。基礎性文章,希望對您有所幫助,作者的目的是與安全人共同進步,加油~

作者的github資源:

前文分析:


聲明:本人堅決反對利用教學方法進行犯罪的行爲,一切犯罪行爲必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家瞭解它們背後的原理,更好地進行防護。(參考文獻見後)


一.IDA Pro工具簡介及初識

1.IDA Pro簡介

IDA Pro(Interactive Disassembler Professional)簡稱“IDA”,是Hex-Rays公司出品的一款交互式反彙編工具,是目前最棒的一個靜態反編譯軟件,爲衆多0day世界的成員和ShellCode安全分析人士不可缺少的利器。IDA Pro具有強大的功能,但操作較爲複雜,需要儲備很多知識,同時,它具有交互式、可編程、可擴展、多處理器等特點,可以通過Windows或Linux、MacOS平臺來分析程序, 被公認爲最好的逆向工程利器之一。

IDA Pro已經成爲分析敵意代碼的標準並讓其自身迅速成爲攻擊研究領域的重要工具。它支持數十種CPU指令集其中包括Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051等等。

在這裏插入圖片描述


2.IDA Pro新建工程

IDA Pro是點擊下一步傻瓜式安裝,安裝成功會後會顯示兩個運行程序“IDA Pro(32bit)”和“IDA Pro(64bit)”,分別對應32位和64位程序的分析。IDA支持常見的PE格式,DOS、UNIX、Mac、Java、.NET等平臺的文件格式。

下面講解首次打開IDA Pro的流程。

第一步:打開IDA Pro32軟件

雙擊exe文件彈出如下圖所示的“Support message”界面,點擊OK按鈕。

在這裏插入圖片描述

第二步:新建一個文件

IDA包括三種加載文件的方式,其中“New”是新建打開一個標準文件的對話框,“GO”是運行打開一個空白工作,用戶將要分析的文件拖入分析,“Previous”是選擇最近一次使用過的文件。

在這裏插入圖片描述

第三步:選擇一個exe文件載入,它將是我們要進行分析的程序

作者通過C語言寫了一段代碼,並在本地生成一個“test01.exe”文件,它就是接下來分析的可執行文件。

#include<stdio.h>
int main()
{
   
      
	printf("Hello World!!!\n");
	return 0;
} 

選擇要導入的文件。

在這裏插入圖片描述

第四步:裝載PE文件
在“Load a new file”窗口中選擇裝載PE文件,包括text(代碼塊)、data(數據塊)、rsrc(資源塊)、idata(輸入表)和edata(輸出表)等,也可以載入二進制文件。

在這裏插入圖片描述

IDA反彙編包括兩個階段,首先將程序的代碼和數據分開,分別標記函數並分析參數調用、跳轉、指令關係等;接着如果IDA能識別文件的編譯類型,就裝載對應的編譯器特徵文件,給各函數賦名。同時,IDA會創建一個數據庫,其組件分別保存在“.id0”、“.id1”、“.nam”和“.til”的文件裏。

接着彈出確認窗口,可以選擇“Don’t show this message again”選項。

在這裏插入圖片描述

第五步:在“Check for Hex-Rays product updates”中點擊“OK”
在接下來彈出的Hex-Rays信息框再點擊OK後,會要求設置更新選項,這裏直接點擊OK,默認即可。

在這裏插入圖片描述

第六步:顯示運行結果
此時,運行結果如下圖所示,接着可以開始我們的逆向分析。

在這裏插入圖片描述

IDA View顯示如下圖所示:

在這裏插入圖片描述

Hex View十六進制顯示如下圖所示:

在這裏插入圖片描述

下圖可以看到代碼中的“hello world!!!\n”。

在這裏插入圖片描述

第七步:查看源代碼
按下F5能夠查看對應的源代碼。

在這裏插入圖片描述

第八步:關閉IDA Pro並保存數據庫文件
保存IDB數據庫文件至本地,它記錄了用IDA Pro對該程序分析中的工作狀態,包括反彙編分析、區段掃描、用戶自定義結構、用戶自定義名稱、註釋等信息。點擊右上角的關閉按鈕,彈出IDA Pro保存數據庫窗口(Save Database),使用默認選項,直接點擊OK即可以保存生成數據庫(.idb)文件。

在這裏插入圖片描述

下次載入時,可以直接加載數據庫文件,獲取之前分析的狀態。

在這裏插入圖片描述


二.IDA Pro工具基本用法

IDA Pro工具打開的主界面如下圖所示:

在這裏插入圖片描述

IDA View窗口

該窗口顯示如下圖所示:

在這裏插入圖片描述

它是通過點擊“View”中“Open subviews”->“Disaassembly”調出來的。

在這裏插入圖片描述

IDA View包括兩種瀏覽模式,一種是Text View,一種是Graph View,右鍵能夠相互跳轉。

在這裏插入圖片描述

在這裏插入圖片描述

如下圖所示,變換成另一種模式。

IDA View主要包括三個區域:

  • 地址區: PE文件加載到內存後的虛地址爲準,鏡像地址+偏移地址,如0x00401000
  • OpCode操作區: 該部分默認因此,需要Options->General->設置Number of opcode bytes爲8顯示出來,它是16進制數
  • 反編譯代碼區: IDA主功能區域,能高亮顯示,雙擊函數或變量名能跳轉對應的地址。

在這裏插入圖片描述

在這裏插入圖片描述


Hex View窗口

顯示16進制,默認爲只讀狀態,可以用快捷鍵F2對數據區域(綠色字符區域)在只讀和編輯兩種狀態切換。

在這裏插入圖片描述

Strings窗口

IDA的View有幾個按鈕對定位代碼很重要,如下圖所示:

在這裏插入圖片描述

  • Open exports window 打開導出窗口
  • Open import window 打開導入窗口
  • Open names window 函數和參數的命名列表
  • Open functions window 程序調用的所有函數窗口
  • Open strings window 打開字符串顯示窗口

這裏作者點擊Strings顯示程序中所有字符串,該窗口有助於你通過程序的運行輸出逆向找出對應的代碼片斷,如下圖的字符串及對應的Address。

在這裏插入圖片描述

雙擊String跳轉IAD View頁面,如下圖所示的地址,單擊會高亮。

在這裏插入圖片描述

其他窗口:

  • 導出/入窗口:導出窗口列出文件的入口點,導入窗口列出由被分析的二進制文件導入的所有函數
  • 函數窗口:函數名稱,區域,起始位置,長度,描述函數的標記
  • 結構體窗口:分析數據結構,雙擊數據結構名稱展開,查看詳細布局
  • 枚舉窗口:enums可列舉,定義枚舉類型
  • 段窗口 segmentation:段的簡單列表

文件類型

IDA會創建一個數據庫,名爲IDB文件,它由四個文件組成。

  • id0:二叉樹形式的數據庫
  • id1:程序字節標識
  • nam:Named窗口的索引信息
  • til:給定數據庫的本地類型定義的相關信息

在這裏插入圖片描述


三.IDA Pro逆向工程實戰

1.代碼加密

前面第一篇 博客 講解音樂文件通常採用異或加密,接下來作者通過C語言簡單編寫了一段加密代碼,如下所示:

#include<stdio.h>
#include<string.h>

int main()
{
   
         
	int i;
	int len;
	char key[20];
	char res[20];
	char *num = "eastmount";     //密鑰 
	char *right = "123456789";   //正確值 
	
	//請輸入正確的密碼
	printf("please input the key:");
	scanf("%s", &key);
	
	//判斷
	len = strlen(key);
	if(len<6 || len>10) {
   
         
		printf("Error, The length of the key is 6~10\n");
	} 
	else {
   
         
		//加密
		for(i=0; i<len; i++) {
   
         
			res[i] = (key[i]^num[i]); //異或加密 
		}	 
		//printf("%s\n", res);
		if(strcmp(res, right)==0) {
   
         
			printf("You are right, Success.\n");
		} else {
   
         
			printf("Error, please input the right key.\n");
		}
	}
	
	return 0;
}

輸入長度不在6-10之間反饋錯誤“Error, The length of the key is 6~10”,輸入錯誤反饋“Error, please input the right key.”,正確的key才顯示正確信息“You are right, Success.”。

在這裏插入圖片描述

在這裏插入圖片描述

接下來我們通過IDA Pro工具解密這個EXE文件,嘗試獲取Key值。


2.逆向解密

第一步:按照第一部分步驟向IDA Pro中導入文件
顯示的調用程序如下圖所示。
在這裏插入圖片描述

在這裏插入圖片描述

樹形圖把條件分支清晰地顯示出來了,左下角有IDA視圖的縮略圖。在上面點擊可以快速定位到視圖的指定位置,並且各個部分都有詳細的代碼信息 ,比如定義的兩個變量及偏移位置。

在這裏插入圖片描述

第二步:查看字符串顯示窗口
IDA Pro工具中菜單欄的View有幾個按鈕對定位代碼很重要,如下圖所示:

  • Open exports window 打開導出窗口
  • Open import window 打開導入窗口
  • Open names window 函數和參數的命名列表
  • Open functions window 程序調用的所有函數窗口
  • Open strings window 打開字符串顯示窗口

在這裏插入圖片描述

這裏作者點擊Strings顯示程序中所有字符串,該窗口有助於你通過程序的運行輸出逆向找出對應的代碼片斷,如下圖的字符串及對應的Address。

在這裏插入圖片描述

雙擊String跳轉到如下圖所示的地址,單擊會高亮。

在這裏插入圖片描述

第三步:查看源代碼
在如下圖所示界面中按下F5鍵可以顯示源代碼。

在這裏插入圖片描述

顯示的源代碼如下所示:

int __cdecl main(int argc, const char **argv, const char **envp)
{
   
          
  char Str1[32]; // [esp+38h] [ebp-50h]
  char Str[40]; // [esp+58h] [ebp-30h]
  int v6; // [esp+80h] [ebp-8h]
  int i; // [esp+84h] [ebp-4h]

  __main();
  printf("please input the key:");
  scanf("%s", Str);
  v6 = strlen(Str);
  if ( v6 > 5 && v6 <= 10 )
  {
   
          
    for ( i = 0; i < v6; ++i )
      Str1[i] = gcc2_compiled_[i] ^ Str[i];
    if ( !strcmp(Str1, "123456789") )
      printf("You are right, Success.\n");
    else
      printf("Error, please input the right key.\n");
  }
  else
  {
   
          
    printf("Error, The length of the key is 6~10\n");
  }
  return 0;
}

注意,該部分代碼與之前寫的C語言代碼略有不同,比如之前判斷長度 if(len<6 || len>10) 提示錯誤,而這裏是 if ( v6 > 5 && v6 <= 10 ) 正確執行,else顯示錯誤。

在這裏插入圖片描述

這段代碼的基本邏輯是輸入字符串Str,然後循環與gcc2_compiled_變量異或加密,輸出爲Str1變量,當加密後的Str1變量值爲“123456789”則解密成功,否則失敗。
那麼,gcc2_compiled_變量的值是多少呢?

第四步:定位核心代碼
接着選中gcc2_compiled_變量,當它變高亮雙擊之後會跳轉到對應的頁面。

在這裏插入圖片描述

原來如此,它的密鑰是“eastmount”,加密結果是“123456789”。

在這裏插入圖片描述

第五步:逆向解密
最後撰寫解密代碼,實現逆向解密,“eastmount” 異或輸入代碼Str,並且值等於123456789,則可以成功顯示。

#include<stdio.h>
#include<string.h>

int main()
{
   
          
	int i;
	int len;
	char res[9];
	char *num = "eastmount";     //密鑰 
	char *right = "123456789";   //正確值 
	
	
	//判斷 TS@@XYBVM
	len = strlen(num);
	for(i=0; i<len; i++) {
   
          
		res[i] = (right[i]^num[i]); //異或加密
	}
	res[i] = 0;
	printf("The right key is: %s\n", res);
	return 0;
}

解密結果如下圖所示:

在這裏插入圖片描述

注意,IDA Pro本地 創建的文件如下圖所示。

在這裏插入圖片描述


四.總結

寫到這裏,這篇基礎性文章就敘述完畢,安全要學習的知識真的很多,涉及面很廣,包括彙編、網絡、操作系統、加密解密、C/C++、Python等。希望自己能慢慢進步,科研與實踐並重,也希望讀者喜歡這系列總結筆記。不喜勿噴,與你同行~

三年前你在敦煌日出前寫下“璋娜”,而今天我寫了封情書作爲禮物,三張薄紙,道不出無數思戀。武漢美,武大更美,但我知道此行的目的,是來求知,來充電的,吾家有女初成長,早日學成團聚纔是我的歸屬。深夜寫的博客,記錄今天IDA Pro學習心得,一起加油。

今天剛好CSDN粉絲破十萬,真心感謝大家這些年來的陪伴和支持,感恩認識您,也希望未來能繼續分享更高質量的文章,幫助更多人入門和解決爲題,寓教於樂,共勉!

在這裏插入圖片描述

2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大數據分析、網絡空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享論文的算法實現。娜璋之家會更加系統,並重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝。

在這裏插入圖片描述

(By:Eastmount 2020-12-17 星期四 晚上10點寫於武漢 https://blog.csdn.net/Eastmoun)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章