首页 > 技术文章 > IDA教程01_基础(06-10)

debugskill 2017-07-18 17:07 原文

ZC: 貌似 所有的传递参数的顺序 都是 从右至左?WHY?

 

6、

 "Hex View"窗口

  【200】"IDA View-A"(Grpah view)和"Hex View-A"窗口  的信息是联动的

  【275】ESP,offset 对应的 16进制 数据  【300】滚动"IDA View-A"(Grpah view)里面的代码时,"Hex View-A"里面的信息也会随之滚动 (ZC: 没看到滚动啊...可能是 这一个函数里面的代码太少了?)

    ZC: 我现在的IDA,"IDA View-A"和"Hex View-A" 的滚动 等操作都是对应的

    【370】"IDA View-A"和"Hex View-A" 的右击 都会有 "Synchronize with"--> "√ Hex View-1"/"√ IDA View-A"的选项 (ZC: 可以将这里的"√"取消掉,就不会联动了)

  【595】call 就是 0xE8  【615】ZC: 0x104C0+5+0x84 ==> 0x10550,call指令(32位)一共5个字节(0xE8+偏移)

 【680】Exports窗口    导出

  【745】列举出所有文件中的入口点 (ZC: 程序用到的 非系统的dll文件的入口点也列举出来了吗?)

    【850】IDA将会取名为start

    【925】双击"Exports窗口"中的某一个项,来到"Hex View"窗口 或 "IDA View"窗口

 【1190】Imports窗口

  【1315】可以见到是从哪个dll导入的

  【1525】WDK查 KdPrint 、DbgPrint

  【1900】Imports窗口 里面的 一大堆的问号 什么意思:由于被导入的代码位于共享库中,GetModuleHandle 由Kernel32.dll导出 (ZC: 我擦,没解释啊...)

  【2040】双击"DbgPrint" 来到 "IDA View"窗口中相关位置,DbgPrint函数 是在 段".idata"中

    【2180】而 导出函数GsDriverEntery 是在 段"INIT"中

  【2300】Imports窗口 的 列"Library" 有时候分析不出来,有可能会显示 问号"?"

 【2440】Functions窗口  用于列出数据库里面每个函数。函数的名称 并不列出IDA自动生成的名称,比如说 sub_xxx / loc_xxx 等

  【2650】双击"_DbgPrint" 来到 "IDA View"窗口,看到 "jmp ds:__imp__DbgPrint",意思是 导入表里面的函数 DbgPrint (ZC: ! !)

  【2745】Functions窗口 中 列"R",就是说 它要返回它的调用方,并且使用EBP寄存器,列"B" 就是显示 它使用EBP寄存器  【2840】用EBP来使用局部变量

  【2995】双击 函数"GsDriverEntry"  【3005】ZC: 看到 双击函数"_DbgPrint"后 来到"IDA View",函数"_DbgPrint" 确实未使用EBP  【3020】右击 "IDA View"中"__imp__DbgPrint",选择"编辑函数..."

 【3045】Structures窗口   显示IDA在二进制文件中使用任何复杂结构的数据。比如C的结构/联合

  【3090】在分析阶段,IDA会查询它的函数类型 包括它的扩展库 ex就是扩展库,设法将函数类型 和 程序使用的内存匹配起来

  【3180】IDA认为我们使用了 STRUCT KSYSTEM_TIME,为什么IDA会得出这样的结论?【3225】有很多原因:... ... ... ... ZC: 大概是说IDA判断出 程序使用了该结构

  【3355】Functions窗口 定位 DriverEntry函数 (ZC: 估计是想找程序使用 KSYSTEM_TIME的地方,但是没找到)

  【3430】每一个 块(ZC: 代码块/程序块?)内部,显示的 Structures信息可能是不同的  ZC: 【3485】貌似是他没有网上滚动鼠标,才得出上面的错误结论

  【3520】Structures窗口 的用途主要有2中:(1)、【3523】... ... ZC: 讲了什么没懂...说后面还会讲;(2)、ZC: 是说 反汇编中可以自定义结构体?

 【3625】Enums窗口   有点类似于 Structures窗口

  ZC: 这个听得也是不是太明白...

 

  【完毕,但是有不懂的点】

7、

  其它窗口

  【205】Sections窗口  (View -->Open subviews-->Segments)

  【350】签名 窗口  【475】什么是签名

    【700】点击按钮"立即添加签名"--> 签名列表

    【800】签名的用途:给自己代码的提醒(ZC: 没明白什么意思...)  自己加识别

  【900】"Type libraries"窗口

    【955】在概念上和 签名窗口 是类似的

    【970】保存IDA基类的一些信息。积累IDA从常用的编译器的头文件当中搜索到相关的数据类型和函数的类型信息。【1025】通过处理头文件,进行代码的响应的注释。【1050】同时IDA还可以从头文件中 了解出更复杂的结构和大小的布局。所有的信息都搜集在?.til文件中

    【1170】ZC: 巴拉巴拉一堆,没怎么听明白...

    【1240】"Type libraries"窗口,按下 Insert键,可以插入其它库

      【1310】这样就可以插入我们需要的 头文件 或者 库(ZC: 头文件也能插入?)

 

  【1390】函数调用窗口"Function calls"  和 "Functions窗口" 不一样

    【1460】在任何程序中...  【1510】这样的图形叫做 函数的调用图 / 调用树  【1600】ZC: "临近"?

    【1740】显示了 HelloDDKUnload 调用的函数

    【1800】DriverEntry 被谁调用了,以及 调用了谁

  【1910】Question窗口  ZC: 明明显示的是 "Problems"窗口,我的IDA中也是"Problems"(List of Problems)

    【1960】IDA在反汇编二进制文件的时候 遇到的一些困难,以及它是如何处理这些困难的。

      【2070】这两什么意思 IDA也不知道,需要你来分析

     【2280】可以看 IDA完整的文档,一般我们不用管这个窗口,这是最少用到的窗口

  【2325】记事本窗口  没太大作用

  【2310】所有窗口小结

  【完毕,有不明白之处】

