IDA为反汇编 和逆向破解的 静态分析利器 ! 虽然是利器,但是你不会用的话~那就另当别论了。

      唉。对于刚入门的新手来说,看前人走过的路程,往往是自己进入大门的捷径!所以,我就把我的 读书笔记 分享给大家。 


希望对 刚入门的新手 有所帮助。  自己认真的研究,和钻研!

PS: 为了防止有些童鞋,看也不看直接 复制起来,然后就忘记了。 我每次只发布100页的读书笔记!】

PS: 注意事项: Mark为最终标记页;Question为困难页;PG为页码】


----------------------正文--------------------

100页 ,重新建立 读书笔记!

Mark: 91           

Question:27;


PG:19
1.动态分析(dynamic analysis)[dai'n?mik]

2.静态分析(static analysis)

3.开发破解程序(exploit  )['ekspl?it, ik's-]

4.可移植可执行文件(Portable  Executable)PE ['p?:t?bl]['eksikju:t?bl]

5.可执行和链接格式(Executable and linking format) ELF

6.汇编语言源代码"主要"采用两种语法: AT&T语法和Intel语法。

PG:21
7.{AT&T 操作数 , 目的操作数

 Intel 目的操作数, 操作数}

8.反汇编算法
{
a.线性扫描(linear sweep)['lini?] [swi:p] 
b.递归下降(recursive descent) [ri'k?:siv]  [di'sent]  

}

9.指令集(MIPS)

10.大端(big endian)小端(little endian)
CPU首先储存一个多字节值的最高有效字节,称CPU为大端。否则 则反

PG:22
11.线性扫描算法无法正确地将嵌入的数据与代码区分开来。

PG:24
12.指针的启发(heuristics)
heuristics [hju?'ristiks]
基本翻译
n. 启发法;启发式教学法
网络释义
heuristics:试探法 | 启发法 | 启发式
Heuristics(启发)Heuristics就是指在入侵检测中使用AI(artificial intelligence,人工智能)

PG:26
13. MS-DOS的可执行文件头 Mark Zbikowski马克茨柏克沃斯基 (EXE执行档的档头“MZ”两字(16进位码为4D5A))

14.去除二进制可执行文件的符号工具:strip

15.CYGWIN环境(可使在Linux编写的程序在Windows下编译和执行了)

PG:29
16.PE Sniffer 可以确定程序的 编译方法 和 是否使用模糊技术。

17.二进制文件模糊技术:模糊(obfuscation)掩盖程序的真实意图。

18.nm常用的符号
{
U,未定义的符号,通常为外部符号引用。
T, 在文本部分定义的符号,通常为函数名称。
t, 在文本部分定义的局部符号。在C程序中,这个符号通常等同于一个静态函数。
D, 已初始化的数据值。
C,未初始化的数据值。
}
(大写字母表明 全局符号,小写表示 局部符号)

PG:32
19.工具ldd(list dynamic dependencies)【列出动态链接库】
Linux 和 BSD 提供ldd, OS X系统用 otool (otool -L 文件名) ,Windows用dumpbin( dumpbin /dependent文件名)

20.工具objdump
依靠二进制文件描述符库libbfd,分析(ELF/PE)
   工具readelf 
也可分析(ELF文件)但不依赖libbfd

21.工具 C++filt
将每个输入的名称看成改变后的名称(mangled name) ['m??l]  vt. 乱砍;轧布;损坏
如果 名称为合法的改编名称,呢就输出改编之前的原始名称。 如果 不是合法的名称,就按照原样输出该名称。


PG:35
22.工具Strings
专门提取文件中的字符串内容
(-a 扫描整个文件/ -t 显示每个字符串的文件偏移信息量/ -e 可以搜索更广泛的字符,如16位的unicode字符)

PG:36
23.PE.ELF.MACH-O 可分别使用dumpbin, objdump ,otool进行反汇编.

24.基于X86指令集的流式反汇编器(stream disassembler)disassembler [,dis?'sembl?]disassembler:反汇编器 | 反汇编 | 反汇编程序
{
 1.ndisasm --Netwide Asssembler(NASM)中的工具 /(由Metasploit框架生成的shellcode)
 2.diStorm

用来分析网络封包中的 shellcode 和 未知格式的ROM镜像,因为 ROM中有些是 数据,有些是 代码。

}


PG:38
25. IDA交互式反汇编器(Interactive Disassembler Professional)


26.已命名许可(named license)

PG:43
27.IDA的目录结构
{
a. cfg(配置文件)
b. idc(包含IDA内置脚本语言IDC所需的核心文件)
c. ids(目录包含一些符号文件【IDA语法中的IDS文件】,这些文件用于描述可被加载到IDA的二进制文件引用的共享库的内容,包括 函数所需参数的数量,信息和返回类型。)
d. loaders(目录用于识别和解析PE或ELF等已知文件格式的IDA扩展)
e. plugins(目录包含IDA所需的插件)
f. procs(目录包含IDA版本所支持的处理器模块,处理器模块为IDA提供机器语言-汇编语言转换功能)
g. sig(目录包含IDA在各种模式匹配操作中利用的现有代码的签名)
h. til(目录包含一些类型库信息,IDA通过这些信息记录特定于各种编译器库的数据结构的布局)
}

PG:48
28.IDA显示“欢迎对话框” 打开注册表【DisplayWelcome =1】
Windows下(HKEY_CURRENT_USER\Software\Hex-Rays\IDA) || 其他系统 ($Home/.ida.cfd)

29.Previous (历史记录 修改idagui.cfg/idatui.cfg提升到100)

30.Windows PE加载器(pe.ldw)和 MS-DOS EXE加载器(dos.ldw)
[PE格式是MS-DOS EXE文件格式的扩展形式]

31.Processor Type(处理器类型)
(IDA根据他从可执行文件的头中读取到 信息,选择合适的处理器类型)

32.如果选择Binary file和X86处理器 
{
a.Loading Segment(加载段)和Loading Offset(加载偏移量)字段将处于活动状态。

b.如果忘记基址,可以使用 Edit->Segments->Rebase->Program来修改IDA镜像的基址。
}

33.Kernel Options(核心选项)
(IDA可利用这些选项改进 递归下降过程)

34.Processor Options(处理器选项)
(它只能为反汇编过程提供有限的帮助,因为这些选项非常依赖于用户选定的处理器模块,以及模块创建者的编程能力)

PG:50
35.需要选择Binary file的情况:
{
1.分析从网络数据封包
2.日志文件提取出来的ROM镜像
3.破解程序负载
}

36.同时选择 Binary file和X86处理器 
(IDA无法获得可用的文件头信息,用户需要制定是将代码作为16位模式代码,还是32位模式代码处理)
(IDA还能够为ARM和MIPS等处理区分16bit与32bit模式)

PG:52
37.IDA会创建一个数据库 组件保存在4个文件中,扩展名为
{
a. .id0 二叉树形式的数据库
b. .id1 描述每个程序字节的标记
c. .nam 包含与IDA的Named窗口中显示的给定程序位置有关的 索引信息。
d. .til 用于储存与一个给定数据库的本地类型定义有关的信息。
} (IDA专用,IDA以外的环境很难对他们编辑)
【这4个文件会被存档为IDB文件,如果数据库正常关闭,绝对不会看见 id0,id1,nam,til文件】


38.IDA发现一个程序数据库(Program Database,PDB)
(导入文件损坏时,请清除make improts sectiong(创建导入节)复选框,重新加载该文件)


39.数据库发现信息
{
a.编译器识别(了解软件所使用的 编译器)
b.函数参数和局部变量识别(对每一个识别的函数,IDA会详细分析栈指针寄存器的行为,以确定栈内的变量,并理解函数栈帧的布局,然后IDA会根据这些变量的用途,自动为他们生成名称)
c.数据类型信息(利用公共函数库,IDA会在数据库中添加注释,以指明向这些函数提交参数的位置)【会检索各种API参考资料才能获得】
}

PG:53
40.关闭IDA数据库
(任何时候关闭IDA,都会显示 Save database(保存数据库))
{
a. Don't pack database(不打包数据库)
b. Pack database(Store) (打包数据库(储存))
c. Pack database(Delflate)(打包数据库(压缩))
d. Collect Garbage(收集垃圾)
e. Don't save the database(不保存数据库)

PG:55
41.IDA桌面介绍
{
a. View->Toolbars(显示或隐藏工具栏)
b. Options->Colors彩色水平带(导航带)
c. View->Open Subviews(打开其他数据显示窗口)
d. Options->General->Use Graph View by Default(默认以视图形式打开)
e. Message(消息窗口,显示IDA输出的信息:进程有关的状态消息,以及由用户操作导致的错误信息。)==控制台输出设备
f. Name/String(数据显示窗口)
}


42.IDA中可以分析的标志
{
a. You may start to explore the input file right now(现在可以开始研究输入文件了)
b. The initial autoananlysis has been finished(初始分析已经完成)
}


PG:59
43.IDA桌面提示和技巧
{
a. IDA的显示而言,屏幕越大越好
b. View->Open Subviews(回复你无意关闭的数据显示窗口)
c. Windows->Reset Desktop(可迅速将桌面恢复到原始状态)
d. Windows->Save Desktop(保存用户设置的桌面布局)
e. Windows->Load Desktop(读取用户储存的桌面布局)
f. Open->Font(修改字体)Disassembly( [,dis?'sembli] n. 拆卸;分解)
}

PG:60
44.IDA的基本规则
{
a. 不提供撤销功能指令
b. 几乎所有的操作都有与其对应的菜单项、热键和工具栏按钮。
c. IDA提供方便的、基于上下文的鼠标右键操作菜单。
}


45.IDA对二进制文件分析时,会创建8个窗口。
{
a. 3个立即窗口(IDA-View窗口,Named窗口和消息输出窗口)
b. 反汇编窗口(基本块不包括分支,从头执行到尾的最大指令序列,入口【块的第一条指令】和出口【块的最后一条指令】)
  (基本块的第一条指令通常是分支指令的目标,而最后一条指令则是分支指令)
   (绿色:执行分支;红色;不执行分支;蓝色:指向下一个块)
}


PG:63
46.控制图形视图显示方式
{
a. 平移(鼠标拖动,你会我会大家会)
b. 重新调整块的位置(单击指定块的标题栏,可以移动其位置;拖动连接线的顶点,可以手动改链接线的路径。在按下Shift键的同时,双击连接线的任何位置,即可在此位置添加新的顶点。)
c. 分组和折叠块(可以对块分组,单独分或者与其他块分在一组;并折叠起来,减少显示的混乱程度。折叠块特别有用;菜单上选择“Group Nodes”)
d. 创建其他反汇编窗口(View->Open->Subviews->Disassembly)
}


47.IDA显示其他次要信息
(IDA隐藏了许多与反汇编有关的更加传统的信息【如虚拟地址信息】,以减少显示每个基本块所需的空间)
(Options->General命令打开IDA常规选项)


48.虚拟地址的显示(以【区域名称】:【虚拟地址】如 .text:00001540)


49.箭头窗口(实线表示:非跳转条件;虚线表示:条件跳转)
(如果一个跳转(条件或非条件)将控制权交给程序中的某个地址,这时会使用粗线(实线或者虚线)。【出现逆向流程,表示程序存在循环】)


50.栈帧(是在程序的运行时栈中分配的一个内存块,包含传递给一个函数的参数和该函数声明的局部变量,栈帧在函数的入口点位置分配,并在函数退出时释放【结构函数和析构函数】)


51.交叉引用的标志(注释以分号开头的:代码交叉引用表示 另一个程序指令引用了交叉引用注释所在位置的指令)


PG:65
52.Names窗口(列举了二进制文件的所有全局名称)Names编码方案:
{
a. F,常规函数。IDA认为这些不是库函数
b. L,库函数。IDA通过签名匹配的算法来识别库函数(如果不存在,将被标记为F常规函数)
c. I,共享导入函数的名称。 与库函数的区别:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示。
d. G,命名代码,这些是已命名的程序指令位置,IDA认为它们不属于任何函数。当IDA在程序的符号中找到一个名称,但没有发现被程序调用时。
e. D,数据。已命名数据的位置通常表示全局变量。
h. A,字符串。 这是一个被引用的数据位置,其中包括IDA已知的字符串类型,如以空字节结束的ASCII字符串。
}


53.常用前缀
{
a. sub_xxxxxx :地址xxxxx处的子列程。
b. loc_xxxxxx :地址xxxxx处的一个指令。
c. byte_xxxxxx :地址xxxxx处的8位数据。
d. word_xxxxxx :地址xxxxx处的16位数据。
e. dword_xxxxxx :地址xxxxx处的32位数据。
f. unk_xxxxxx :地址xxxxx处的未知大小数据。
}


54.String窗口
{
a. 打开:View->Open Subviews->Strings
b. 设置:Setup Strings窗口用于指定IDA扫描字符串的类型(默认扫描的字符串类型包含5个字符的C风格,以null结尾的7位ASCII字符串)
   (Borland Delphi二进制文件则往往使用2个字节长的Pascal字符串)
   {
   值得注意的两个选项:
1. Display only defined strings(仅显示已定义字符串;IDA将不会自动扫描其他类型的字符串)
2. Ignore instructions/data definition(忽略指令/数据定义)【扫描各种字符,包括无用的,除非是你实在找不到什么有用的信息了。】【作用:确保IDA会在所有可能发现字符串的地方扫描各种类型的字符串】
   }
}


55.次要IDA窗口
{
a. 十六进制窗口(每行显示16个字节,以及其对应的ASCII字符)
    (如果程序包含一个bss节,bss节不占用文件的空间,但加载器会扩展这一节,以适应程序静态储存的要求)

b. 导出窗口(列出文件的入口点、给其他文件使用的函数和变量)
    (导出窗口提供与objdump(-T);readelf(-S);dumpbin(/EXPORTS)等命令行工具类似的功能)

c. 导入窗口(只有在二进制文件使用共享库时,IDA才需要导入窗口。)
    (静态的二进制文件不存在外部依赖关系,因此不需要导入其他内容。由于被导入的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址)
    (对于导入窗口:导入窗口仅显示二进制文件想要动态加载器自动处理的符号,二进制文件选择使用dlopen/dlsym或LoadLibrary/GetProcAddress等机制自行加载的符号将不会在导入窗口中显示)

e. 函数窗口(列出函数库的每个函数 R返回调用方 EBP寄存器(B)引用它的局部变量)

f. 结构体窗体(显示二进制文件中使用的任何复杂的数据结构(如C结构体和联合))

g. 枚举窗口(枚举窗口有点类似于结构体窗口)
    (如果检测到(C enum),它将在枚举窗口中列出该数据类型。你也可以使用枚举来代替整数常量,提高反汇编代码的可读性。【也可自定义枚举类型,并将其使用在经过反汇编的二进制代码中】)
}



PG:71
56.其他IDA显示窗口
{
a. 段窗口(显示二进制文件中出现的段的简要列表)
    (段:Segment;节:Section;该窗口显示的信息包括 段名称、起始和结束地址以及许可标志)
    (起始和结束地址代表程序段在运行时对应的虚拟地址范围)
    (右击一个条目,IDA将显示一个上下文菜单,你可以 添加、删除、编辑现有段的属性【对非标准格式的文件 进行逆向工程时,这些功能很有用,因为二进制文件段的结构可能还没有被IDA加载器检测出来】)

b. 签名窗口(签名用于识别由编译器生成的常用的启动顺序,以确定可能已被用来构建未定二进制文件的编译器。)
    (签名还可用于将函数规划为由编译器插入的已知函数,或者因为静态链接而添加到二进制文件中的函数。)
    (添加签名:按INSERT键或右击窗口,IDA会提供Apply new signature(应用新签名)。)

c. 类型库窗口(IDA从常用的编译器的文件头中搜索到的 有关预定义数据类型和函数原型的信息【通过判断为反汇编代码 添加注释】)
    (添加库:按INSERT键或右击窗口,选择Load Type Library(加载类型库)。)

e. 函数调用窗口(一个函数可以调用其他函数,也可以被其他函数调用)
    (IDA交叉引用(xfefs)是用于生成函数调用窗口的机制、)

f. 问题窗口(显示反汇编二进制文件时遇到的困难,以及如何处理这些困难。)
    (BOUNDS问题:如果无法确定调用或者跳转的目标,或者不在程序的虚拟地址范围内,就会发生。)
    (DECISION问题:表示IDA决定将一个地址上的字节作伪指令而非数据进行反汇编,即使这个地址在递归下降指令过程中未被调用。)
    
}


PG:75
72.IDA导航
{
a. 双击导航(每个位置都分配了虚拟地址)
    (交叉引用被格式化为 一个名称和一个十六进制偏移值)

b. 跳转到地址(Jump->Jump to Address中 按下热键G)

c. 导航历史记录(Jump->Jump to Previous Position(跳转到前一个位置);后退返回按“ESC”)
               (Jump->Jump to next Position(跳转到下一个位置);“CTRL+ENTER”)
}


73.栈帧
{
a. 栈帧(stack frame)栈帧是在程序的运行时栈中分配的内存块,专门用于特定的函数调用。

b. 栈帧(激活记录)调用函数的详细步骤
  {
    a.调用方将被调用函数所需的参数放入到该函数所采用的调用约定指定的位置。如果参数被放到运行时栈上,该操作可能导致程序的栈指针发生改变。

    b.调用方将控制权转交给被调用的函数,这个过程常由X86 CALL或MIPS JAL等指令执行。然后,返回地址被保存到程序栈或CPU寄存器中。

    c.如果有必要,被调用的函数会配置一个栈指针,并保存调用方希望保持不变的任何寄存器值。

    d.被调用的函数为它可能需要的任何局部变量分配空间。一般通过调整程序栈指针运行时栈上保留空间来完成这一任务。

    e.被调用的杉树执行其操作,可能会生成一个结果。在执行操作的过程中,被调用的函数可能会访问调用函数传递给他的参数。如果函数返回一个结果,此结果通常被放置到一个特定的寄存器中,或者放置到函数返回后调用可立即访问的寄存器中。

    f.一旦函数完成其操作,任何为局部变量保留的栈空间即被释放。通常,逆向执行第4步中的操作,即可完成这个任务。

    g.如果某个寄存器的值还未调用方保存(第3步)着,那么将其恢复到原始值。这包括恢复调用方得帧指针寄存器。

    h.被调用的函数将控制权返还给调用方。实现这一操作的主要指令包括X86 RET和 MIPS JR。根据所使用的调用约定,这一操作可能还会从程序栈中清除一个或多个参数。

    i.调用方一旦重新获得控制权,它可能需要删除程序栈中的参数,这时可能需要对栈进行调整,以将程序栈指针恢复到第1步以前的值。

   (第3步和第4步通常在进入函数时执行,他们共同称为函数的“序言”。同样,第6步到第8步一般在函数结束时执行,他们共同构成函数的“尾声”。而第5步则代表函数的主体,他们是调用一个函数时执行的全部操作)

   }
}


PG:79
74.调用约定
{
a. 常见的X86编译器(MV C/C++或GUN的GCC/G++);创建栈帧时最重要的步骤,是通过调用函数将参数存入栈中。【调用函数必须存储调用的参数!】

b. C调用约定(C/C++程序中常用的_cdecl修饰符会迫使编译器利用C调用约定。)
    (调用方按从右到左的顺序将函数参数放入栈,在被调用的函数完成操作时,调用方负责从栈中清除参数。)

    (从右到左在战中放入参数的结果是,如果函数被调用,最左面的(第一个)参数将始终位于栈顶。这样,无论该函数需要多少个参数,我们都可轻易的找到第一个参数【因此,cdecl调用约定非常适用于那些参数数量可变的函数(Printf)】)

    (要求调用函数从栈中删除参数,意味着:指令在由被调用的函数返回后,会立即对程序栈指针进行调整。如果函数能够接受数量可变的参数,则调用方非常适于进行这种调整。【因为它清除的指导,它向函数传递了多少个参数,因此能够轻松的调整。被调用方不知道自己会收多少个参数,因此很难对栈做出必要的调整】)

    (无论采用哪一种方法,在调用函数时,栈指针都会指向最左面的参数)

c. 标准调用约定(微软为自己的调用约定起的名称叫_stdcall)
    (调用约定按从右到左的顺序将函数参数放在程序栈上。【区别在于:函数结束执行时,应由被调用的函数负责删除栈中的函数参数,只有参数数量固定不变才有可能】)

    (优点:在每次函数调用之后,不需要通过代码从栈中清除参数,因而能生成体积稍小、速度稍快的程序。【如果你正尝试为谋个共享库(DLL)组件生成函数原型或与二进制兼容的替代者,一定要记住这一点!】)

d. X86 fastcall约定(fastcall是stdcall约定的一个变体,它向CPU寄存器(而非程序栈)最多传递两个参数)
    (MV C/C++和GUN GCC/G++编译器能够识别函数声明中的fastcall修饰符!)

    (如果指定使用fastcall约定,则传递给函数的前两个参数将分别位于ECX和EDX寄存器中。剩余的其他参数则以类似于stdcall约定的方式从右到左放入栈上。)

    (与stdcall约定相似的是,在返回其调用方时,fastcall函数负责从栈中删除参数。)

    (由于有两个参数被传递到寄存器中,被调用的函数仅仅需要从栈中清除8个字节,即使该函数拥有4个参数【fastcall只清理参数y和z】)

e. C++调用约定(需要this指针,该指针指向用于调用函数的对象)
    (用于调用函数的对象的地址必须由调用方提供,因此,它在调用非静态成员函数时作为参数提供。)

    (C++语言标准并未规定应如何向非静态成员函数传递this指针,因此,不同的编译器使用不同的技巧传递this指针)

    (VC++提供thiscall调用约定,它将this传递到ECX寄存器中,并且和在stdcall中一样,它要求非静态成员函数清除栈中的参数)

    (GUN G++编译器将this看成是任何非静态成员函数的第一个隐含参数,而在所有其他方面与使用cdecl约定相同【因此,对使用g++ 编译的代码来说,在调用非静态成员函数之前this被放置到栈顶,且调用方负责在函数返回时删除栈中的参数(至少有一个参数)】)

f. 其他调用约定(调用约定特定于语言、编译器、CPU的,如果遇到由更少见的编译器生成的代码,可能需要你自己进行一番研究【注意:优化代码、定制汇编语言代码和系统调用】)
    (如果输出函数(如库函数)是为了供其他程序员使用,必须遵守调用约定。;如果函数仅供内部程序使用,则该函数需要采用只有函数的程序才了解的调用约定,【VC++中使用/GL选项,以及在GUN gcc/g++中使用regparm关键字】)

    (如果程序员不嫌麻烦,使用了汇编语言,那么,他们就能够完全控制如何向他们的创建的函数传递参数。吹飞他们希望创建供其他程序员使用的函数。否则,汇编语言程序员能够以任何他们认为适当的方式传递参数。【因此,在分析自定义汇编代码时注意:模糊例程(obfuscation routine)和Shellcode常见的自定义汇编代码】)

    (系统调用是一种特殊的函数调用,用于请求一项操作系统服务。通常,系统调用会造成状态转换,由用户模式进入内核,以便操作系统内核执行用户的请求。)

    (启动系统调用的方式因操作系统和CPU而异。例如:Linux X86系统调用使用int 0x80指令启动,其他x86操作系统可能使用Sysenter指令)

    (在许多x86系统上(Linux例外)系统调用的参数位于运行时栈上,并在启动系统调用之前,在EAX寄存器中放入一个系统调用编号。【Linux系统调用接受位于特定寄存器中的参数,有时候,如果可用寄存器无法存储所有的参数,它也接受位于程序栈上的参数】)
}




75.局部变量布局
    (存在规定如何向函数传递参数的调用约定,但不存在规定函数的局部变量布局的约定)
    (编译器的第一个任务,是计算出函数的局部变量所需的空间;编译器第二个任务,则是确定这些变量是否可在CPU寄存器中分配,或者它们是否必须在程序栈上分配。【至于分配方式,既与函数的调用方无关,也与被调用的函数无关。;值得注意的是,通过检查函数的源代码,通常无法确定函数的局部变量布局】)


76.栈帧示例
  【
Void bar(int j, int k);
void demo_stackframe(int a, int b, int c)
{
int x;
char buffer[64];
int y;
int z;
bar(z,y);
}
   】

    (计算的出,局部变量最少需要76个字节的空间:3个4字节的证书和1个64字节的缓冲区)

   (stdcall或cdecl调用约定,它们的栈帧完全相同)

   (在分析使用栈指针引用栈帧变量的函数时,你必须小心,注意栈指针任何变化,并对所有未来的变量偏移量进行相应调整。使用栈指针引用所有栈帧变量的好处在于:所有其他寄存器仍可用于其他目的。)

   (在弹出返回地址之前,需要从栈顶删除局部变量,以便于在ret指令执行时,栈指针正确的指向所保存的返回地址)

   (由于专门使用一个寄存器作为帧指针,并通过一段代码在函数入口点配置了帧指针,因此,计算局部变量的偏移量的工作变的更加轻松。)

   (在X86程序中,EBP(extended [ik'stendid]扩展 base pointer)扩展基址指针,寄存器通常专门用作栈帧指针。)

   (栈帧中并没有用于储存被保存寄存器的标准位置)

   (一旦EBP被保存,就可以修改,使他指向当前的栈位置,用mov完成,它将栈指针的当前值复制到EBP中)

   (使用一个专用的帧指针,所有变量相对于帧指针寄存器的偏移量得以计算出来:正偏移量用于访问函数参数,而负偏移量则用于访问局部变量。【使用专用的帧指针,我们可以自由更改栈指针,而不影响帧内其他变量的偏移量】)

   (
mov  esp, ebp  |
pop  ebp       |(由于这项操作十分常见,因此,x86体系结构提供了leave指令完成) “leave
ret            |                                                               ret  "
    ) 

[无论是何种体系结构,你都需要熟悉典型的“序言”和“尾声”]



PG:85
77.IDA栈视图
   (很明显,栈帧是一个运行时的概念,没有栈和运行的程序,栈帧就不可能存在;二进制文件中包含配置每个函数的栈帧所需的全部代码。通过分析代码,我们可以深入了解任何函数的栈帧的结构)

   (分析的一个目标:确定分配给函数栈帧的局部变量区域的具体大小;次要目标:确定某个函数是否使用一个专用的帧指针(如:push ebp/mov ebp,esp序列),以及识别对函数栈帧内变量的所有内存引用)

   (了解函数的行为通常归结为了解该函数操纵的数据的类型,查看函数的栈帧细目,是你了解函数所操纵的数据的第一个机会。)

   (db定义一个储存字节,dw定义两个储存字节,也叫做字;dd定义4个储存字节,也叫做双字。)

   (栈帧视图有利于我们深入分析编译器的内部工作机制。帧指针与局部变量之间插入8个字节。在栈帧中,这些字节的偏移量为-00000001至-00000008)


PG:90
78.搜索数据库(Search->Next Code)
{
a. 文本搜索(Search->Text[或ALT+T])【IDA允许你搜索POSIX类型的正则表达式。这里的“标识符”(identifier[ai'dentifai] n. 标识符)||只能匹配完整的词】

   (选择Find all accurences[查找所有结果];使用CTRL+T或Search->Next Text(搜索下一个文本))

b. 二进制搜索(Search->Sequence of Bytes[搜索字节序列] 或 ALT+B启动二进制搜索)

   (你必须将搜索的字符串用引号括起来,Case-sensitive进行16进制搜索会出现大小写 都会被搜索出来的情况。A:0x41 a:0x61【在进行16进制搜索时,如果希望 完全匹配就要勾选 Case-sensitive】)
}




Welcome to  View ;
                                            Made  By:C_lemon  [From  Nohack]


支持的人,总是会默默的支持。 不喜欢的人,总是会离开。  


不知道,你们喜欢 爱你的人,还是你爱的人?


我觉的这样 靠挂机得Kx 来转正,真的是误区。。。


感觉好无聊,希望管理员 给个邀请码,让我转正。


 Thanks