IDA逆向笔记-交叉引用分析(快捷键X)

Posted 千夫长-向往生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDA逆向笔记-交叉引用分析(快捷键X)相关的知识,希望对你有一定的参考价值。

目录

前言

1.IDA功能 - 交叉引用

1.1 正向编译一个exe

1.2 逆向查看汇编

1.3 分析引用关系

 2.总结


前言

为啥IDA学了几个月,还是分析不了代码?心里有些郁闷,今天想到了几个可能性:

1.对IDA的功能了解的不清楚,好比查案不会用指纹提取工具,那么在案发现场就不能通过指纹核对找到曾经来过的人,自然就难以锁定嫌疑人;

2.对于常见语言开发出来的程序,没有进行正向编译,逆向反编译的观察,也就是没有从作案人的角度来制造过现场,一直试图通过现场去推导作案过程,所以,不了解罪犯的警察不是好警察。

针对这两点,后续的学习就往这个方向去努力,目的是掌握逆向工程的技术,这是个陌生的领域,对于一个嵌入式工程师来说,十几年的开发经验都是在建造,逆向是要看清楚这个建筑物的各种结构,推导出建造的方法和目的。不过既然工作有需要,那么就去学吧,随遇而安,干一行爱一行,重要的是学习的能力,每个知识和技能都会串起来,构成自己独特的技术烙印,将来谁招我进公司,都是对这家公司的祝福。

言归正传,针对发现的问题,我捡起之前在腾讯课堂买的课《周哥教IT.逆向分析基础与实战》,之前看软件功能的时候,走马观花,今天开始学第八课,并且运用正向-逆向的方式来深入了解。

1.IDA功能 - 交叉引用

交叉引用这个功能可以看到在某个函数中,用到的数据和子函数的引用。

1.1 正向编译一个exe

举个栗子,拿一个hello.c来编译成exe。

#include <stdio.h>
int read_i;

void prin()

	printf("Hello, World! \\n");

int main()
 
	int i;
   for (i=0;i<100;i++)
   
		prin();
		read_i=i+8; 
   
   getchar();
   return 0;

安装了mingw5.1.6之后,就可以使用命令行编译这个C文件成为一个exe

gcc -o hello hello.c

1.2 逆向查看汇编

在IDA打开,就可以看到生成的汇编代码:

.text:00401304 ; =============== S U B R O U T I N E =======================================
.text:00401304
.text:00401304 ; Attributes: bp-based frame fuzzy-sp
.text:00401304
.text:00401304 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401304                 public _main
.text:00401304 _main           proc near               ; CODE XREF: ___mingw_CRTStartup+F6↑p
.text:00401304
.text:00401304 var_8           = dword ptr -8
.text:00401304 var_4           = dword ptr -4
.text:00401304 argc            = dword ptr  8
.text:00401304 argv            = dword ptr  0Ch
.text:00401304 envp            = dword ptr  10h
.text:00401304
.text:00401304                 push    ebp
.text:00401305                 mov     ebp, esp
.text:00401307                 sub     esp, 8
.text:0040130A                 and     esp, 0FFFFFFF0h
.text:0040130D                 mov     eax, 0
.text:00401312                 add     eax, 0Fh
.text:00401315                 add     eax, 0Fh
.text:00401318                 shr     eax, 4
.text:0040131B                 shl     eax, 4
.text:0040131E                 mov     [ebp+var_8], eax
.text:00401321                 mov     eax, [ebp+var_8]
.text:00401324                 call    __alloca
.text:00401329                 call    ___main
.text:0040132E                 mov     [ebp+var_4], 0
.text:00401335
.text:00401335 loc_401335:                             ; CODE XREF: _main+4C↓j
.text:00401335                 cmp     [ebp+var_4], 63h ; 'c'
.text:00401339                 jg      short loc_401352
.text:0040133B                 call    _prin
.text:00401340                 mov     eax, [ebp+var_4]
.text:00401343                 add     eax, 8
.text:00401346                 mov     ds:_read_i, eax
.text:0040134B                 lea     eax, [ebp+var_4]
.text:0040134E                 inc     dword ptr [eax]
.text:00401350                 jmp     short loc_401335
.text:00401352 ; ---------------------------------------------------------------------------
.text:00401352
.text:00401352 loc_401352:                             ; CODE XREF: _main+35↑j
.text:00401352                 call    _getchar
.text:00401357                 mov     eax, 0
.text:0040135C                 leave
.text:0040135D                 retn
.text:0040135D _main           endp

1.3 分析引用关系

其中,有几个引用,单行摘出来:

1.text:00401304 _main  proc near   ; CODE XREF: ___mingw_CRTStartup+F6↑p
2.text:00401335 loc_401335:        ; CODE XREF: _main+4C↓j
3.text:004012F0 _prin           proc near    ; CODE XREF: _main+37↓p
4.bss:00404068 _read_i         dd ?          ; DATA XREF: _main+42↑w

1 _main是一个被调用的函数,调用者是__minggw_CRTStartup正偏移F6字节的位置,是一个函数(procedure)调用;

2 _loc_401335是个本地标号,在_main函数偏移4C位置的跳转调用;

3_prin是个远程调用,调用者是_main,在偏移量是37的位置被调用,是个函数调用

4在数据段,有个数据_read_i,是个数据调用,在_main的第42行被调用(ox00401346-0x00401304);

然后有一个快捷键X,可以在这些函数和数据被光标点中后,弹出这些引用关系,比如我点上面的prin函数,出来这个:

最重磅的功能是function calls这个功能,在某个函数中点一下光标,再点击views-->Open subsviews-->Function Call,就可以看见当前函数是被谁调用的,以及这个函数调用了哪些函数。

 C函数和对应的汇编指令在一个同框查看:

在汇编代码窗口,按下F5,启动反C功能,得到反汇编成C的代码:

int __cdecl main(int argc, const char **argv, const char **envp)

  void *v3; // esp
  int i; // [esp+4h] [ebp-4h]

  v3 = alloca(16);
  __main(16);
  for ( i = 0; i <= 99; ++i )
  
    prin();
    read_i = i + 8;
  
  getchar();
  return 0;

 2.总结

这个交叉引用X,可以看到程序的走向和调用情况,对于了解程序有很大的帮助,真的就像是提取指纹,比对知道谁来过,结合F5唤起的Hex-rays神器,对于我们读懂程序,起到了很大的帮助。

继续比喻,这个F5就是高智商神探在案发现场,脑海中浮现的犯罪过程,是不是很神奇?

以上是关于IDA逆向笔记-交叉引用分析(快捷键X)的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向IDA 工具使用 ( 交叉引用数量设置 | 调试设置 )

使用IDA Pro的REobjc模块逆向Objective-C二进制文件

逆向中静态分析工具——IDA初学者笔记

逆向中静态分析工具——IDA初学者笔记之字符串分析

IDA快捷键整理

Android逆向笔记-通过tracerPid对抗IDA调试