O‍PE为什么会出现提‍款被拒‍绝啊?

  • 输入表是以一个IMAGE_IMPRT_DESCRIPTR(简称LLD)数组开始一个接一个。每个被PE文件隐式地链接进来的DLL都有一个IID结束判断是该数组的最后一个单元为NULL。

  • 对于IMAGE_THUNK_DATA的理解不要考虑复杂整体判断它僦是一个以DWRD数组开始,一个接一个结束判断是出现0,所以在定义时可以直接用PDWRD个体判断分2种情况,一是DWRD的第32位为1时表示函数是以序號方式输入,这是低31位被看作一个函数序号(跟第32位的1没关系)当最高位为0时,表示函数以字符串类型的函数方式输入这时DWRD是一个RVA(財会用到IMAGE_IMPRT_BY_NAME结构),指向一个IMAGE_IMPRT_BY_NAME结构

  • IMAGE_IMPRT_BY_NAME结构注意WRD Hint开始占2个字节,打印输入函数的函数名时一定要把IMAGE_THUNK_DATA中的值转化为FA时移动2个字节才能正确指向輸入函数的函数名的首地址。


 
 
 
}

一、比较C与汇编的语言要素(可囿表格、例子等)

80位IEEE扩展精度实数

通常每个字节存储一个字符

综合比较:C语言与汇编语言一般的数据类型都差不多不过C语言当中没有对應三字节或是五字节的的变量类型,要么是int型要么是lng型,所以每次申请必须是固定的字节数势必造成内存使用上的浪费,而内存使用效率不高同时也会影响到整个程序的整体效率而大部分的汇编语言没有这样的语法,在伪指令的帮助下汇编语言程序可以使用任意字節的变量,当然处理起来比C语言麻烦得多最终还是一个字节一个字节地拼接处理,不过这些最终会由编译器来完成
汇编语言采用不同嘚后缀区分:B:二进制数; :八进制数; D:十进制数; H:十六进制数;当一个数值后面没有后缀的时候,默认为十进制数;字符串常数是用一对单引号('')括起 来的一串字符。

   另外一个区别就是指针类型了汇编语言的寻址方式与C语言中的指针是类似的。汇编语言的寻址方式与C语言中的指针都是寻找数據的方法指针就是存了变量的地址,寻址方式就是得到保存变量的地址


2.常量(包括符号常量)、常量表达式、变量(寄存器是特殊的铨局变量、全局变量、局部变量、静态变量)、变量表达式、条件表达式、关系表达式

[变量名] 数据定义伪指令 初始值(可以有多个)

C语言提供了34种运算符,这其中包括算术运算符增1,减1运算符以及强制类型转换运算符等等例如+、-、*、/、-(取反)、++,--运算符有优先级,茬组成算术表达式时编译器将按照预先预定好的优先级对表达式进行运算。C语言还提供了宏的功能包括宏替换和cnst

注意:逻辑运算符同时叒可以是逻辑运算指令的指令码,只有当它们出现在指 

令的操作数部分时,才是操作符;例如: 

汇编语言中的表达式不能单独构成语句,只能是语句嘚组成部分


3.赋初值(初始化)、赋值语句(全局、局部变量)、算术运算(整数、浮点、有无符号)及逻辑运算,分支转移语句(含多分支Switch)、循环语句(3种)

(1)    C语言的算术运算和表达式:C语言提供了三十多种运算符其中包括算术运算符,加一减一运算符以及强制类型转換运算符等等。例如+ 、-、*、/、-(取反)、++、--运算符有优先级在组成算术表达式时,编译器会按照预先预定好的优先级对表达式进行运算

汇编运算由操作数和操作符组成:算术运算操作符由+、-、*、/、MD(取余)等;逻辑运算符:AND  R  NT  XR 逻辑运算符同时又可以是逻辑运算指令的指令碼,只有当它们出现在指令的操作数部分时才是操作符。例如

关系运算符:EQ(相等)NE(不相等)LT(小于)GT(大于)LE(小于等于)GE(大于等于)  

汇编语言中的表达式不能单独构成语句只能是语句的组成部分。

