4.9(预习)部分

news/2025/1/15 21:05:45/

LoadLibraryA GetProcAddress 编写代码,获取 VirtualAlloc 并且调用成功

#include <windows.h>
#include <wchar.h>
#include <string.h>
#include <stdio.h>
#include<libloaderapi.h>
int main()
{HMODULE hModule=0;FARPROC space=NULL;hModule = LoadLibraryExA("kernel32.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);if (!hModule){printf("erro!!");}space = GetProcAddress(hModule, "VirtualAlloc");if (!space){printf("erro!!");}else{char* ch = (char*)space();if (ch!=NULL){printf("success!");}}return 0;
}
问题
1.space这里返回的是VirtualAlloc这个函数吗?
2.这里的路径不清楚是否给正确了?
3.假设这个参数给对了,那为什么使用space的时候不是VirtualAlloc的样子
4.VirtualAllocFree的功能怎么实现?(用free吗,因为这里space也是个指针类型)
5.从编译器这边的运行来讲,上述代码没有错误,能正常运行
6.上面图中如果space是VirtualAlloc,这里是没有初始化的
7.FARPROC space函数指针参数都没有

目前:没有用OD动态调试,存在些问题,也没有用IDA看
这两函数没怎么用过
getprocadress,返回的是函数指针
参考c语言,函数指针那节内容
所谓成功,是函数功能正确实现

4.9:昨天为什么编译器没有报错的问题清楚了:FARPROC space,中的space的值只有在space=GetrocAddress(hModule, “VirtualAlloc”);执行后才有意义(指向VirtualAlloc的入口)。只用程序运行过了,space才会指向VirtualAlloc函数,否则是随机值,所以编译器在编译时不检查他的格式和参数,编译器甚至不知道此处调用的是VirtualAlloc()这个函数。既然都不知道将会调用哪一个API函数,所以也就无法检查合法,编译器就不会报错

虽说试着跟进loadLibraryA里面查看,但是转悠半圈一路跟到了loadLibraryExW以后,再到LdrLoadDll的时候就非常复杂看不懂了,去网上找了篇博客https://blog.csdn.net/xiangbaohui/article/details/103743201

对于GetProcAddress,也是根据网上的博客(https://blog.csdn.net/half_face/article/details/51511094)来看,是读取了已经载入的dll的PE文件头(可惜这篇博客引用的看雪论坛的帖子我访问的时候跳到了看雪主页,不知道是已经被删除还是隐藏了),所以不知道具体是如何获得的PE头,但是PE头内部似乎存在[typedef struct _IMAGE_EXPORT_DIRECTORY]里面按照下标对应的方式保存了DLL内部每一个导出函数的导出名、导出序号、内存地址(或者是偏移量也许)

对于loadLibraryA,在LdrLoadDll里面我只看到了LdrpLoadDll和很多个call sub_这样的未命名函数,对于LdrpLoadDll里面有加载文件的call,但是写锁的call没有看到,可能是call sub也可能是汇编直接实现了,用dbg下了个dll载入是断点,然后一直步过,遇到某个call触发了这个dll载入的断点就重载程序重新跟入这个call,重复操作,会进入n个call(跟不完的那种)。然后我想到,这个断点触发的条件可能是内存映射完成的时候,也就是博客里面提到的,dll加载进度到一半的时候,所以这样做估计没有意义就没有继续跟了

改后代码

#include <windows.h>
#include <wchar.h>
#include <string.h>
#include <stdio.h>
int main()
{HMODULE hModule = 0;typedef int (*space)(LPVOID , SIZE_T , DWORD, DWORD);hModule = LoadLibraryExA("kernel32.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);if (!hModule){printf("erro!!");}space  AVirtualAlloc = (space)GetProcAddress(hModule, "VirtualAlloc");if (!AVirtualAlloc){printf("erro!!");}else{char* ch = (char*)AVirtualAlloc(NULL,1024, MEM_RESERVE, PAGE_READWRITE);if (ch!=NULL){printf("success!");}}return 0;
}

http://www.ppmy.cn/news/41082.html

相关文章

基于springboot的在线考试系统源码数据库论文

目 录 目 录 第一章 概述 1.1研究背景 1.2 开发意义 1.3 研究现状 1.4 研究内容 1.5论文结构 第二章 开发技术介绍 2.1 系统开发平台 2.2 平台开发相关技术 2.2.1 Java技术 2.2.2 mysql数据库介绍 2.2.3 MySQL环境配置 2.2.4 B/S架构 2.2.5 Spr…

ES6 Symbol的介绍与创建

ES6 Symbol的介绍与创建 ES6 引入了一种新的原始数据类型 Symbol&#xff0c;表示独一无二的值。它是JavaScript语言的第七种数据类型。 u &#xff1a;undefined s &#xff1a;string symbol o &#xff1a;object n &#xff1a;null number b &#xff1a;boolean Symbol…

springboot的rest服务配置服务的根路径

如果不配置默认为空&#xff0c;如下是application.yml文件只配置了端口号 server:port: 6868 那么访问时直接访问服务即可 如果配置了rest服务 RestController RequestMapping("/netLicense") public class NetLicenseController {RequestMapping("/getLice…

分布式计算技术(下):Impala、Apache Flink、星环Slipstream

实时计算的发展历史只有十几年&#xff0c;它与基于数据库的计算模型有本质区别&#xff0c;实时计算是固定的计算任务加上流动的数据&#xff0c;而数据库大多是固定的数据和流动的计算任务&#xff0c;因此实时计算平台对数据抽象、延时性、容错性、数据语义等的要求与数据库…

用idea操作hbase数据库,并映射到hive

依赖条件&#xff1a;需要有Hadoop&#xff0c;hive&#xff0c;zookeeper&#xff0c;hbase环境映射&#xff1a;每一个在 Hive 表中的域都存在于 HBase 中&#xff0c;而在 Hive 表中不需要包含所有HBase 中的列。HBase 中的 RowKey 对应到 Hive 中为选择一个域使用 :key 来对…

jsoup 简单解析html ul li

在使用 Jsoup 解析 HTML 中的 <ul> 和 <li> 元素时&#xff0c;可以使用 select() 方法和 CSS 选择器来选取它们。下面是一个简单的例子&#xff1a; String html "<ul><li>Item 1</li><li>Item 2</li><li>Item 3</…

四次挥手刨根问底19问详解,全网最全

1.请描述一下TCP连接的四次挥手过程&#xff1f; 回答&#xff1a;TCP连接的四次挥手过程包括以下步骤&#xff1a; 步骤1&#xff1a;客户端向服务器端发送一个FIN报文段&#xff0c;请求关闭连接。 步骤2&#xff1a;服务器端收到FIN报文段后&#xff0c;向客户端发送一个…

JVM 垃圾收集器详解

一、垃圾收集器 如果说收集算法是内存回收的方法论&#xff0c;那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定&#xff0c;因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别&#xff0c;不同的虚…