dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
阅读:2923回复:21

devia大侠请进

楼主#
更多 发布于:2007-05-09 14:01
  驱网上终于有国人宣布自己做成了文件写入加密标志,令人鼓舞!
另外您不公开源代码的理由也无可厚非,但相信您告诉大家自己成功了决不是为炫耀,所以本着传播技术的黑客精神,能否给其他像我这样仍在苦苦求索的同胞们更详细的指点?

能否把加文件尾的细节说说?
1。creat时去尾吗?用什么方法?自己发irp?zwsetinformation?修改FCB?
2。cleanup还是close中加尾?用什么方法?自己发irp_mj_write?zw xxx?
3。如果不用去尾,那写入最后的数据怎么办?会不会把文建尾覆盖掉?

最新喜欢:

wingmanwingma...
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-09 14:14
驱网上宣布(或隐式宣布)做成了文件写入加密标志的多了去了,文件头的,文件尾的,都有作成的,只是咱没作成

只不过都不像 devia 这样共享精神,愿意拿出来聊

因为这里面有太多的利益关系,很正常
提问归提问,还是只能靠自己
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
板凳#
发布于:2007-05-09 14:28
谢谢大家的理解,因为我在内控安全领域也算是混了5年了,这里面关键技术竞争实在是血腥!
关于技术上的疑点我可以回答一点的是:
文件打开时去尾,用IRP或ZwXXX都可以,不过前者可能更简单些;
文件关闭时加尾,用IRP或ZwWrite都可以,不过前者可能更简单些;
人总在矛盾中徘徊。。。
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
地板#
发布于:2007-05-09 14:30
有一个办法可以添加文件加密标记,文件修改时间的低三位,修改这三个字节几乎看不出来的,而且一般和文件修改是同步的
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-09 14:58
引用第2楼devia2007-05-09 14:28发表的“”:
谢谢大家的理解,因为我在内控安全领域也算是混了5年了,这里面关键技术竞争实在是血腥!
关于技术上的疑点我可以回答一点的是:
文件打开时去尾,用IRP或ZwXXX都可以,不过前者可能更简单些;
文件关闭时加尾,用IRP或ZwWrite都可以,不过前者可能更简单些;


多谢大哥,还有点不明白
文件打开时去尾是用设置EndOfFile吧?
文件关闭时加尾是在cleanup还是close?
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-09 15:01
引用第3楼lsxredrain2007-05-09 14:30发表的“”:
有一个办法可以添加文件加密标记,文件修改时间的低三位,修改这三个字节几乎看不出来的,而且一般和文件修改是同步的

这方法也不错,不过未加密的文件有千分之一的概率会被认为成加过密的(十进制的后三位)
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
6楼#
发布于:2007-05-09 15:02
说错了,应该是低三个字节,对时间的影响在几秒,是2的24次方,这个方法骗骗boss是足够了
如果让这三个字节的隐藏的规律比较隐晦一些,一般的大侠也是能骗过的.
这三个字节差不多是一个随机平稳数,我们对文件修改时间精度要求也是以秒位单位的,而这个大数是以10ns为单位来计数的,因此低几位对用户和windows来说是几个没有用的空间.
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-09 16:19
引用第6楼lsxredrain2007-05-09 15:02发表的“”:
说错了,应该是低三个字节,对时间的影响在几秒,是2的24次方,这个方法骗骗boss是足够了
如果让这三个字节的隐藏的规律比较隐晦一些,一般的大侠也是能骗过的.
这三个字节差不多是一个随机平稳数,我们对文件修改时间精度要求也是以秒位单位的,而这个大数是以10ns为单位来计数的,因此低几位对用户和windows来说是几个没有用的空间.