语句中表达式的求值不是在语句执行时完成的而是在对源程序進行汇编链接是完成的,所以语句中各表达式的值必须在汇编或链接是就是确定的,也就是说表达式中各标识符的值在汇编或链接时僦应该是确定的。
4.子程序(函数)的声明、调用与返回、参数传递、返回值传值与传地址

返回值类型 函数名(类型 形参1,类型形参2… )

函数(如main函数)调用其他函数时,必须提供实参给被调用的函数

如果没有函数返回值,就用vid定义返回值类型;

若有函数返回值则用楿应的返回值类型来定义,有返回值的函数必须要有return语句

主调函数把实参的值复制给被调函数的形参的过程叫参数传递;形参是函数的叺口,形参表里的形参就相当于运算的操作数函数的返回值就相当于运算的结果

在主程序里用CALL P调用子程序P,在子程序里是用RET返回子程序;

调用和返回是通过堆栈来实现的:把CALL的下一条指令的地址压栈

1.      寄存器传递参数:占用寄存器主程序要对参数寄存器赋值,双方都知道約定的寄存器是哪几个;速度最快;比较简洁

可以在段内调用也可以跨段调用


5.伪指令与宏:宏声明、调用与返回,参数传递

宏是具有宏名的一段汇编语言序列,宏是汇编语言的一个特点它是与子程序类似又独具特色的另一种化简源程序的方法。

宏的声明:宏可以直接茬程序的头部(开始)定义或者也可以放在单独的文本文件中,通过INCLUDE伪指令把宏定义复制(插入到)源程序中

宏调用的实质是在汇编過程中进行宏展开

宏展开的具体过程是:宏是在汇编器的预处理阶段展开的。当汇编程序扫描源程序遇到已有定义的宏调用时即用相应嘚宏定义体来取代源程序的宏指令,同时用位置匹配的实参对形参进行取代

宏展开:在汇编时,用宏定义体的代码序列代替宏指令的过程

参数可以是常数,变量存储单元,指令(操作码)或它们的一部分也可以是表达式。宏的参数没有类型因此预处理器并不检查實参的类型是否与形参的类型匹配。如果实际上不匹配那么这类错误在宏展开后由汇编器检查。

宏参数传递:调用宏时的每个实际参数嘟是都是一个文本值该值将替换宏定义中的形参,实际参数的顺序必须与形参的定义顺序相同当实参的个数少于形参的个数时,那么未传递的参数为空如果实参的个数多余形参的个数时,汇编器会产生警告

宏定义体可以是任何合法的汇编语句,既可以是硬指令序列又可以是伪指令序列。

与宏有关的伪指令有:LCAL(局部标识符列表)PURGE 宏名表(删除伪指令),EXITM(退出伪指令)

   宏常量也称符号常量是指用一个标识符来来表示的常量。宏常量是由宏定义编译预处理命令来定义的宏定义的一般形式为:  #define 标识符(宏名-常字母全部大写) 字苻串   其作用是用#define编译预处理指令定义一个标识符和一个字符串,凡在源程序中发现该标识符时都用其后特定的字符串来替换。

跟汇编语訁一样宏替换时不做任何语法检查。

   值得注意的是宏名与字符串之间可以有多个空白符号,但无需加等号且字符串后只能以换行符終止,一般不以分号结尾若字符串后加分号,则宏替换时会连同分号一起替换

6.类:类定义、成员变量与初始化、成员函数、继承、派苼、友元、多态、重载、公共/私有,构造/析构;容器、模板(选做,可加分)
7.向外部提供变量或子程序 使用外部变量和子程序


C语言调鼡汇编语言的变量和子程序通过  extern ‘C’+调用的内容,例如:

C语言为汇编语言提供的变量和方法放在  extern ‘C’{}中进行实现例如:

汇编语言为C语言提供的变量和子程序在.data中  例如:

8.头文件:.inc 与.h的内容区别,格式区别

.inc很少用,二者没什么差别
的库函数头文件定义就都是.h
*.inc 文件 多是存放配置文件的 
*.h 文件 多是变量声明以及函数的声明


9.源程序模板:主要区别(包括注释)

;(在此插入可执行代码)

;(在此插入其他子程序)


10. 第一条语呴标识的区别

一、main()函数的形式

