反汇编与C语言结合杂记

2021/4/12 12:27:03

本文主要是介绍反汇编与C语言结合杂记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

char 占1字节 所以 内存中存两个十六进制数,16位二进制数。对于ascii码61两个十六进制数 就是a这个字母;所以最大存值为00FF(0255);
int 占4字节 所以内存中存4个十六进制数。32位二进制数;当int = 0xAA的时候,剩下的内存空间会用00 补齐。 比如 AA 00 00 00 ;
long 占4字节;
一个函数调用,先初始化堆栈,堆栈平衡,在CCCCCCC填充堆栈。最后pop恢复堆栈;
在函数调用时候,某一局部变量在栈区将被push。同时esp-4;
全局变量在程序运行时,便通过ebp-4 在内存中存上值了。就是所谓的基址;
c语言if语句汇编:通过cmp 指令 计算两数相减值,然后修改表标志寄存器。然后根据jle和jl 指令判断大小。当条件成立,便跳开当前代码。条件不成立,便执行下面的代码。与正向代码判断方式相反。

指针:

类型的变量赋值时只能使用“完整写法”;int a; a = (int)10;
32位操作系统宽度是4字节;
即便是int
a; char* a; int** a; char** a; 都是dword 宽度。即4字节;
在做运算的时候,要减去一个* 比如char** a做运算或者++,-- 操作。需要替换为char* a做操作;
&a;取a的地址;int a = 10. int*b = &a;

指针数组和数组指针区别

一、指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。下面到底哪个是数组指针,哪个是指针数组呢:A)int p1[10];B)int (p2)[10];每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,

函数指针和指针函数:

指针函数:
函数的返回值是一个指针;

void* func(args);
函数指针
与指针函数不同,函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
我们知道,函数的定义是存在于代码段,因此,每个函数在代码段中,也有着自己的入口地址,函数指针就是指向代码段中函数入口地址的指针。
其声明形式如下所示:

ret (p)(args, ...);
其中,ret为返回值,
p作为一个整体,代表的是指向该函数的指针,args为形参列表。其中p被称为函数指针变量 。

有关PE文件头:

https://blog.csdn.net/zys_1997/article/details/78717402

C语言静态/动态链接库

lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。

参照百度百科https://baike.baidu.com/item/%E5%BA%93%E6%96%87%E4%BB%B6?fromtitle=DLL%E6%96%87%E4%BB%B6&fromid=4170556#1_1



这篇关于反汇编与C语言结合杂记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程