很好!英雄!那是不是要在creat完成例程中自己构造irp来query/set information?那只能用IoAllocateIrp函数了,n多参数要填,有没有例子?
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
8楼#
发布于:2007-05-09 16:34
网上找的,应该可以用的,
create时检查标记,
close时添加标记,
NTSTATUS
QueryFileInformation(
 PDEVICE_OBJECT DeviceObject,
 PFILE_OBJECT FileObject,
 FILE_INFORMATION_CLASS FileInformationClass,
 PVOID FileInfo,
 ULONG FileInfoLength
 )
{
 PIRP Irp;
    KEVENT event;
    IO_STATUS_BLOCK IoStatusBlock;
    PIO_STACK_LOCATION IoStackLocation;
 
    //
    // Initialize the event
    //
    KeInitializeEvent(&event, NotificationEvent, FALSE);
 
    //
    // 分配一个IRP,用目标设备对象的StackSize作为新创建IRP的堆栈大小,这是
    // 标准的提供堆栈大小的方法。
    //

    Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
 
    if (!Irp)
        return FALSE;
 
    //
    // 设置IRP头的相关参数,由于我们采用IoAllocateIrp创建的IRP,因此很多
    // 域要自己设置,包括安装输入缓冲区,同步事件以及IRP标志字段,这个字段
    // 对文件信息查询没有太大的用处,对文件读写十分关键。
    //  

    Irp->AssociatedIrp.SystemBuffer = FileInfo;
    Irp->UserEvent = &event;
    Irp->UserIosb = &IoStatusBlock;
    Irp->Tail.Overlay.Thread = PsGetCurrentThread();
    Irp->Tail.Overlay.OriginalFileObject = FileObject;
    Irp->RequestorMode = KernelMode;
    Irp->Flags = 0;
 
    //
    // 设置IRP堆栈位置中的相关参数,最重要的是MajorFunction,它决定了这个
    // IRP的主要功能,另外Parameters.QueryFile.FileInformationClass定义了
    // 希望查询哪种文件信息。
    //
    IoStackLocation = IoGetNextIrpStackLocation(Irp);
    IoStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION;
  //IoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION;
    
    IoStackLocation->DeviceObject = DeviceObject;
    IoStackLocation->FileObject = FileObject;
    IoStackLocation->Parameters.QueryFile.Length = FileInfoLength;
    IoStackLocation->Parameters.QueryFile.FileInformationClass = FileInformationClass;

//    irpsp->Parameters.SetFile.Length = sizeof(PFILE_BASIC_INFORMATION);
    //IoStackLocation->Parameters.SetFile.Length = sizeof(FILE_BOTH_DIRECTORY_INFORMATION);
    
 //   irpsp->Parameters.SetFile.FileInformationClass = FileInformationClass;

 
    //
    // 安装IRP完成例程
    //
    IoSetCompletionRoutine(Irp, QueryFileInformationCompleted, 0, TRUE, TRUE, TRUE);
 
    (void) IoCallDriver(DeviceObject, Irp);
 
 //
 // 等待同步时间返回,我们在IRP的完成例程当中将事件置为信号态
 //
    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);
 
    return( NT_SUCCESS( IoStatusBlock.Status ));
}

