Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
L
Lab016
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
CS Lab Group
实验项目模板
实验模板
Lab016
提交
887cfaec
提交
887cfaec
12月 13, 2018
创建
作者:
赵鹏翀
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
init template
上级
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
118 行增加
和
0 行删除
+118
-0
.gitignore
.gitignore
+2
-0
Lab016.csproj
Lab016.csproj
+31
-0
Lab016.puo
Lab016.puo
+0
-0
console.c
console.c
+53
-0
console.h
console.h
+32
-0
没有找到文件。
.gitignore
0 → 100644
浏览文件 @
887cfaec
/Debug
/Release
Lab016.csproj
0 → 100644
浏览文件 @
887cfaec
<?xml version="1.0" encoding="gb2312"?>
<ASMProject
Version=
"1.00"
Name=
"Lab016"
TemplatePath=
"console(c)\Project"
ProjectID=
"ca12aafa-5220-45b7-a28f-d2bd47c7cb60"
IsSubmitWork=
"0"
>
<Configurations>
<Configuration
Name=
"Debug"
DebuggerFlavor=
"0"
>
<Tool
Name=
"PreBuildEventTool"
/>
<Tool
Name=
"CustomBuildTool"
/>
<Tool
Name=
"GCCCompilerTool"
PreprocessorDefinitions=
"_DEBUG"
GenerateDebugInformation=
"-1"
LanguageStandard=
"c99"
/>
<Tool
Name=
"PreLinkEventTool"
/>
<Tool
Name=
"GCCLinkerTool"
/>
<Tool
Name=
"PostBuildEventTool"
/>
</Configuration>
<Configuration
Name=
"Release"
DebuggerFlavor=
"0"
>
<Tool
Name=
"PreBuildEventTool"
/>
<Tool
Name=
"CustomBuildTool"
/>
<Tool
Name=
"GCCCompilerTool"
PreprocessorDefinitions=
"NDEBUG"
LanguageStandard=
"c99"
/>
<Tool
Name=
"PreLinkEventTool"
/>
<Tool
Name=
"GCCLinkerTool"
StripDebugInfo=
"-1"
/>
<Tool
Name=
"PostBuildEventTool"
/>
</Configuration>
</Configurations>
<Files>
<Filter
Name=
"ͷļ"
Filter=
"h;hpp;hxx"
>
<File
RelativePath=
".\console.h"
>
</File>
</Filter>
<Filter
Name=
"Դļ"
Filter=
"cpp;c;cc;cxx"
>
<File
RelativePath=
".\console.c"
>
</File>
</Filter>
</Files>
</ASMProject>
Lab016.puo
0 → 100644
浏览文件 @
887cfaec
添加文件
console.c
0 → 100644
浏览文件 @
887cfaec
#include "console.h"
#include <Windows.h>
char
DllName
[
20
]
=
"library.dll"
;
// 将读入的文件名保存为全局变量
char
intput
[
10
];
typedef
int
(
*
pFun
)(
int
a
,
int
b
);
// 函数指针类型
int
main
(
int
argc
,
char
*
argv
[])
{
FILE
*
fp
;
// 文件指针
int
result
;
// 保存文件读入结果
// 设定开辟内存的起始地址
// 取得开辟的内存空间起始地址
int
*
pImageBase
=
VirtualAlloc
(
NULL
,
DLL_SIZE
,
MEM_RESERVE
|
MEM_COMMIT
,
PAGE_EXECUTE_READWRITE
);
// 调用VirtualAlloc开辟内存空间,执行成功后返回开辟的初始地址
// 判断是否开辟成功
// 将返回地址打印
printf
(
"将动态链接库文件的加载基址设置为以下地址:0x%x
\n
"
,
pImageBase
);
// 通过调用scanf让程序在此处暂停,在此时可通过获得的起始地址修改DLL的加载地址,然后重新生成后复制到此项目下供读入内存
printf
(
"输入任一字符,按下回车后将%s读入内存...
\n
"
,
DllName
);
scanf
(
"%s"
,
intput
);
// 尝试打开文件
// 将动态链接库文件读入到开辟的内存空间中
// 判断是否读入成功,若成功,则返回值与文件大小相同,否则读入文件失败
// 通过解实验7 任务(一)的程序解析动态链接库文件,取得导出函数的偏移地址。则在内存中导出函数的地址是:开辟内存空间的起始地址 + 偏移地址
// 将函数指针设置为导出函数的地址
// 通过地址调用导出函数SampleFunSum
// 关闭文件
// 调用VirtualFree释放开辟的内存空间。若成功释放,则返回非0值。失败则返回0
// 判断是否释放成功
int
c
=
VirtualFree
(
pImageBase
,
0
,
MEM_RELEASE
);
if
(
!
c
)
{
printf
(
"释放所开辟的内存空间失败!
\n
"
);
exit
(
1
);
}
return
0
;
}
console.h
0 → 100644
浏览文件 @
887cfaec
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include <stdio.h>
/* TODO: 在此处引用程序需要的其他头文件 */
#define DLL_SIZE 0x4000 // 设定开辟内存空间64K
// VirtualAlloc flAllocationType
#define MEM_COMMIT 0x1000 // 分配指定保留的内存页的物理存储在内存或磁盘上的分页文件
#define MEM_RESERVE 0x2000 // 保留在没有任何实际的物理存储在内存或磁盘上的分页文件
#define MEM_RESET 0x3000 // 页面不应该被读出或写入到分页文件
#define MEM_LARGE_PAGES 0x20000000 // 分配内存使用大页面支持
#define MEM_PHYSICAL 0x400000 // 储备的地址范围,可用于内存地址窗口扩展的页面
#define MEM_TOP_DOWN 0x100000 // 在尽可能高的地址分配内存
// VirtualFree FreeType
#define MEM_RELEASE 0x8000 // 释放分配的内存空间
// VirtualAlloc flProtect
#define PAGE_EXECUTE 0x10 // 区域包含可执行的代码
#define PAGE_EXECUTE_READ 0x20 // 区域包含可执行的代码,应用程序只能读该区域
#define PAGE_EXECUTE_READWRITE 0x40 // 区域包含可执行的代码,应用程序可读写该区域
#define PAGE_EXECUTE_WRITECOPY 0x80 // 区域包含可执行的代码,应用程序可读写镜像文件的代码页
#define PAGE_NOACCESS 0x01 // 任何访问该区域的操作都将被拒绝
#define PAGE_READONLY 0x02 // 区域不含可执行代码,该区域为只读
#define PAGE_READWRITE 0x04 // 区域不含可执行代码,应用程序可读写该区域
#define PAGE_NOCACHE 0x200 // RAM中的页映射到该区域时将不会被微处理器缓存
#endif
/* _CONSOLE_H_ */
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论