阅读:2923回复:21
devia大侠请进
驱网上终于有国人宣布自己做成了文件写入加密标志,令人鼓舞!
另外您不公开源代码的理由也无可厚非,但相信您告诉大家自己成功了决不是为炫耀,所以本着传播技术的黑客精神,能否给其他像我这样仍在苦苦求索的同胞们更详细的指点? 能否把加文件尾的细节说说? 1。creat时去尾吗?用什么方法?自己发irp?zwsetinformation?修改FCB? 2。cleanup还是close中加尾?用什么方法?自己发irp_mj_write?zw xxx? 3。如果不用去尾,那写入最后的数据怎么办?会不会把文建尾覆盖掉? |
|
最新喜欢:wingma... |
沙发#
发布于:2007-05-09 14:14
驱网上宣布(或隐式宣布)做成了文件写入加密标志的多了去了,文件头的,文件尾的,都有作成的,只是咱没作成
只不过都不像 devia 这样共享精神,愿意拿出来聊 因为这里面有太多的利益关系,很正常 |
|
|
板凳#
发布于:2007-05-09 14:28
谢谢大家的理解,因为我在内控安全领域也算是混了5年了,这里面关键技术竞争实在是血腥!
关于技术上的疑点我可以回答一点的是: 文件打开时去尾,用IRP或ZwXXX都可以,不过前者可能更简单些; 文件关闭时加尾,用IRP或ZwWrite都可以,不过前者可能更简单些; |
|
|
地板#
发布于:2007-05-09 14:30
有一个办法可以添加文件加密标记,文件修改时间的低三位,修改这三个字节几乎看不出来的,而且一般和文件修改是同步的
|
|
地下室#
发布于:2007-05-09 14:58
引用第2楼devia于2007-05-09 14:28发表的“”: 多谢大哥,还有点不明白 文件打开时去尾是用设置EndOfFile吧? 文件关闭时加尾是在cleanup还是close? |
|
5楼#
发布于:2007-05-09 15:01
引用第3楼lsxredrain于2007-05-09 14:30发表的“”: 这方法也不错,不过未加密的文件有千分之一的概率会被认为成加过密的(十进制的后三位) |
|
6楼#
发布于:2007-05-09 15:02
说错了,应该是低三个字节,对时间的影响在几秒,是2的24次方,这个方法骗骗boss是足够了
如果让这三个字节的隐藏的规律比较隐晦一些,一般的大侠也是能骗过的. 这三个字节差不多是一个随机平稳数,我们对文件修改时间精度要求也是以秒位单位的,而这个大数是以10ns为单位来计数的,因此低几位对用户和windows来说是几个没有用的空间. |
|
7楼#
发布于:2007-05-09 16:19
引用第6楼lsxredrain于2007-05-09 15:02发表的“”: 很好!英雄!那是不是要在creat完成例程中自己构造irp来query/set information?那只能用IoAllocateIrp函数了,n多参数要填,有没有例子? |
|
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 ); } |
|
9楼#
发布于:2007-05-09 17:52
lsxredrain兄,你是在哪里找到这样的代码的?
|
|
|
10楼#
发布于:2007-05-09 18:01
lsxredrain,我对你的佩服犹如滔滔江水,连绵不绝;犹如天上的星宿,万年不灭;犹如。。。。
|
|
11楼#
发布于:2007-05-09 18:17
google一把应该有的,
不过这种方法只能用来做做毕业设计,如果是商业用途还是建立把加密标记放到文件里面去比较安全; |
|
12楼#
发布于:2007-05-09 20:58
引用第11楼lsxredrain于2007-05-09 18:17发表的“”: 对,俺就是做做本科毕设,只要能把加密标志从系统上和文件关联在一起了,就算了了一块心病。哈哈,俺用你方法成功了,非常感谢,这么巧妙的方法都能想得出来,你真是个天才!!! |
|
13楼#
发布于:2007-05-09 22:20
如果我没记错,上面的 lsxredrain 发的代码应该是 joshua_yu 写的
不过 lsxredrain 的想法很有创意,俺就没想到,真笨,不过可惜没有实用价值,只能拿来哄老板 |
|
|
14楼#
发布于:2007-05-10 08:52
引用第6楼lsxredrain于2007-05-09 15:02发表的“”: 既然是加密标识那么就应该可以任意扩充它的内容,显然兄弟的想法是有局限性的,(请不要介意):-) |
|
|
15楼#
发布于:2007-05-10 08:52
这种方法主要缺陷很容易被人故意修改掉,导致被加密的文件无法被解密.
但是它却具有很多优点: 1. 容易上手,给新手们尝试透明加密一个低门坎的学习机会. 2.文件内部写加密标记的一些问题几乎都可以避开. 3.这三个字节和文件本身的一些性质关联(如文件大小(字节)),那么这个标记是相当隐蔽的. 这段代码是从一个网站上面找的,记不清是哪位大侠的. |
|
16楼#
发布于:2007-05-10 09:16
引用第14楼devia于2007-05-10 08:52发表的“”: 呵呵,是有局限性的,不过加密标记不同于密钥,只要好认就行,不需要任意扩充的. osr上面一些人在文件头加标记也就用了5个字节而已 兄弟什么时候也象tooflat大侠一样给新手们来一个可以玩玩的透明加密的新手版源代码? |
|
17楼#
发布于:2007-05-10 09:37
引用第16楼lsxredrain于2007-05-10 09:16发表的“”: 如果需要更强功能,比如把软件做成多用户的透明文件加密,那么存储用户信息等扩展是必然的,但lsxredrain大侠的方法的确是小弟作毕社的很好的解决方案。另外,devia大侠不公布源代码是无可厚非的,相信在未来竞争不那么激烈的时候,他会与我们分享优美的代码!再次感谢各位大侠对小弟的帮助! |
|
18楼#
发布于:2007-05-10 10:16
多用户这一层倒是没有想到,
不过透明加密的主要目的就是为了防止泄密,泄密责任越明确越好,多用户想不出有什么好处,不过在其他场合可能会有用. 公开源代码的意思是把最常规的东西拿出来晒晒,最核心的东西藏起来,这样才能给自己不断进取的压力,同时也有利于提高国内的整体水平. |
|
19楼#
发布于:2007-05-10 10:45
lsxredrain大侠,我想到一个问题。当我加密的文件考到u盘上被带走后,在外网计算机上当然是密文,但如果这时候对方简单的修改一下文件,比如加一个空格,那么文件修改时间被改变,当u盘再回到内网,我也不能识别文件是被加密过的。能不能把创建时间作为加密标志?不过好像这个参数只能读不能写?还有最后LastWriteTime和ChangeTime 有什么区别?
|
|
上一页
下一页