![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
WIN32
WINDOWS环境下32位汇编语言程序设计
虾仁炖猪心
emmmmmm
展开
-
用32位汇编语言写一个窗口程序
用WIN32来写窗口程序需要编写两个文件,一个是资源脚本文件:*.rc,一个是汇编源文件:*.asm。将这两个文件编译链接在一起就可以得到我们的窗口程序。而资源脚本文件中包含了对菜单,加速键,图标,光标,位图等资源的定义,源文件中包含如何使用这些资源的代码。首先我们来看资源脚本文件中菜单和加速键以及图标光标的定义。#include <resource.h>#define...原创 2020-04-03 21:47:40 · 1973 阅读 · 0 评论 -
win32两种获取进程句柄的方式
获取运行中的进程句柄获取进程句柄的方式有很多种,之前有说到CreateProcess函数,该函数在一个进程中打开另一个进程,并且得到子进程的句柄,不过有时候我们更想获得正在运行的进程的句柄。获取正在运行的进程句柄也有几种方式,下面介绍一下几个函数。FindWindowinvoke FindWindow,lpClassName,lpWindowName该函数返回一个窗口句柄,...原创 2020-03-28 16:56:16 · 4151 阅读 · 2 评论 -
在进程中用CreateProcess函数创建一个子进程
在自己的进程中创建一个子进程有三种方法,一个是使用函数WinExec,还有一个是使用函数ShellExecute。这两个函数里面后者用的多一点,但是这两个函数创建子进程后,子进程就完全和自己的进程脱离开来了,就是说我们创建子进程后就不能控制它了。所以这里介绍第三种办法,使用函数CreateProcessCreateProcessinvoke CreateProcess,lpAppl...原创 2020-03-27 20:51:06 · 1561 阅读 · 0 评论 -
用事件对象控制线程
之前的一篇博客里面用汇编写了一个多线程计数器,但是这个计数器存在一个缺陷,当我们按下暂停的时候,虽然看起来计数暂停,但是程序在CPU里面的占用几乎没有变,这是因为循环还在继续。所以如果有一种机制,能够让我们按下暂停的时候,线程里面的代码就停住了。这样就不会继续占用CPU资源。这种机制是有的,那就是“事件”。事件也是一个对象,类似于文件,窗口,内存等对象。我们可以把“事件”看成一个标志,一个设置...原创 2020-03-26 22:49:00 · 159 阅读 · 0 评论 -
用32位汇编语言写一个多线程计数器
进程和线程之间的关系进程就是正在执行中的应用程序,磁盘上的可执行文件只能称之为文件而不能称之为进程。一个进程是一个执行中的文件使用资源的总和。线程是操作系统分配处理器时间的基本单位,一个线程可以看成是一个“执行单元”,它负责执行包含在进程空间中的代码。进程中的代码要运行起来,就必须拥有运行这个代码的“执行单元”,也就是线程。就类似于,一个进程,Windows没有分配时间给它,它里面的代...原创 2020-03-25 21:23:06 · 671 阅读 · 0 评论 -
自己写一个键盘钩子程序来监视键盘输入
“钩子是Windows的消息监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们“上面就是WIN32API手册中对钩子的描述。大概就是说钩子可以用来截获系统的消息。那么,要写一个钩子程序,肯定要先确定钩子的类型,钩子是有很多类型的,不同类型的钩子可以监视不同类型的消息。钩子名称 ...原创 2020-03-24 23:13:23 · 2258 阅读 · 2 评论 -
自己写动态链接库
动态链接库一些基础的概念:动态链接库缩写为DLL。动态链接库提供了许多的通用函数,可以被多个程序调用。动态链接库,顾名思义,它只有在程序执行的时候才会装入到程序的地址空间中,程序不执行时就只保留一些库的信息在文件中。了解过PE文件结构的应该知道,PE文件不执行时,动态链接库的信息在PE文件的导入表中,导入表里面包含了这个PE文件要使用的所有的动态链接库的名称以及要从库中导入的函数的一些信息。...原创 2020-03-23 19:30:32 · 604 阅读 · 0 评论 -
win32 API 调用方法
invoke 语句我们在MASM中可以用这种方法来调用API函数:invoke 函数名 [参数1],[参数2] ,...... 。这样可以避免我们在写汇编程序中调用函数时少写或漏写了参数,漏写参数会导致堆栈对不齐,但是这样的程序在编译链接时并不会报错,但执行的时候程序会崩溃。而用这种方法就像在c语言中调用函数一样,如果我们漏写了参数,编译器会报错,就可以避免上面的情况发生。编译器报错内容是...原创 2019-09-21 19:13:29 · 1486 阅读 · 0 评论 -
WIN32汇编程序的结构及模式定义,段的定义
WIN32汇编程序的结构先放张图:这是之前听小甲鱼的课的时候下下来的一个WIN32汇编源程序,就拿它做例子。 和8086一样,也是分号后面的都是注释,所以分号后面的东西我们可以不用管。然后可以看到开头有三行,我们一行一行分析。首先第一行我们看到是 .386 。这就是WIN32中的模式定义,它的意思就是在后面的代码中可以使用80386汇编中的指令集,比如在8086汇编中只有...原创 2019-05-12 23:07:01 · 371 阅读 · 0 评论 -
win32初篇-win32可执行文件的开发过程
win32生成可执行文件的步骤win32汇编要比之前的8086汇编要复杂许多,光是生成可执行文件就多了好多步骤。之前的8086汇编生成可执行文件只需要将写好的汇编程序(.asm)编译,生成目标文件(.obj),然后连接就生成可执行文件(.exe)了。而win32汇编就不一样了,下面来介绍一下具体步骤。要生成一个win32可执行文件,首先也和8086汇编一样,我们先要在文本编辑器中打出汇编程...原创 2019-04-03 22:47:14 · 1099 阅读 · 0 评论 -
makefile描述文件
先放张图上次讲到,我们可以使用make工具来很方便地进行编译和连接生成可执行文件,而make工具这么方便靠的就是描述文件。make工具通过描述文件中描述源程序之间的相互关系来进行编译和连接的工作,而描述文件中的描述是有规定的语法的,就像上图所示,这次我们就是要详细了解一下描述文件的语法。注释和换行我们可以看到文件中有几行都是有一个 "#" ,然后后面就是中文注释。在描述文件的语法...原创 2019-04-10 23:02:47 · 154 阅读 · 0 评论 -
动态获取API的地址
原理:现在虽然大部分Win32程序都使用ExitProcess函数来终止执行,但是其实用ret指令也是可以的。我们的应用程序的主程序可以被看成是一个被Windows调用的子程序。当父进程要创建一个子进程时,它会调用Kernel32.dll中的CreateProcess函数,CreateProcess函数在完成装载应用程序后,就会把一个返回地址用push压入栈,这个返回地址是子进程用ret来结束...原创 2020-03-18 21:34:24 · 1097 阅读 · 0 评论 -
内存映射文件的基本概念,用32位汇编写一个使用内存映射的程序
内存映射文件概念:通过内存映射文件函数,可以将磁盘上的文件的全部或部分映射到进程的虚拟地址空间的某个位置,一旦完成了映射,就可以通过指针像访问内存一样访问磁盘文件。读取文件和写入文件的操作都是直接对内存进行操作。通过内存映射文件,能够更高效率地读取文件,提高系统性能。内存映射文件的实现原理:实际上映射这个步骤就只有过程一了,映射完成后我们会得到一个地址,这个过程不存在数据拷贝...原创 2020-03-22 22:42:44 · 398 阅读 · 1 评论 -
WIN32内存管理和文件操作
在WIN32中,进程可以使用的整个地址空间就是应该堆。而堆又分为默认堆和私有堆也叫动态堆,一个进程只有一个默认堆,但是可以又多个私有堆,私有堆位于默认堆中。标准内存管理函数总是在默认堆中分配和释放内存。内存映射文件函数相对不同,他是为了文件操作方便而设立的,当堆文件进行操作的时候,先打开文件,然后将文件直接映射到进程的地址空间中,然后我们就可以通过指针像访问内存一样访问文件了。下面就来...原创 2020-03-21 22:35:22 · 341 阅读 · 0 评论 -
在PE文件中添加可执行代码
原理:将代码添加到目标PE文件中有两种方法,一种是将代码插入到原文件代码的节的空隙中,还有一种办法是在节的末尾新增一个节,当然这两种方法都有局限性,第一个必须得保证节与节之间有足够的空隙插入我们的代码,第二个必须得保证节表末尾有足够的空隙让我们再插入一个节表。 我们既然要插入代码,那肯定就是为了执行。所以我们得让文件先执行我们的代码再去执行原来的代码,因此我们需要将原来的执行入口保存在我们的...原创 2020-03-19 23:06:39 · 1309 阅读 · 0 评论 -
PE文件重定位表
要链接PE文件中的重定位表的话,我们首先要知道哪些指令需要重定位,还有重定位的算法是怎样的。汇编中有些指令要用到内存地址,并且在编译的时候这些地址就固定在机器码里面了,如果我们程序的实际装入地址与模块的减一装入地址是相同的,那么这个指令就没问题,但是当实际装入地址与建议装入地址不相同时,如果没有重定位就会出问题了。举个例子,假如我们在程序中写的代码是: mov eax,dword ptr [0...原创 2020-03-17 21:54:06 · 349 阅读 · 0 评论 -
PE文件资源简介
PE文件中的资源部分占PE文件很大的一个比例,资源包括光标,位图,菜单等等还有十几种标准类型,处理标准类型还有自定义类型。资源的组织方式很像磁盘目录的组织的方式,或者说像数据结构中的树型结构。PE文件中资源的组织方式如下图:从上图可以看到资源块是由很多种结构组成的,第一层目录也就是根目录的第一个结构是一个IMAGE_RESOURCE_DIRECTORY结构,它也就是IMAGE_OPTION...原创 2020-03-15 23:07:29 · 350 阅读 · 0 评论 -
PE文件导出表简介
导出表一般存在于 .dll 文件中,偶尔也存在于EXE文件中。PE文件被执行时,Windows装载器将文件装入内存并将导入表登记的DLL文件装入,再把需要导入的函数的地址根据DLL文件导出表中的信息对被执行文件导入表中的IAT表进行修正。所以导出表就是存储了一个文件的导出信息的表,通过导出表DLL文件向系统提供导出函数名称,序号和入口地址等信息,以便Windows装载器来完成动态链接的过程。导...原创 2020-03-13 22:25:38 · 239 阅读 · 0 评论 -
PE文件导入表简介
我们在编写程序的时候经常要导入外部的一些函数,通常我们只需要将包含函数的模块导入进来,然后我们直接用函数的名字就可以调用函数了。那么这具体是怎么做到的呢?当我们使用动态链接库中的函数,只有在程序运行时,库里面的代码才会被调入内存,程序不运行时程序只包含了一些关于要导入的链接库和函数的信息,这些信息就在导入表中。(如果有多个程序使用同一个动态链接库,WIndows在物理内中只留一份库的代码,仅通...原创 2020-03-12 23:27:03 · 248 阅读 · 0 评论 -
PE文件结构的基础概念,用32位汇编写一个程序读取PE文件头
PE文件由文件头部分,节表部分,还有节区部分组成。其中文件头包括PE文件头还有DOS文件头,节表主要是用来说明每个节的RVA地址(RVA地址就是文件被装载到内存后数据相对于文件起始位置的偏移量)还有节的尺寸的,当然还有一些其他的信息。而节区就是将属性相同的文件数据放在了一起,比如可执行的放一起,只读的放一起等等。这是PE文件头的大概样子:DOS文件头 DOS头部分由MZ格式...原创 2020-03-11 23:09:52 · 859 阅读 · 2 评论