模拟DLL加载

#include <stdio.h>
#include <malloc.h>
#include <sys/stat.h>
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<count)
    {
        buffer = stream->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

时间: 2024-10-01 04:48:56

模拟DLL加载的相关文章

利用dll加载漏洞实现远程代码执行

微软的"不安全dll加载"漏洞涉及Windows XP至Windows 7等多个版本的操作系统.由于Windows存在加载未指明完整路径的dll文件的机制,可能导致用户在使用第三方软件.玩游戏.听音乐时,会加载由木马 病毒伪装而成的dll文件,从而让木马病毒运行起来. 例如,当我们实例化一个对象,Windows会尝试从当前工作目录中加载一个或多个DLL动态库文件.如果我们能诱使受害者,打开一个包含木马的 DLL文件目录,那么攻击者的木马将被执行.从而导致受害者的电脑可以被攻击者远程执行

ACCESS DLL加载错误

如今还在用ACCESS 2003,太懒没办法,升到2010变化太大了,做个Access的转版挺麻烦的.况且大家都在使用2003,也就懒得搞了. 但问题是office 2003已经out了,(Office 2003 已于 2014 年 4 月 8 日退役了).必须用新版的word和excel.公司里有些同事会用其他办法搞定,如wps,转换器之类的. 今天有同事打开2003版的mdb时发现,打开xx窗出现错误,什么加载错误之类的.开始以为是office update坏的事,于是重装Access200

模块“XXX.dll”加载失败

具体问题:模块“XXX.dll”加载失败 请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的.DLL文件是否有问题  找不到指定的模块. 1.在安装C++软件的时候,有时候安装失败提示“请确保二进制储存在指定的路径中,或者调试他以检查该二进制或相关的DLL文件”,这个应该是自己的电脑没有安装VC运行库,可以去微软下载安装. 2.还有以下方法. 解决win7运行批处理出错不能注册dll等问题 引用: http://blog.csdn.net/nxeexn/article/detai

Dll加载总是出问题,显示无法加载

我从网上找了一个类似的问题,具体的内容如下 创建了个mfc的共享链接库,里面只有这样一个加法 _declspec(dllexport) int add(int a,int b){ return a+b ; } 然后创建了个mfc的exe,选择对话框,添加一个按钮,事件里面 extern int add(int a,int b) ; void CDllTestDlg::OnBnClickedBtnAdd() { CString str ; m_xx= add(1,35) ; UpdateData(

DLL加载失败的情况分析

场景说明: 将断点定位在上面的HMODULE instance = ::LoadLibrary(filename.c_str());函数,当加载ueroutealg.dll的时候,发现句柄为空,然后通过添加如下代码:DWORD dwError = GetLastError(); 在该函数的背后,收集到加载失败的错误码:[127]-找不到指定的程序.点击VS菜单,然后选择工具,点击错误查找,输入127. 解决分析: 1)  一般的情况是程序采用了动态加载的方式来运行,在加载DLL的过程,发现程序需

dll加载遇到的问题

dll加载有两种形式,分别是隐式加载和显式加载. 隐式加载在编译的时候就将dll文件编译到可执行文件中去,程序发布的时候可以不用讲dll带着.缺点是,这样编译出来后,程序会很大. 显式加载是指在程序运行过程中,需要用到dll里的函数时,再动态加载dll到内存中.这种加载方式因为是在程序运行后再加载的,所以可以让程序启动更快,而且dll的维护更容易,使得程序如果需要更新,很多时候直接更新dll,而不用重新安装程序.只是这种加载方式,函数调用稍微复杂一点. 我在项目中采用的是隐式加载,遇到的问题是"

Canvas——使用定时器模拟动态加载动画!

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> </style> </head> <body> <canvas id="canvas" width="500" height=&q

easyui清除dategrid所有数据(模拟本地加载)

$("#transitDetail").datagrid('loadData', { total: 0, rows: [] }); reload,load方法效果同上 来自为知笔记(Wiz)

加载dll、lib库

2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 **************************************************************************************************************************************************** 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有