首页
社区
课程
招聘
[原创]内存加载Dll(支持32位,支持win32 dll,mfc dll,其他语言生成的dll,不支持加密压缩)
发表于: 2018-8-1 12:23 9413

[原创]内存加载Dll(支持32位,支持win32 dll,mfc dll,其他语言生成的dll,不支持加密压缩)

2018-8-1 12:23
9413

几年前写过一份内存加载PE文件的项目,支持exe和dll,但不支持mfc dll
去年整理了一下重新写了代码,省略了一些功能,只用来加载dll

编译环境:

  • vs2005
  • vc6.0

支持:

  • 标准Win32 Dll
  • MFC Dll
  • 易语言Dll
  • 其他Dll(这个没怎么测试)

不支持:

  • 加密Dll
  • 压缩Dll(具体看压缩流程)

 

File: include/ldr.h

/* __ldr_header__ */

#ifndef __LDR_H__
#define __LDR_H__

#ifdef _DEBUG
#pragma comment(lib, "image.d.lib")
#else
#pragma comment(lib, "image.lib")
#endif

#ifdef _WIN32
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>
#include <WinNT.h>
#else
#error Current platform is not supported
#endif

typedef PVOID (__stdcall *malloc_t)    (ULONG);
typedef VOID  (__stdcall *free_t)    (PVOID);

PVOID    LdrLoadImage        (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID    LdrGetProcAddress    (PVOID Addr, LPCSTR Name);
VOID    LdrFreeImage        (PVOID Addr);

#endif

Dll处理接口

PVOID    LdrLoadImage        (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID    LdrGetProcAddress    (PVOID Addr, LPCSTR Name);
VOID    LdrFreeImage        (PVOID Addr);

 

之前发过一个帖子,用的易语言封装了编译的lib测试的内存加载Dll
易语言封装lib用例

 

项目源码

 

顺便说一下,对MFC Dll的支持主要是处理了GetModuleHandle相关的API,做了一层中间层


 

File: image/traps/GetModuleHandleW.asm

.386
.Model flat, StdCall
Option CaseMap: none

Include    trap.inc

.Const

.Data?

.Data

.Code

GetModuleHandleWTrap Proc Uses Ebx Ecx Edx Esi Edi, lpModuleName: Ptr WCHAR
    ; Mov Esi, 0x********
    Mov_Esi_Information
    ; Pointer to ImageInformation
    Assume Esi: Ptr ImageInformation

    .If lpModuleName == 0
        Push 0
        Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
    .Else
        Lea Ebx, [Esi].ModuleNameW
        Push Ebx
        Push lpModuleName
        Call [Esi].apis.lstrcmpiW

        Cmp Eax, 0
        Je __COPY

        Lea Ebx, [Esi].ModuleBaseNameW
        Push Ebx
        Push lpModuleName
        Call [Esi].apis.lstrcmpiW   

        Cmp Eax, 0
        Jne __CALL

    __COPY:
        Mov Eax, [Esi].imagebase
        Jmp @F

    __CALL:    
        Push lpModuleName
        Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
    @@:
    .EndIf

    Return Eax
GetModuleHandleWTrap EndP

End

 

肯定有人觉得为什么不支持x64,主要还是自己平时没那么时间弄,要上班,之前一直想迭代一下支持压缩加密啥的,也一直搁着,哎~


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

最后于 2019-1-16 16:12 被KamiBoy编辑 ,原因: 源代码地址变更
收藏
免费 2
支持
分享
最新回复 (16)
雪    币: 8188
活跃值: (2777)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
支持一下,这个trap不用汇编写吧。。。
2018-8-1 14:41
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
layerfsd 支持一下,这个trap不用汇编写吧。。。
这是一段shellcode 在加载Dll的时候会填充在Dll实际内存的附近,因为汇编写,容易控制好,所以就用汇编写了,Dll卸载的时候也会清理掉
2018-8-1 17:19
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2018-8-2 23:15
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
KamiBoy 这是一段shellcode 在加载Dll的时候会填充在Dll实际内存的附近,因为汇编写,容易控制好,所以就用汇编写了,Dll卸载的时候也会清理掉
大佬 。易语言咋调用啊。 我编译出来 复制了LIB  没找到支持库啊
2018-8-3 01:06
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
pengqiang 大佬 。易语言咋调用啊。 我编译出来 复制了LIB 没找到支持库啊
易语言能直接引用.lib的库,给你一个我之前发过的帖子:http://bbs.eyuyan.com/read.php?tid=400480
2018-8-3 10:40
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
KamiBoy 易语言能直接引用.lib的库,给你一个我之前发过的帖子:http://bbs.eyuyan.com/read.php?tid=400480
易语言应该也有人封装过内存加载模块,但我不确定是不是支持mfc dll,我自己封装就是因为大都不支持mfc dll,都是以标准win32 dll来进行加载的
2018-8-3 10:42
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
KamiBoy 易语言应该也有人封装过内存加载模块,但我不确定是不是支持mfc dll,我自己封装就是因为大都不支持mfc dll,都是以标准win32 dll来进行加载的
感谢大佬  我用黑月编译的 我测试下 。我看过别人发的APC 注入 也是内存加载 。但是有的系统不支持 比较烦。 VC 又不懂
2018-8-3 11:57
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
pengqiang 感谢大佬 我用黑月编译的 我测试下 。我看过别人发的APC 注入 也是内存加载 。但是有的系统不支持 比较烦。 VC 又不懂
嗯,你用黑月试试,我没测试过黑月
2018-8-3 13:00
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
KamiBoy 嗯,你用黑月试试,我没测试过黑月
黑月不行··。 我还是慢慢学VC吧,。 痛苦
2018-8-3 16:22
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
pengqiang 黑月不行··。 我还是慢慢学VC吧,。 痛苦
黑月报什么错?
2018-8-3 23:18
0
雪    币: 1
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问大佬 原来不支持mfc 从原理上说的主要问题是什么呢?
2018-8-11 20:24
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
AIR_292991 请问大佬 原来不支持mfc 从原理上说的主要问题是什么呢?
MFC DLL 内部会调用 GetModuleHandle 来获取当前模块的句柄,但是不对模块挂链或对GetModuleHandle进行处理,就会返回NULL导致crash
2018-8-11 23:50
0
雪    币: 130
活跃值: (639)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
下载地址在哪啊
2018-8-12 10:57
0
雪    币: 130
活跃值: (639)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
请问下这个 怎么使用呢
2018-8-12 11:09
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
书生怕怕 请问下这个 怎么使用呢
帖子里留了开源地址,源代码可以直接编译生成.lib静态库,直接在自己的项目中引入接口就可以
2018-8-13 18:13
0
雪    币: 238
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
如果要支持x64的话,需要做些什么修改呢
2018-12-14 09:46
0
游客
登录 | 注册 方可回帖
返回
//