首页
社区
课程
招聘
[求助]如何在程序中加载两份同样的DLL文件呀?
发表于: 2014-3-5 10:33 6326

[求助]如何在程序中加载两份同样的DLL文件呀?

2014-3-5 10:33
6326
看到书上说游戏保护中通常会自加载一份或多份一样的DLL,但是我自己尝试了一下,为啥不行呀?求大牛说说思路。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
改个名字
2014-3-5 10:35
0
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我改了呀,我想加载系统的文件,比如ws2_32.dll或者User32.dll,加载自己的文件改名字是没有问题的。但是加载系统的文件就不行,不知道为什么呀
2014-3-5 11:03
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
列出你详细的操作步骤及问题。

什么叫不行。 报错了?蓝屏了? 加了没反应?
2014-3-5 11:23
0
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
把user32.dll拷的我的程序目录下,改名为abc.dll,重新拷贝一份改名为def.dll,然后定义typedef int(WINAPI* PMessageBoxA)(HWND,LPCSTR,LPCSTR,int);       
HMODULE hLib1,hLib2;
        hLib1 = LoadLibrary(".\\abc.dll");
        hLib2 = LoadLibrary(".\\def.dll");
        PMessageBoxA func1 = (PMessageBoxA)GetProcAddress(hLib1,"MessageBoxA");
        PMessageBoxA func2 = (PMessageBoxA)GetProcAddress(hLib2,"MessageBoxA");
        func1(NULL,"Hello","sdf",MB_OK);
        func2(NULL,"Word","abd",MB_OK);
        getch();
        FreeLibrary(hLib1);
        FreeLibrary(hLib2);
在VC++6.0环境中测试,系统是WIN7 32旗舰版+AMD CPU 然后现象是只显示了一个MessageBox,而且内容显示为空,标题有。第二个MessageBox没有显示。用PC Hunter看了一下,进程模块中只有abc.dll。没有报错,没有蓝屏。大概就是这个情况。
2014-3-5 12:34
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大哥。。。 你loadlibrary 的时候 都不判断返回值的么?

没有加载成功直接使用取函数的话。 Func2会是空指针。直接就崩溃了。
2014-3-5 13:06
0
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我单步调试的时候,看过 函数返回成功了。没有崩溃。
2014-3-5 13:10
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好神奇。 我这是win7 x64 . 两个加载的都是NULL。。。 重现不了你这种情况。
2014-3-5 13:20
0
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我的是32位的系统 ,可以加载,但是显示的不对,不知道为啥,按理应该可以呀。X64不能加载,不管怎么说,这里肯定有些问题吧。
2014-3-5 13:51
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我建议你单步在第二个load 的时候 打开 程序看看已加载模块。  因为如果没有模块的话。 Func2肯定是NULL的。 那不崩溃就怪了。
2014-3-5 13:54
0
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我直接把工程和dll文件打包发上来吧,麻烦各位win7 x86的朋友帮忙测试一下。
WIN7 X32平台   VC++ 6.0
abc.dll 和def.dll是拷自win7 x86 system32目录下的user32.dll文件改名的。

我单步看过了,打印的地址和模块地址都是有效的。
怕大家懒得看 我直接在把整个测试代码发一遍在下面。
#include <windows.h>
#include <stdio.h>
#include <conio.h>
typedef int (CALLBACK *PMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
typedef int (*PADD)(int x,int y);
void main()
{
        HMODULE hLib1,hLib2;
        PMessageBoxA func1,func2;
        hLib1 = LoadLibraryA("def.dll");
        printf("Last Error= %d!\n",GetLastError());
        func1 = (PMessageBoxA)GetProcAddress(hLib1,"MessageBoxA");
        printf("Last Error= %d!\n",GetLastError());
        if (func1!=NULL)
        {
                func1(NULL,"Hello","Lib1",MB_OK);
                printf("Last Error= %d!\n",GetLastError());
        }
        hLib2 = LoadLibraryA("abc.dll");
        printf("Last Error= %d!\n",GetLastError());
        func2 = (PMessageBoxA)GetProcAddress(hLib2,"MessageBoxA");
        if (func2!=NULL)
        {
                func2(NULL,"Word","Lib2",MB_OK);
                printf("Last Error= %d!\n",GetLastError());
        }
        printf("hLib1 = 0x%08X,func1 = 0x%08X\nhLib2 = 0x%08X,func2 = 0x%08X\n",hLib1,func1,hLib2,func2);
        _getch();
        FreeLibrary(hLib1);
        FreeLibrary(hLib2);

        hLib1 = LoadLibrary("DllDemo1.dll");
        hLib2 = LoadLibrary("DllDemo2.dll");
        PADD func3,func4;
        func3 = (PADD)GetProcAddress(hLib1,"add");
        func4 = (PADD)GetProcAddress(hLib2,"add");
        func3(10,30);
        func4(10,100);
       
        printf("hLib1 = 0x%08X,func3 = 0x%08X\nhLib2 = 0x%08X,func4 = 0x%08X\n",hLib1,func3,hLib2,func4);
        FreeLibrary(hLib1);
        FreeLibrary(hLib2);
}
下面是附件工程:
testLoadDll.zip
上传的附件:
2014-3-6 10:11
0
雪    币: 4458
活跃值: (3874)
能力值: ( LV8,RANK:138 )
在线值:
发帖
回帖
粉丝
12
用PE工具修改下DLL的默认基址试试吧…
2014-3-16 16:21
0
雪    币: 30
活跃值: (3385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
映射内存,偏移不同
2014-3-17 00:22
0
游客
登录 | 注册 方可回帖
返回
//