首页
社区
课程
招聘
[旧帖] 从内存中加载DLL(C++)的疑问 0.00雪花
发表于: 2014-9-29 01:15 16465

[旧帖] 从内存中加载DLL(C++)的疑问 0.00雪花

2014-9-29 01:15
16465
大家好,我正在做的程序想要做一个保护,其实有一个就是从内存中加载DLL,不让DLL文件落地。用了一个网上比较流行的库
https://github.com/fancycode/MemoryModule
这个库确实比较强大,和Windows API LoadLibraryA的流程是一样的。

环境:Win8 Ent X64 , VS2013 Update 2, Opencv 2.4.8
编译参数:Multi-threaded Debug (/MTd)
opencv 2.4.8 用的静态编译的方式

问题:调用了opencv里面一个很简单的cvColor函数,里面有并行计算的库,用标准的LoadLibrary加载可以执行,但是用MemoryModule库执行就会出错

说明:如果opencv是用dll编译方式是没问题的,但是为了dll完全隐藏用的是static编译方式,就会出问题

大家需要先下载 opencv库,2.4.8或者2.4.9都可以,如果是2.4.9可能需要自己修改一下导入库的名称,希望大侠们帮忙看看

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (22)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个是有缺陷的 例如MFC的DLL他就无法加载
2014-9-29 01:21
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
M$的加载过程比这个开源代码复杂了很多很多~
2014-9-29 02:53
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看看,估计是个不错的开源库。
2014-9-29 08:16
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
关注!
2014-9-29 08:32
0
雪    币: 17683
活跃值: (4666)
能力值: ( LV15,RANK:1820 )
在线值:
发帖
回帖
粉丝
6
我有些疑惑,也许是我理解有问题
LoadLibrary与MemoryLoad 难道不都是针对 DLL的?
假设都是。

后面提的”openvc编译为dll可以“,我理解为LoadLibrary与MemoryLoad都可以成功加载并执行。
         而"openvc静态编译“,我理解为不产生DLL,既然不产生DLL,又何来LoadLibrary与MemoryLoad的使用?

路过,表示对问题感到疑惑。
2014-9-29 08:51
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
回复6楼 HHHso:

这里我的描述可能不是太准确
1. 我是引入的*.lib,如果是lib还得依赖DLL的方式,也就是编译出来后我的程序得和opencv2.4.8_core.dll这种文件放在一块儿才能执行。这种方式我试过,里面的cvColor方式是可以成功执行(这时候执行cvColor是在opencv2.4.8_core.dll里面执行的,不确定是这个dll,只是举例),不会报错的
2. 我现在期望的是,引入的lib不依赖任何DLL的文件了,也就是静态编译,编译出来后,可以不依赖任何DLL文件,这时候执行cvColor其实是在我自己的程序里面执行的,这时候会出错
2014-9-29 09:23
0
雪    币: 100
活跃值: (323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
opencv 安装包不是有带静态库吗。。。
2014-9-29 11:18
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
这是DLL Loader

根据导出函数进行调用
2014-9-29 11:24
0
雪    币: 608
活跃值: (643)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
建议你去逆一下MS的DLL加载过程 不仅仅是ImageFile+FixRelocation+FixIAT这三步
2014-9-29 12:58
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是的,我现在就是用的静态库,内存加载DLL出的问题,用DLL库反而不会出问题
2014-9-29 13:35
0
雪    币: 100
活跃值: (323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你看看 static lib 吧。  搞这么猥琐做什么。。。MT方式编译
2014-9-29 13:36
0
雪    币: 3933
活跃值: (2370)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主是想使用Opencv库,但又不想在本地有dll文件吗?
OPENCV静态编译后直接调用链接不就行了吗?
2014-9-29 13:46
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我觉得我是不是有必要潜心研究一个月的LoadLibraryA的代码,其实之前我大体看过这一部分代码,取自于ReactOS的源码,没有细看,其实大体流程和memoryMoudle差不多
1. 验证文件是否合法
2. 拷贝头部
3. 修复 imageBase
4. copy section
5. 重定位的处理
6. 修复导入表
7. 设置每个section对应不同的内存访问权限

希望有过类似经验或者对这一块非常了解的兄弟能启发小弟一下
2014-9-29 13:48
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
15
何不试试哥写的
git clone git://git.code.sf.net/p/mmloader/code mmloader-code

不光实现了内存模块,而且整个代码实现了shellcode化,简而言之,你把那段shellcode 复制到没错中,然后获取首地址,当作函数,传入指定模块路径就行了,具体看Demo吧,比你找的那个网上的靠谱多了。
2014-9-29 13:52
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
回复12和13楼的兄弟:

理解你们的意思,是想让我用EXE直接静态编译opencv的库,这样没有dll跟着跑

可是我现在为了保护程序,防止别人逆向,我是想EXE 从服务端下载dll执行,这样dll不用落地,起码给逆向增加了难度,因为想dump内存出来也是能破的,但是这样提高了逆向的门槛
2014-9-29 13:54
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
高人,我先下下来试试先
2014-9-29 13:57
0
雪    币: 3933
活跃值: (2370)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
防逆向的话这样做个人感觉意义不大。
2014-9-29 13:59
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
能不能指点一下防逆向的方法
2014-9-29 14:13
0
雪    币: 3933
活跃值: (2370)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
了解一下逆向的原理和方法,反其道而行之。
2014-9-29 19:37
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
DLL他就无法加载
2014-9-29 20:12
0
雪    币: 261
活跃值: (537)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22

看了下 代码写的不错  不过很三心二意。
2014-11-24 17:12
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我觉得14楼说的很有道理。我也学习了
2014-12-13 14:12
0
游客
登录 | 注册 方可回帖
返回
//