bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:9967回复:34

sfilter动态加解密吐血总结

楼主#
更多 发布于:2004-09-14 18:22
晕了好几天,总算把Ifs的动态加解密给闹明白了。
为了后来者不再晕,总结如下:

1.加密在SfWrite(IRP_MJ_WRITE)中,而不是完成例程,
  解密在SfRead(IRP_MJ_READ)中,而不是完成例程,

3.只要处理IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO

2.加密简单过程:
a.得到Windows传下来的Buffer Address,
if (Irp->MdlAddress)
{
SysDataBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
}
else
{
SysDataBuf = Irp->UserBuffer;
}
b.保存明文SysDataBuf 在SysDataBufFirst

c.用你强大的算法加密SysDataBuf -->> MyBuf

d.把MyBuf Copy到 SysDataBuf,

e.IoCallDriver 把密文向下传,写入HardDisk。

f.恢复内存的明文 RtlCopyMemory(SysDataBuf,SysDataBufFirst, ulWriteLen);.

3.解密的大致过程:
a.IoCallDriver 读到密文
b,解密
c。IoCompleteRequest 搞定

我的开发环境:
IFS2600,SFilter的代码却是for XP SP1的

另外提个问题:
我的sfilter加载后,U盘怎么不能访问了??


最新喜欢:

lipengyilipeng... linshierlinshi... easydrivereasydr... snoxsnox
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-14 21:18
基本上是这样子的。
不过有很多的细节要处理
不限容量的免费邮箱 www.k65.net
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-09-14 21:21
对所有文件都可以吗??没问题吗??那些OFFICE的都没问题???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-09-14 21:23
基本上是这样子的。
不过有很多的细节要处理

请说具体点,哪些细节要处理???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-14 22:53
先谢谢总结先!

另外:
读和写都有工作需要在IoCallDriver后进行,又不是在完成例程中进行。是不是把所有的读写irp都弄成同步的了?
如果是的话,IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO好像都是同步i/o,问题不大,但是IRP_NOCACHE可能是异步的,如果都改成同步处理的话,会不会有什么影响?比如性能?
谢谢!
我又来了,生命不息,驱动不止。
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-16 09:16
[quote]基本上是这样子的。
不过有很多的细节要处理

请说具体点,哪些细节要处理??? [/quote]
你不是举出了一个例子么?

不限容量的免费邮箱 www.k65.net
bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-09-16 09:38
再仍一块砖头:
如何从IrpStackLocation中判断来自网络的文件访问?

//---------------------------------------------------
NTSTATUS status;

PACCESS_TOKEN pToken = NULL;
PTOKEN_SOURCE pTokenSrc = NULL ;
PSECURITY_SUBJECT_CONTEXT secSubCtx;


secSubCtx = &(IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext);

if (secSubCtx->ClientToken != NULL || secSubCtx->PrimaryToken != NULL)
{
pToken = SeQuerySubjectContextToken(secSubCtx);
}

if (pToken == NULL)
{
//KdPrint(("SeQuerySubjectContextToken Error\n"));
return 0
}

//
// Get TokenSource Name If SourceName is "NtLmSsp" it was logged-in via Lanmanager,
// "User32" represents localy logged-in users.
//
__try
{

status = SeQueryInformationToken(pToken,TokenSource,&pTokenSrc);

if (NT_SUCCESS(status))
{
pTokenSrc->SourceName[TOKEN_SOURCE_LENGTH-1] = 0x00;

KdPrint(("Token Name :%s Len:%d\n",pTokenSrc->SourceName,strlen(pTokenSrc->SourceName)));

if (_stricmp(pTokenSrc->SourceName,"NtLmSsp") == 0 )
{
KdPrint(("NetWork Access Token Find\n"));
return 123
}

}
else
{
KdPrint(("SeQueryInformationToken Error:0x%x\n",status));
}
}
__finally
{
ExFreePool(pTokenSrc);
}


return 0
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-16 14:19
这个不错,有点眼熟,就是不知道从哪儿来的?
不限容量的免费邮箱 www.k65.net
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-16 14:21
这个不错,有点眼熟,就是不知道从哪儿来的?

[编辑 -  9/16/04 by  nustzhua]
不限容量的免费邮箱 www.k65.net
bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-09-16 15:36
OSR上看来的;):)
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-09-21 16:18
d.把MyBuf Copy到 SysDataBuf,

e.IoCallDriver 把密文向下传,写入HardDisk。

f.恢复内存的明文 RtlCopyMemory(SysDataBuf,SysDataBufFirst, ulWriteLen);.

这几步好像有个小小的问题,就是如果读请求在e和f之间进行的话,读到的数据可能是密文,因为你的步骤f太迟了
正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在
完成例程中再恢复原来的mdl,总之不要修改原来的缓冲区!!!!
syx1991
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2009-09-04
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-09-22 10:11
tooflat:正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在
完成例程中再恢复原来的mdl,总之不要修改原来的缓冲区!!!!

问一个问题:我是按照你所说的来做,在FAT32下能正常工作,但在
NTFS下出现错误,请指点一下
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-09-22 13:40
tooflat:正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在
完成例程中再恢复原来的mdl,总之不要修改原来的缓冲区!!!!

问一个问题:我是按照你所说的来做,在FAT32下能正常工作,但在
NTFS下出现错误,请指点一下


你给的错误信息太少了,是蓝屏还是什么?具体的蓝屏信息又是什么?
能把代码片断贴上来吗?
satanli1982
驱动牛犊
驱动牛犊
  • 注册日期2004-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-10-03 19:49
学习ing
doctor.big
驱动牛犊
驱动牛犊
  • 注册日期2004-05-27
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-10-14 09:32
重入方面的问题呢?加一个全局开关量解决?
jjw
jjw
驱动牛犊
驱动牛犊
  • 注册日期2001-11-01
  • 最后登录2008-11-05
  • 粉丝0
  • 关注0
  • 积分-6分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-11-30 19:12
顶一下
jjw
longshentailang
驱动牛犊
驱动牛犊
  • 注册日期2005-12-06
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分830分
  • 威望84点
  • 贡献值4点
  • 好评度83点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-01-09 22:16
学习ing
thf76
驱动牛犊
驱动牛犊
  • 注册日期2007-03-25
  • 最后登录2007-03-25
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-03-25 10:36
好,看看!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-03-25 20:28
对呀怎么解决!关注!
我发现我使用 tooflat 的加密程序测试,
发现文件被加密了. 设置 file.$encrypt$ 加密标志失败! 这个文件不存在,为什么呢?
怎么会这样呢?
创造美好的未来生活!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-03-25 20:34
加密成功,这标志 文件 也设置成功了. 但是这个标志文件不存在.
好像怎么跳过一样.但是返回是成功的.汗.好好调试一下.第一次不太会调试!
创造美好的未来生活!!!
上一页
游客

返回顶部