一,数据结构
堆
栈
链表
堆与栈区别
堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别:
(1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;
(2)空间大小不同。每个进程拥有的栈大小要远远小于堆大小。理论上,进程可申请的堆大小为虚拟内存大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
(4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有 2 种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca()函数分配,但是栈的动态分配和堆是不同的,它的动态分配是由操作系统进行释放,无需我们手工实现。
(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。
(6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
从以上可以看到,堆和栈相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片,并且可能引发用户态和核心态的切换,效率较低。栈相比于堆,在程序中应用较为广泛,最常见的是函数的调用过程由栈来实现,函数返回地址、EBP、实参和局部变量都采用栈的方式存放。虽然栈有众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,主要还是用堆。
无论是堆还是栈,在内存使用时都要防止非法越界,越界导致的非法内存访问可能会摧毁程序的堆、栈数据,轻则导致程序运行处于不确定状态,获取不到预期结果,重则导致程序异常崩溃,这些都是我们编程时与内存打交道时应该注意的问题。
原文链接:https://blog.csdn.net/K346K346/article/details/80849966/
二,ida的使用
启动页面
-
New
(新建) :选择new
将启动一个标准file open
对话框来选择将要分析的文件。根据选择的文件,ida
将显示外一个或多个对话框,再选择特定的文件分析选项。然后加载,分析并显示。 -
Go
(运行):go
键终止加载程序,使IDA
打开一个空白工作区域。可以将二进制文件直接拖入,或使用file菜单中的选项。IDA
会利用已知扩展名的过滤器限制file对话框显示。请确保修改或清除该过滤器【如选择all files】,以便file
对话框正确显示你想要打开的文件【在非windows系统中,可执行文件可能没有扩展名】。以这种方式打开文件时,IDA
会尝试自动识别选定文件类型,需要注意loading
对话框,看ida
用哪个加载器处理。 -
Pervious
:使用previous
可以打开“最近用过的文件”列表中的一个文件。“最近用过的文件”列表中包含IDA的windows注册表项的history子项中的值。默认长度为10,可以编辑idagui.cfg
或idatui.cfg
修改其值。
常用快捷键
IDA
中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:
a
:将数据转换为字符串f5
:一键反汇编esc
:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)shift+f12
:可以打开string
窗口,一键找出所有的字符串,右击setup
,还能对窗口的属性进行设置ctrl+w
:保存ida数据库ctrl+s
:选择某个数据段,直接进行跳转 ctrl+鼠标滚轮:能够调节流程视图的大小x
:对着某个函数、变量按该快捷键,可以查看它的交叉引用g
:直接跳转到某个地址n
:更改变量的名称y
:更改变量的类型/
:在反编译后伪代码的界面中写下注释\
:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多;
:在反汇编后的界面中写下注释ctrl+shift+w
:拍摄IDA快照u
:undefine,取消定义函数、代码、数据的定义
三,汇编语言