博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟DLL加载
阅读量:6602 次
发布时间:2019-06-24

本文共 1656 字,大约阅读时间需要 5 分钟。

#include 
#include
#include
typedef int (*PFUNC)(int,int);typedef struct{ int Position; int Length;}Fun;typedef struct{ int num; Fun *pFun;}Lib;int main(){ int FileSize =0; char FileName[] = "code.obj"; FILE * FileHandle = fopen(FileName,"rb"); if(FileHandle!=NULL) { Lib lib; fread(&lib.num,sizeof(char),4,FileHandle); //确定文件中有几个函数 lib.pFun =(Fun*)malloc(sizeof(Fun)*lib.num); fread(lib.pFun,sizeof(Fun),lib.num,FileHandle); //读取文件中第一个函数的信息,(在文件中的)地址和长度 char *instruction= (char*)malloc(sizeof(char)*lib.pFun->Length); //根据函数在内存中为函数分配空间 fseek(FileHandle,lib.pFun->Position,0); //移动至函数地址,以字节为单位,0代表文件第一个字节 fread(instruction,sizeof(char),lib.pFun->Length,FileHandle); //读取函数指令到预留内存 PFUNC pfunc = (PFUNC)instruction; printf("%d \n",pfunc(3,4)); //执行函数 }}/*说明:1)没有附带函数类型信息,如果支持函数类型信息,那么可以说这就是DLL文件2)读取文件时可以把文件想象成一个char A[m],有一个char的指针指向到这个 数组,并在这个数组中前后移动,初始指到A[0],我们总是从这个指针指向的 地址向后读取一定的字节复制到另一个数组,假设指针指向A[0],我们要读取 10个字节,读取完之后,指针定位到A[10],当然,我们也可以借助fseek任意的 移动指针size_t fread(void *buffer,size_t size,size_t count,FILE *stream){ int i=0; while(stream->ptr!=NULL && i
ptr; (stream->ptr)++; } return i;} // 假想的函数代码 int fseek( FILE *stream,long offset,int origin){ stream->ptr = offset + origin}*/

CODE.OBJ

01 00 00 00 0C 00 00 00 2B 00 00 00 55 8B EC 81
EC C0 00 00 00 53 56 57 8D BD 40 FF FF FF B9 30
00 00 00 B8 CC CC CC CC F3 AB 8B 45 08 03 45 0C
5F 5E 5B 8B E5 5D C3

转载于:https://www.cnblogs.com/code-style/p/4602899.html

你可能感兴趣的文章
centos 7 编译 php 5.3.28
查看>>
Java常用包总结
查看>>
Wordpress xmlrpc.php暴力破解漏洞
查看>>
Nginx完整配置说明
查看>>
jacoco-maven-plugin 父子工程 远程获取覆盖率
查看>>
如何防范短信接口被恶意调用(被刷)
查看>>
GSON混淆后执行错误
查看>>
RBAC权限管理
查看>>
【Java对象生命周期】Java对象的生命周期:java是怎么分配内存的和怎么回收的?...
查看>>
高性能的通讯库-zeroMQ的几个高性能特征
查看>>
云计算学习1
查看>>
Elasticsearch教程
查看>>
学校内网802.1X认证连接
查看>>
如何优化COCOS2D/X程序的内存使用和程序大小
查看>>
Docker与Vagrant之间的特点比较
查看>>
妥善的处理重试请求
查看>>
我的友情链接
查看>>
drools名词术语总结
查看>>
CAS的Session两秒挂掉?--解决退出后登录,页面刷新的问题
查看>>
Android的SDK与ADT不匹配问题
查看>>