NTSTATUS
QueryFileInformationCompleted(
 PDEVICE_OBJECT DeviceObject,
 PIRP Irp,
 PVOID Context
 )
{
    //
    // Copy the status information back into the "user" IOSB.
    //
    UNREFERENCED_PARAMETER(Context);
    UNREFERENCED_PARAMETER(DeviceObject);
    

    *Irp->UserIosb = Irp->IoStatus;

    if( !NT_SUCCESS(Irp->IoStatus.Status) ) {

       // DbgPrint(("QueryFileInformationCompleted  ERROR ON IRP: %x\n", Irp->IoStatus.Status ));
         KdPrint(("QueryFileInformationCompleted  ERROR ON IRP: %x\n", Irp->IoStatus.Status));
    }
    
    //
    // 在完成例程中设置同步事件为信号态。
    //
    KeSetEvent(Irp->UserEvent, 0, FALSE);
    
    //
    // 在完成例程里需要自己释放刚刚创建的IRP,因为I/O管理器不会为我们做这个工作
    //
    IoFreeIrp(Irp);
    
    //
    // 我们返回STATUS_MORE_PROCESSING_REQUIRED,就是告诉I/O管理器这个IRP还有其它
    // 的进程在访问,请不要将其删除,事实上这个IRP应该由我们自己来释放而不是I/O
    // 管理器,所以在自己创建的IRP的完成例程当中必须返回这个值。另外,这个我们不
    // 能为这个IRP调用IoCompleteRequest。
    //
    return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
QueryFileBasicInformation(
 PDEVICE_OBJECT DeviceObject,
 PFILE_OBJECT FileObject,
 PFILE_BASIC_INFORMATION FileBasicInfo,
 ULONG FileInfoLength
 )
{
 return QueryFileInformation(
  DeviceObject,
  FileObject,
  FileBasicInformation,
  FileBasicInfo,
  FileInfoLength
  );
}

NTSTATUS
SetFileInformationCompleted(
 PDEVICE_OBJECT DeviceObject,
 PIRP Irp,
 PVOID Context
 )
{
    //
    // Copy the status information back into the "user" IOSB.
    //
    UNREFERENCED_PARAMETER(Context);
    UNREFERENCED_PARAMETER(DeviceObject);
    

    *Irp->UserIosb = Irp->IoStatus;

    if( !NT_SUCCESS(Irp->IoStatus.Status) ) {

       // DbgPrint(("QueryFileInformationCompleted  ERROR ON IRP: %x\n", Irp->IoStatus.Status ));
         KdPrint(("SetFileInformationCompleted  ERROR ON IRP: %x\n", Irp->IoStatus.Status));
    }
    
    //
    // 在完成例程中设置同步事件为信号态。
    //
    KeSetEvent(Irp->UserEvent, 0, FALSE);
    
    //
    // 在完成例程里需要自己释放刚刚创建的IRP,因为I/O管理器不会为我们做这个工作
    //
    IoFreeIrp(Irp);
    
    //
    // 我们返回STATUS_MORE_PROCESSING_REQUIRED,就是告诉I/O管理器这个IRP还有其它
    // 的进程在访问,请不要将其删除,事实上这个IRP应该由我们自己来释放而不是I/O
    // 管理器,所以在自己创建的IRP的完成例程当中必须返回这个值。另外,这个我们不
    // 能为这个IRP调用IoCompleteRequest。
    //
    return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
SetFileInformation(
 PDEVICE_OBJECT DeviceObject,
 PFILE_OBJECT FileObject,
 FILE_INFORMATION_CLASS FileInformationClass,
 PVOID FileInfo,
 ULONG FileInfoLength
 )
{
 PIRP Irp;
    KEVENT event;
    IO_STATUS_BLOCK IoStatusBlock;
    PIO_STACK_LOCATION IoStackLocation;
 
    //
    // Initialize the event
    //
    KeInitializeEvent(&event, NotificationEvent, FALSE);
 
    //
    // 分配一个IRP,用目标设备对象的StackSize作为新创建IRP的堆栈大小,这是
    // 标准的提供堆栈大小的方法。
    //
    Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
 
    if (!Irp)
        return FALSE;
 
    //
    // 设置IRP头的相关参数,由于我们采用IoAllocateIrp创建的IRP,因此很多
    // 域要自己设置,包括安装输入缓冲区,同步事件以及IRP标志字段,这个字段
    // 对文件信息查询没有太大的用处,对文件读写十分关键。
    //  
    Irp->AssociatedIrp.SystemBuffer = FileInfo;
    Irp->UserEvent = &event;
    Irp->UserIosb = &IoStatusBlock;
    Irp->Tail.Overlay.Thread = PsGetCurrentThread();
    Irp->Tail.Overlay.OriginalFileObject = FileObject;
    Irp->RequestorMode = KernelMode;
    Irp->Flags = 0;
 
    //
    // 设置IRP堆栈位置中的相关参数,最重要的是MajorFunction,它决定了这个
    // IRP的主要功能,另外Parameters.QueryFile.FileInformationClass定义了
    // 希望查询哪种文件信息。
    //

    IoStackLocation = IoGetNextIrpStackLocation(Irp);
    IoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION;
    
    IoStackLocation->DeviceObject = DeviceObject;
    IoStackLocation->FileObject = FileObject;
    IoStackLocation->Parameters.SetFile.Length = FileInfoLength;
    IoStackLocation->Parameters.SetFile.FileInformationClass = FileInformationClass;
 
    //
    // 安装IRP完成例程
    //
    IoSetCompletionRoutine(Irp, SetFileInformationCompleted, 0, TRUE, TRUE, TRUE);
 
    (void) IoCallDriver(DeviceObject, Irp);
 
 //
 // 等待同步时间返回,我们在IRP的完成例程当中将事件置为信号态
 //
    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);
 
    return( NT_SUCCESS( IoStatusBlock.Status ));
}

NTSTATUS
SetFileBasicInformation(
 PDEVICE_OBJECT DeviceObject,
 PFILE_OBJECT FileObject,
 PFILE_BASIC_INFORMATION FileBasicInfo,
 ULONG FileInfoLength
 )
{
 return SetFileInformation(
  DeviceObject,
  FileObject,
  FileBasicInformation,
  FileBasicInfo,
  FileInfoLength
  );
}
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-05-09 17:52
lsxredrain兄,你是在哪里找到这样的代码的?
在孤独和无助中缓慢前行...
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-05-09 18:01
lsxredrain,我对你的佩服犹如滔滔江水,连绵不绝;犹如天上的星宿,万年不灭;犹如。。。。
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
11楼#
发布于:2007-05-09 18:17
google一把应该有的,
不过这种方法只能用来做做毕业设计,如果是商业用途还是建立把加密标记放到文件里面去比较安全;
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-05-09 20:58
引用第11楼lsxredrain2007-05-09 18:17发表的“”:
google一把应该有的,
不过这种方法只能用来做做毕业设计,如果是商业用途还是建立把加密标记放到文件里面去比较安全;


对,俺就是做做本科毕设,只要能把加密标志从系统上和文件关联在一起了,就算了了一块心病。哈哈,俺用你方法成功了,非常感谢,这么巧妙的方法都能想得出来,你真是个天才!!!
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-09 22:20
如果我没记错,上面的 lsxredrain 发的代码应该是 joshua_yu 写的

不过 lsxredrain 的想法很有创意,俺就没想到,真笨,不过可惜没有实用价值,只能拿来哄老板
提问归提问,还是只能靠自己
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
14楼#
发布于:2007-05-10 08:52
引用第6楼lsxredrain2007-05-09 15:02发表的“”:
说错了,应该是低三个字节,对时间的影响在几秒,是2的24次方,这个方法骗骗boss是足够了
如果让这三个字节的隐藏的规律比较隐晦一些,一般的大侠也是能骗过的.
这三个字节差不多是一个随机平稳数,我们对文件修改时间精度要求也是以秒位单位的,而这个大数是以10ns为单位来计数的,因此低几位对用户和windows来说是几个没有用的空间.



既然是加密标识那么就应该可以任意扩充它的内容,显然兄弟的想法是有局限性的,(请不要介意):-)
人总在矛盾中徘徊。。。
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
15楼#
发布于:2007-05-10 08:52
这种方法主要缺陷很容易被人故意修改掉,导致被加密的文件无法被解密.
但是它却具有很多优点:
1. 容易上手,给新手们尝试透明加密一个低门坎的学习机会.
2.文件内部写加密标记的一些问题几乎都可以避开.
3.这三个字节和文件本身的一些性质关联(如文件大小(字节)),那么这个标记是相当隐蔽的.

