zoukankan      html  css  js  c++  java
  • 加密与解密学习笔记2-windows API函数

    API函数是构筑整个Windows框架的基石,只有充分理解和利用API函数,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。
     
    Win32 API即为Microsoft 32位平台的应用程序编程接口(API,application prgramming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。
    Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。
    在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。
    API函数提供应用程序运行所需要的窗口管理、图形设备接口、内存管理等各项服务功能。
    标准Win32 API函数可以分为以下几类:
            窗口管理
            窗口通用控制
            Shell特性
            图形设备接口
            系统服务
            国际特性
            网络服务
     
    Windows 应用程序编程接口,简称Win API
    Win API子系统负责将API调用转换成windows操作系统的系统服务调用,API函数是构筑整个windows框架的基石,它下面是windows的操作系统核心,上面则是windows 应用程序
     
    16位版本的windows的API(windows10到windows 3.1)现称为Win16
    32位版本的windows的API(windows 9x、windows NT、windows 2000和windows XP)现称为Win32
    Win 16 到Win 32的转变中保持兼容
    32位版本的windows都支持Win16 API(以确保和旧的应用程序兼容)和Win32 API
    (以运行新应用程序)
    Win32 API是一个基于C语言的接口,但Win32 API中的函数可由不同语言编写的程序调用,只要在调用规范中。
     
    windows运转的核心是一个称作“动态链接”的概念
    “动态链接”是指Windows程序在运行时才把自己需要存在于某个库中的函数链接进来。
    “静态链接”是指Windows程序在编译阶段就把各种对象模块(.OBJ)、运行时库(.LIB)和资源文件(.RES)链接到一起以创建一个可执行文件(.EXE)。
    DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。
    在windows 9x中通常位于windowssystem子目录中
    在windows NT2000XP中通常位于系统安装目录里的system和system32子目录中
     
    windows内部 链接器中三个最重要的动态链接库(kernel、user、gdi)
    kernel(由16位的krnl386.exe和32位的kernel32.dll实现):操作系统核心服务功能,包括进程与线程控制、内存管理、文件访问等。
    kernel32.dll是Windows9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系 统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。 
    user(由16位的user.exe和32位的user32.dll实现):负责处理用户接口,包括键盘和鼠标的输入、窗口和菜单管理等。
    user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。
    gdi(由16位的gdi.exe和32位的gdi32.dll实现):图形设备接口,允许程序在屏幕和打印机上显示文本和图形。
    gdi32.dll是Windows GDI图形用户界面相关程序,包含的函数用来绘制图像和显示文字。
     
    其他:
    对象安全性、注册表操作(advapi32.dll)
    通用控件(comctl32.dll):comctl32.dll主要提供各种标准视窗界面元件。它提供对话框如开启档案、存盘及另存新档,或视窗元件如按钮和进度列。它倚靠user32.dll和Gdi32.dll来建立及管理这些界面元素。
    公共对话框(comdlg32.dll)
    用户界面外壳(shell32.dll)
    图形引擎(dibeng.dll)
    网络(netapi32.dll)
     
     
    句柄(handle),有多种意义,第一种解释:句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 第二种解释:整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是适用的对象的唯一整数,Windows大量使用了句柄来标识对象。
    WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
    句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控件,位图,GDI对象等等。WINDOWS句柄有点像C语言中的文件句柄
     
    从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位(或64位)的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等。这当中还有一个通用的句柄,就是HANDLE。
     
    句柄是一个标识符,是拿来标识对象或者项目的。如果想更透彻一点地认识句柄,我可以告诉大家,句柄类似指向指针的指针,仅仅是类似,通过句柄可以找到对应的数据,但是不是二级指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存中的。简单地理解,似乎我们只要获知这个内存的首地址,就可以随时用这个地址访问对象了。如果您真的这样认为,那您可就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找那一个对象呢?为了解决这个问题,Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告知给对应的句柄进行更新。这样我们只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了。这个地址是在对象装载(Load)时由系统分配给的,当对象卸载时(Unload)又释放给系统。
     
    内核对象句柄,是用来标识某个内核对象的一个ID 同一个对象的该id对于每个进程是不同的,具体如何实现是ms不公开的算法,以下是一个近似的,可能的算法:
    进程创建时,windows系统为进程构造了一个句柄表
    当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时
    系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的指针
    同时,系统返回这个表项在句柄表中的索引作为句柄。
     
    API函数是区分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows的所有与字符有关的函数都提供两种方式的版本。尽管你编程时使用GetWindowText,但实际上编译程序会根据设置自动调用GetWindowTextA或GetWindowTextW。函数的最后一个字母告诉我们函数是使用单字节还是双字节字符串。
     
    常用API函数
    1、 Hmemcpy函数
    void hmemcpy(
    void _huge * hpvDest; // 目的数据地址
    const void _huge * hpvSource; // 源数据地址
    long cbCopy; // 数据大小 (Bytes)
    );
    返回值:如果成功就返回目的数据地址;失败则返回零
    这个函数在KERNEL32.DLL中,它很常用,俗称万能断点,但一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。但的确它是很有用的!有意思的是它执行的操作很简单,只是将内存中的一块数据拷贝到另一个地方。
    注意:此函数只在Windows 9x系统上有效,在Win NT/2K系统上相关的函数是memcpy,但在Win NT/2K上不同于Windows 9x上,很少再调用memcpy来处理数据了,用此函数设断基本上什么也拦不住。
    2、 GetWindowText函数
    此函数在USER32.DLL用户模块中,它的作用是复制指定窗口中的字符到缓冲区(取得一个窗体的标题文字或一个文本的控件的内容)。函数原型:
    int GetWindowText(
    HWND hWnd//欲获取文字的那个窗口或文本的句柄
    LPTSTR lpString //预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入(缓冲区地址)
    int nMaxCount//lpString缓冲区的长度(复制的最大字符)
    );
    返回值:如果成功就返回文本长度;失败则返回零值
    16位:GetWindowText
    32位:GetWindowTextA(ANSI版),GetWindowTextW(Unicode版)
    3、 GetDlgItem函数
    此函数在USER32.DLL用户模块中,它的作用是返回指定对话框中句柄。函数原型:
    UINT GetDlgItem(
    HWND hDlg, // 对话框句柄
    int nIDDlgItem, //控制标识符(ID号)
    );
    返回值:如果成功就返回文本长度;失败则返回零值
    4、GetDlgItemText
    此函数在USER32.DLL用户模块中,它的作用是返回对话框中某一个窗口的标题或文字、文本。函数原型:
    UINT GetDlgItemText(
    HWND hDlg, // 对话框句柄
    int nIDDlgItem, //控制标识符(ID号)
    LPTSTR lpString, / 预定义的一个字符缓冲区(文本缓冲区指针)
    int nMaxCount// 字符缓冲区的长度
    );
    返回值:如果成功就返回文本长度;失败则返回零值
    16位:GetDlgItemText
    32位:GetDlgItemTextA(ANSI版),GetDlgItemTextW(Unicode版)
    注:GetDlgItemTextA(W)在windows 9x下独立存在的,而在windows 2000/xp下GetDlgItemTextA(W)其实是调用GetWindowTextA(W)函数
    5、GetDlgItemInt函数
    此函数在USER32.DLL用户模块中,它的作用是返回对话框整数值。函数原型:
    UINT GetDlgItemInt(
    HWND hDlg, // 对话框句柄
    int nIDDlgItem, //控制标识符(ID号)
    BOOL *lpTranslated, //接收成功/失败指示的指针
    BOOL bSigned //指定是有符号数还是无符号数
    };
    返回值:如果成功,lpTranslated被设置为TRUE,返回文本对应的数值;如果失败,lpTranslated被设置为FALSE,返回零值
    6、MessageBoxEx函数
    此函数是在USER32.DLL用户模块中,它的作用创建、显示信息框。函数原型:
    int MessageBoxEx(
    HWND hWnd, //父窗口句柄
    LPCTSTR lpText, // 信息框中文字的地址
    LPCTSTR lpCaption, // 信息框标题地址
    UINT uType // 信息框类型
    WORD wLanguargeld //语言标识
    );
    MessageBoxEXA(ANSI版),MessageBoxExW(Unicode版)
    7、MessageBox函数
    此函数是在USER32.DLL用户模块中,它的作用创建、显示和操作信息框。函数原型:
    int MessageBox(
    HWND hWnd, //窗口句柄
    LPCTSTR lpText, // 信息框中文字的地址
    LPCTSTR lpCaption, // 信息框标题地址
    UINT uType // 信息框类型
    );
    16位:MessageBox
    32位:MessageBoxA(ANSI版),MessageBoxW(Unicode版)
    windows 9x/2000/xp下,MessageBoxA(W)函数其实调用的MessageBoxEx来实现的。
    形式如下:int MessageBoxEx( hWnd,lpText,lpCaption,uType,0)
  • 相关阅读:
    Centos 实现SSH证书登录
    Spring Boot 拦截器的使用
    Spring Boot 内置定时器的使用
    Spring Boot 整合Druid数据源(一)
    Spring Boot 整合滑动验证
    asp.ent core swagger
    Dapper.Contrib
    SonarQube
    Endpoint.Binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
    wcf messageEncoding="Mtom"
  • 原文地址:https://www.cnblogs.com/guiguxiaosheng/p/12294282.html
Copyright © 2011-2022 走看看