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就是高智商神探在案发现场,脑海中浮现的犯罪过程,是不是很神奇?

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员熊子峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值