这段代码是从一个网站上面找的,记不清是哪位大侠的.
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
16楼#
发布于:2007-05-10 09:16
引用第14楼devia2007-05-10 08:52发表的“”:



既然是加密标识那么就应该可以任意扩充它的内容,显然兄弟的想法是有局限性的,(请不要介意):-)


呵呵,是有局限性的,不过加密标记不同于密钥,只要好认就行,不需要任意扩充的.
osr上面一些人在文件头加标记也就用了5个字节而已
兄弟什么时候也象tooflat大侠一样给新手们来一个可以玩玩的透明加密的新手版源代码?
 
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-05-10 09:37
引用第16楼lsxredrain2007-05-10 09:16发表的“”:


呵呵,是有局限性的,不过加密标记不同于密钥,只要好认就行,不需要任意扩充的.
osr上面一些人在文件头加标记也就用了5个字节而已
兄弟什么时候也象tooflat大侠一样给新手们来一个可以玩玩的透明加密的新手版源代码?
.......


如果需要更强功能,比如把软件做成多用户的透明文件加密,那么存储用户信息等扩展是必然的,但lsxredrain大侠的方法的确是小弟作毕社的很好的解决方案。另外,devia大侠不公布源代码是无可厚非的,相信在未来竞争不那么激烈的时候,他会与我们分享优美的代码!再次感谢各位大侠对小弟的帮助! 
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
18楼#
发布于:2007-05-10 10:16
多用户这一层倒是没有想到,
不过透明加密的主要目的就是为了防止泄密,泄密责任越明确越好,多用户想不出有什么好处,不过在其他场合可能会有用.
公开源代码的意思是把最常规的东西拿出来晒晒,最核心的东西藏起来,这样才能给自己不断进取的压力,同时也有利于提高国内的整体水平.
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-05-10 10:45
lsxredrain大侠,我想到一个问题。当我加密的文件考到u盘上被带走后,在外网计算机上当然是密文,但如果这时候对方简单的修改一下文件,比如加一个空格,那么文件修改时间被改变,当u盘再回到内网,我也不能识别文件是被加密过的。能不能把创建时间作为加密标志?不过好像这个参数只能读不能写?还有最后LastWriteTime和ChangeTime 有什么区别?
上一页
游客

返回顶部