首页
社区
课程
招聘
[求助]烦请各位大大综合评价下我的方案设计
发表于: 2017-12-22 09:56 2926

[求助]烦请各位大大综合评价下我的方案设计

2017-12-22 09:56
2926
    各位大大好,最近在做模块封装的工作,暂且命名为a.dll。在封装的过程中发现,a.dll存在较多的读取零散小的配置文件的情况,就想:“能不能把这些配置文件内置进模块。”正好最近看到了一个预编译宏#pragma comment(link,"/SECTION:xxx,xxx"),此宏用以通知编译器在生成的pe文件中创建额外的数据段或代码段,于是方案就出来了。我添加了一个新的数据段,里面定义了一个数据缓冲区,命名为a.buf,属性设置为可写、可读和可共享。测试中发现,a.dll运行时修改的a.buf并没有在运行结束时回写到a.dll模块源文件中,于是在网上搜寻了n多资料,了解到,windows平台dll模块的加载是将模块映射进主执行进程的进程空间,对模块本身并没有写的权限,那么我想能不能我自己加载a.dll模块,让a.dll模块退出时通知加载模块修改dll源文件,主应用程序通过加载模块访问a.dll的方法,于是乎loaddll.lib模块出现了(PS:写成静态库纯粹是不想增加额外模块)。进而又考虑到安全和文件大小问题,既然模块我都能加载了,那加个密,压缩一下也就成了很easy的事,于是整套方案出来了:编译源代码->a.dll源代码中添加退出时调用加载模块loaddll.lib的方法,通知自己修改后并压缩加密的数据块->加载模块通过获得的数据快修改a.dll的pe文件内存镜像;主应用程序通过加载模块loaddll.lib 加载并调用a.dll的方法,首先将模块镜像到内存空间,然后通过解压缩,解密, 内存直接加载dll模块,在主应用程序退出时,通知加载模块loaddll.lib加密,压缩然后回写到源文件。
    不知各位大大觉得我的方案如何,能不能从破解,运行效率,内存使用,安全等方面,评价一下方案的优缺点,谢谢啦。

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
友情帮顶
2017-12-22 10:27
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不知什么原因,为啥我的dll函数都没办法执行,总是报错,能不能帮忙看看
2017-12-23 18:29
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
最好不要这样做,这样做安全性未知,你要是能自己修改自己的程序,我病毒也能给你加代码,到时候你这个程序就变成了一个漏洞,你安排一个漏洞给自己找麻烦么?windows之所以禁止你们这样做,原因是:以前的旧Windows是不禁止这样修改的,导致了程序的不稳定,以及病毒利用这个漏洞。所以,希望你不要这样做。
2017-12-23 19:18
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
你既然希望能操作数据,又希望数据能从模块文件中读出,为什么不这样设计:将默认配置放在模块中,运行时向程序所在目录创建一个临时目录,然后给与这个目录写入权限,再将配置文件写入这个目录,再次运行程序时,只需检查是否有临时文件,如果有直接读取,没有的话,重写文件就行了,这样既安全又方便
2017-12-23 19:27
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
给你个意见,有公开的安全的方法,就尽量使用公开的安全的方法,不要使用太多的未公开的方法,因为它们的安全性实在不可靠!(我就是一个例子,  使用未公开方法编程,结果玩坏了两块硬盘)
2017-12-23 19:30
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
漏洞什么的,平台问题,连远程注入什么的都存在十多种方法,安全什么的我就不指望了,只是为了达到封装的目的,才这样想的,不过还是谢啦
2017-12-23 20:22
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
hehelyc 漏洞什么的,平台问题,连远程注入什么的都存在十多种方法,安全什么的我就不指望了,只是为了达到封装的目的,才这样想的,不过还是谢啦
即使你不考虑安全,我也不建议你这样做,任意修改组成模块是很危险的事!任意修改PE节,我们都知道PE节空间有限,修改出PE节的空间就麻烦了,而且用这个宏编译出来的空间是按一定字节对齐的,剩余空间很小,编译出来的节基本只能容纳原来的数据和原来的数据中未对齐的剩余空间而已,而且这种加载方法有个严重的问题,就是如果你的DLL中使用了SEH错误处理的话,那么轻则函数无法运行,重则加载DLL时就会崩溃!如果你真要这样做,建议你在模块文件尾部进行添加数据操作,在尾部添加数据,不用考虑节的剩余空间,还可以加入HASH值,用来验证你的DLL模块!
2017-12-23 21:59
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
hehelyc 不知什么原因,为啥我的dll函数都没办法执行,总是报错,能不能帮忙看看
loaddll这个库函数没有处理DLL模块中的SEH错误处理链,DLL中SEH处理链的安装函数调用要比DllMain早,如果DLL中有SEH错误处理的话,由于模块的SEH没有初始化,会导致调用函数失败!这就是你的DLL函数无法运行的原因!
windows加载DLL的时候,是先检查模块是否有SEH初始化函数,如果有,优先调用它,然后才会调用DllMain,如果一个模块有SEH初始化函数,而没有执行的话,调用函数很可能会失败!
2017-12-23 22:07
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
hehelyc 不知什么原因,为啥我的dll函数都没办法执行,总是报错,能不能帮忙看看
loaddll是没有正确处理加载的DLL模块中IMAGE_DIRECTORY_ENTRY_EXCEPTION目录的异常处理表数据,以及IMAGE_DIRECTORY_ENTRY_TLS目录的线程局部变量的数据,这两个目录中的数据会被广泛使用到的,IMAGE_DIRECTORY_ENTRY_EXCEPTION目录的异常处理表数据由异常处理的初始化函数处理,而IMAGE_DIRECTORY_ENTRY_TLS目录的线程局部变量的数据Windows是自己处理的,而loaddll则是直接加载DLL,重定位之后,直接调用了DllMain,如果你的DLL使用了这些数据(有时候这些数据的使用的编译器隐藏的,用来支持编译器一些相关功能的数据),就有可能导致你的函数无法运行,除非你全局保证不使用(编译器也不使用)异常处理和线程局部变量TLS。
2017-12-23 22:23
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
hehelyc 不知什么原因,为啥我的dll函数都没办法执行,总是报错,能不能帮忙看看
如果,你真的不想出现一些奇奇怪怪的问题的话,你就在LoadDLL加载时自己处理相关DLL模块目录下的数据,否则,建议你还是使用正常的方法吧!
2017-12-23 22:26
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
hehelyc 不知什么原因,为啥我的dll函数都没办法执行,总是报错,能不能帮忙看看
对了,LoadDLL也没处理DLL的资源表,使用了DLL中的资源的DLL,他的资源表也需要你自己处理!
2017-12-23 22:28
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
其实,你的做法我也做过,也遇到过类似的问题,我问了很多人,都不知道时怎么回事,后来我看了一篇关于调试器编写的文章,我才知道,LoadDll做的事情过于简单了,我参考了WINDOWS早年泄露的源代码!才知道Windows的处理根本不像LoadDll做的那么简单!Windows加载DLL时,修改了PEB和TEB,还对数据进行了初始化操作,可是LoadDll中却没有做类似的事!你可以去参考WRK,这是Windows公开的用于教学的代码,看看Windows是如何加载一个DLL模块的!
2017-12-23 22:39
0
游客
登录 | 注册 方可回帖
返回
//