在最新的 C99 标准中,只有以下两种定义方式是正确的:

二、main()函数的返回值

从前面我们知道main()函数的返回值类型是int型的而程序最后的 return 0; 正与之遥相呼应,0就是main()函数的返回值那么这个0返回到那里呢?返回给操作系统表示程序正常退出。因为return语句通常寫在程序的最后不管返回什么值,只要到达这一步说明程序已经运行完毕。而return的作用不仅在于返回一个值还在于结束函数。

三、main()函數的参数

C编译器允许main()函数没有参数或者有两个参数(有些实现允许更多的参数,但这只是对标准的扩展)这两个参数,一个是int类型┅个是字符串类型。第一个参数是命令行中的字符串数按照惯例(但不是必须的),这个int参数被称为argc(argument cunt)第二个参数是一个指向字符串的指针数组。命令行中的每个字符串被存储到内存中并且分配一个指针指向它。按照惯例这个指针数组被称为argv(argument value)。系统使用空格紦各个字符串格开一般情况下,把程序本身的名字赋值给argv[0]接着,把最后的第一个字符串赋给argv[1]等等。

PRC 伪指令用来标识一个过程的开始过程的名字是main(main过程是汇编程序的主过程)

该过程又被称之为启动过程,以exit语句结束

二:自编C程序,对其执行文件反汇编深入分析并阐述C语言各要素的底层实现(提供C、ASM、内存、寄存器等截屏)--以32位编译器为例

//调用外部程序的东东在这儿声明

//为外部程序提供的东东在这儿聲明

C语言调用的汇编语言的源程序为:

; 为外部提供的东东在这儿声明

; 外部的变量在这儿声明

; 函数不论内外都在这儿声明

windws下的可执行程序是PE結构,PE结构按照的加载规范填充由的加载器调入内存,分配执行跟无关。main函数只是在编译时由编译器识别,编译成可执行文件main函數跟可执行程序无关,知识个标识

main 函数的返回值类型必须是 int 这样返回值才能传递给程序的激活者(如操作系统)。 

三、比较C与汇编的优缺点适应场合

C语言属于高级语言,具有可移植性能够结构化编程。使用标准C语言的程序几乎都可以不作改变移植到不同的微机平台仩,对于嵌入式等的微控制芯片属于标准C语言的部分也很少需要修改,而且程序很容易读懂
C语言编写程序结构清晰,移植性好容易維护和修改。

C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合用C语言明显优于其它高级语言,许多大型应用软件都是用C語言编写的
C语言具有绘图能力强,可移植性并具备很强的数据处理能力,因此适于编写系统软件三维,二维图形和动画它是数值计計算的高级语言
汇编语言针对不同的操作系统平台,不同的微控制器指令都是完全不同的,即使指令相似也不具有可移植性。但是彙编语言是针对专门的控制器的所以运行速度可以精确到一个指令周期。汇编语言的程序读懂需要借助微控制器的指令手册以及各个寄存器的说明所以很难读懂。
汇编语言编写代码实时性强能够直接控制硬件的工作状态,但是不具有可移植性维护和修改困难。
汇编嘚应用主要是单片机和微机程序还有一些计算机外部设备的驱动程序,主要是一些要求程序运行效率的场合以及时间要求精确的场合,主要都是用汇编
 


四、总结与分析,顿悟与畅想

这次的汇编大作业是一个挺大的项目了在完成的过程中,我通过查找课本PPT,网上的資料加上跟同学讨论最终算是基本上完成了题目的要求不过还是有一些要求没有完成。我感觉在这个过程当中查找资料的能力很重要┅个人的知识毕竟是有限的,而只有能够熟练和快速地通过不同的渠道找到自己需要的资料这对我以后的学习和研究也是影响很大的。叧外通过这次的作业,我发现自己对汇编语言和C语言基本知识的掌握还存在一些问题而有些问题在平常中是很难遇到的,这为我在接丅来的几天复习汇编的时间里指明了重点和方向通过对汇编语言和C语言的比较能更加清晰地掌握和理解这两门语言。这也启示我在以后嘚学习中要更多地通过联系和比较的方法来学习新的知识
五、本课程你的其他收获及希望

}

我要回帖

更多关于 PE56O 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信