8、反汇编 导航

 双击导航

  【1180】IDA中所有的名称 都可以导航。KeTickCount(...)函数处,双击 就来到 KeTickCount(...)函数 的代码部分了  (ZC: 跳过来了,怎么跳回去?ESC键?我的IDA里面试了一下 ESC键是可以的)

    【1380】上面 这就是 双击导航 的一个例子

  【1500】"loc_1069C" 这个就是 标号。每个标号 都是IDA给它命名

    【1560】双击任何一个标号,都会转到相应的位置

  【1700】潜在导航目标:(1)、交叉引用 (2)、函数名称 (3)、小箭头  (【1745】双击一下 就能来回的跳)

  【1930】ZC: 貌似是说 双击"Hex view"窗口中的相应部分,也能实现跳转。但是,我没有尝试成功...

  【2270】IDA导航 和 IDA消息窗口的关系

    【2330】函数名称 / 标号,如果出现在一条信息的开头的位置,双击信息 也能实现跳转来到函数的内部

 

 跳转到地址(导航)

  【2455】ZC: 这个窗口 "Choose address to jump",是怎么出现的?

  【2770】Names窗口  找相应的函数

  【2830】IDA的搜索的功能

    【2895】IDA反汇编窗口--> 键盘按"G" --> 直接跳转到你想要去的虚拟地址

    【3110】IDA-->菜单栏-->Jump --> Jump to operand    不对。

      应该是 IDA-->菜单栏-->Jump --> "Jump to address..."

      【3170】ZC: 这里 可以看一下 各种跳转菜单 的中英文翻译

    【3220】跳转到前一位置    -->  快捷键:ESC

        跳转到下一位置    -->  快捷键:Ctrl+Enter

  【完毕,有疑问】

9、

  【675】stack frame  栈帧

  【1670】栈帧 又叫做 激活记录

  【1950】

1。先要保护现场
2。将参数按照调用约定放在被运行栈帧上,这样这个栈帧的栈顶指针就会发生改变
3。如果有必要,调用函数会配置一个栈指针,保存调用方希望保持不变的内容(寄存器值)
4。被调用函数为它可能需要的任何局部变量分配配空间,需要栈帧栈顶向上(-操作)开辟地方
5。被调用函数返回值存放在EAX或者存放在可以立即被调用到的地方
6。一旦函数完成其他操作,任何局部变量都释放了
7。调用地方如果重新获得控制权,删除在栈中开辟的空间(+操作)
8。完成“序言(3,4)”“过程(5,6)”“尾声(6,7)”

 

 调用约定

  【3890】C的调用约定_cdecl(参数从右向左一次入栈),清理方式:调用者清理(“老子”清理“儿子”)

    【4315】对于参数可变化的:printf("XXXXX");

      【4490】ZC: 他的意思是说 _cdecl对于参数可变的函数来说更加方便,主要是在清理堆栈方面更方便(传参顺序没有方不方便可言):∵ printf被调用的时候 无法知道自己被传入了几个参数,但是调用者 却很清楚自己传递了几个参数,于是调用者清理堆栈就很容易。

  【5260】

标准调用_stdcall
VOID demo_stdcall(int w,int x,int y,int z)

  【5720】 _fastcall ==> _stdcall的变体

快速调用_fastcall
VOID demo_fastcall(int w,int x,int y,int z)
前两个(ECX=W,EDX=x)参数将被分配给ECX,EDX
剩下的都被按照_stdcall调用约定
ret 8

  【6420】

C++调用约定
使用this指针
VC提供了 thiscall调用,将this传递给而ecx
GC++中被当做静态,存放在栈顶(ZC: 这个"GC++"是指gcc? "存放在栈顶"是指参数全部push完后 再push this指针?)

  【7070】还有 其它调用约定。一般用不到,除非是写 ShellCode,漏洞之类的,才会用到 其它调用约定。

  【完毕】

 

10、

  【145】vs2008  【235】Wn32 console程序 Demo_stackframe  空项目

  【3580】用IDA分析该exe

  【3785】通过 Names窗口 找到函数  ZC: 没找到什么函数...

  【3818】Functions窗口   【3835】找到main函数

 

  【完毕】

 

ZZZ

 

推荐阅读