首页
社区
课程
招聘
[求助]如何使dll只能被指定程序调用?
2012-6-24 01:09 9442

[求助]如何使dll只能被指定程序调用?

2012-6-24 01:09
9442
比如我有个a.dll和b.exe,我想限定a.dll只能被b.exe调用,其他程序都不可以调用。

实现这一功能一般都有哪些思路呢?需要说明一点的是要将a.dll和b.exe脱离开来,因为b.exe程序经常更新,所以不能在a.dll里对b.exe进行文件校验。

我个人觉得是否可以在a.dll里检测exe进程里是否有指定的模块,从来来判断是否为b.exe?

希望各位能不吝赐教,谢谢!

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

收藏
点赞0
打赏
分享
最新回复 (17)
雪    币: 3460
活跃值: (1473)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chow 2012-6-24 06:46
2
0
肯定可以的,DLL被宿主加载就跟宿主混为一体了,在DLL里面的可以得到宿主的一切,一般做法是在DLL里面写个导出函数,EXE调用传个参数进去运算下效验是不是B调用,这样来判断,如果参数传的不正确 直接EXITPROCESS(0);
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdutlison 2012-6-24 09:38
3
0
谢谢你的回答!
主要是现在a.dll和b.exe是完全分离的,exe不会去校验是否为a.dll,就是说这个工作要让a.dll完成,这样也可以吗?比如我另外一个c.exe同样的参数来调用a.dll,那么a.dll是怎么区分是b调用还是c调用?

谢谢
雪    币: 337
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lichdm 2012-6-24 10:58
4
0
DllMain
雪    币: 1954
活跃值: (1815)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 9 2012-6-24 10:59
5
0
在DLL中计算下当前进程的hash值。
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdutlison 2012-6-24 12:50
6
0
这方法不适合调用exe经常更新的吧?如果exe更新了,这个hash不也变了?
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2012-6-24 21:15
7
0
可以在dll中检查进程名;进程pe中也可以加上一些固定偏移的特征来校验。
雪    币: 70
活跃值: (64)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yiyiguxing 1 2012-6-24 21:32
8
0
Aker的方法挺好,可以同时校验EXE PE中几处的和的HASH值,话说回来。。你把DLL校验函数再弄个自己的VM保护
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdutlison 2012-6-25 15:13
9
0
再说明白一点吧。

比如我要做一个dll给别人,但是要限定只能被他的exe调用。由于exe是他的,所以会随时更新,因此不能用校验文件MD5之类的来限制。这种情况下,是不是只能判断进程名?
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2012-6-25 15:23
10
0
可以提供一个动态dll/一个静态lib给对方,对方使用dll,同时也要静态链接lib,lib中包含你有的一些特征,规定对方以一定规则调用;这样,dll许可方就可以用dll,dll被第三方拿了是没有办法正常用的。

再考虑多点,可以尝试服务器验证。开始几次连接不管,多次连接你通过之后,做一些猥琐的验证,让他时而正常,时而不正常。
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yzxdev 2012-6-25 15:32
11
0
好办法,学习了
雪    币: 702
活跃值: (327)
能力值: (RANK:380 )
在线值:
发帖
回帖
粉丝
kvllz 8 2012-6-25 15:38
12
0
在exe后面附加一个固定的bin校验这个文件就行了
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2012-6-25 15:54
13
0
exe不是楼主可控的~
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdutlison 2012-6-25 16:10
14
0
这个不错
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdutlison 2012-6-25 16:11
15
0
检测模块的方法有没有可行性?因为对方的exe运行过程中有一个模块,一般别的进程是没有的。
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2012-6-25 16:19
16
0
可以做,没有关系的,跟对方说好了,你做了很多检查,如果有修改要和你的版本一起做;或者提供可选的配置。
雪    币: 9
活跃值: (939)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
网络游侠 2012-6-26 11:18
17
0
我个人觉得是否可以在a.dll里检测exe进程里是否有指定的模块,从来来判断是否为b.exe?

这个没用的,别人可以直接根据你检测的模块进行偷梁换柱。

1:最保险的方法,把DLL的区段直接跟EXE拼接。然EXE动态查找DLL的导出函数。
2:写一个pe_loader 把DLL切分成5份,然后映射到内存中进行解密。
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sorosyun 2012-6-26 15:19
18
0
写个验证函数,导出,让exe调用。
比如
void Verify(char *username,char *password);
如果传入值错误,调用其他函数就失败。
游客
登录 | 注册 方可回帖
返回