IoEnumerateDeviceObjectList函数的还原

函数接口解释参考ddk文档(win 7 32),用来遍历某个驱动对象的设备对象。c代码+WinDbg得到的反汇编代码

NTSTATUS 
  IoEnumerateDeviceObjectList(IN PDRIVER_OBJECT DriverObject,    //ebp+8
                             IN PDEVICE_OBJECT  *DeviceObject,    //ebp+ch
                             IN ULONG           DeviceObjectListSize,  //ebp+10h
                             OUT PLONG          ActualNumberDeviceObjects)  //ebp+14h
{
    NTSTATUS status=STATUS_SUCCESSFUL;
    PDEVICE_OBJECT tempDeviceObject=NULL;
    ULONG Count=0,i=0;
    PKIRQL OldIrql;
    KeAcquireQueuedSpinLock(0xa,OldIrql);
    DeviceObjcetListSize=DeviceObjectListSize/4;  //4=sizeof(a pointer)
    //enumerate the DeviceObject and get the number
    tempDeviceObjcet=DriverObject->DeviceObject;
    while(tempDeviceObject)
    {
        tempDeviceObject=tempDeviceObject->NextDevice;
        Count++;
    }
    //actual number
    *ActualNumberDeviceObjects=Count;
    if(Count>DeviceObjectListSize)  
    {
        status=STATUS_BUFFER_TOO_SMALL;
    }
    //
    if(DeviceObjectListSize<=0)  
    {
        KeReleaseQueuedSpinLock(0xa,OldIrql);
        return status;
    }
    tempDeviceObjcet=DriverObjct->DeviceObject;
    while(tempDeviceObcjet&&DeviceObjcetListSize)  //get the DeviceObjcet pointeres
    {
        ObfReferenceObjct(tempDeviceObjct);
        DeviceObject[i]=tempDeviceObject;   //save the DeviceObejct pointer
        DeviceObjcetListSize--;
    }

    KeReleaseQueuedSpinLock(0xa,OldIrql);
    return status;
}

反汇编代码

nt!IoEnumerateDeviceObjectList:
840485f7 8bff            mov     edi,edi
840485f9 55              push    ebp
840485fa 8bec            mov     ebp,esp
840485fc 51              push    ecx
840485fd 51              push    ecx
840485fe 56              push    esi
840485ff 57              push    edi
84048600 6a0a            push    0Ah
84048602 33ff            xor     edi,edi
84048604 217df8          and     dword ptr [ebp-8],edi
84048607 59              pop     ecx
84048608 ff1564110484    call    dword ptr [nt!_imp_KeAcquireQueuedSpinLock (84041164)]
8404860e 8b4d08          mov     ecx,dword ptr [ebp+8]
84048611 8b7510          mov     esi,dword ptr [ebp+10h]
84048614 8845ff          mov     byte ptr [ebp-1],al
84048617 8b4104          mov     eax,dword ptr [ecx+4]
8404861a c1ee02          shr     esi,2
8404861d eb04            jmp     nt!IoEnumerateDeviceObjectList+0x2c (84048623)

nt!IoEnumerateDeviceObjectList+0x28:
8404861f 8b400c          mov     eax,dword ptr [eax+0Ch]
84048622 47              inc     edi

nt!IoEnumerateDeviceObjectList+0x2c:
84048623 85c0            test    eax,eax
84048625 75f8            jne     nt!IoEnumerateDeviceObjectList+0x28 (8404861f)

nt!IoEnumerateDeviceObjectList+0x30:
84048627 8b4514          mov     eax,dword ptr [ebp+14h]
8404862a 8938            mov     dword ptr [eax],edi
8404862c 3bfe            cmp     edi,esi
8404862e 7607            jbe     nt!IoEnumerateDeviceObjectList+0x40 (84048637)

nt!IoEnumerateDeviceObjectList+0x39:
84048630 c745f8230000c0  mov     dword ptr [ebp-8],0C0000023h

nt!IoEnumerateDeviceObjectList+0x40:
84048637 8b7904          mov     edi,dword ptr [ecx+4]
8404863a 85f6            test    esi,esi
8404863c 761b            jbe     nt!IoEnumerateDeviceObjectList+0x62 (84048659)

nt!IoEnumerateDeviceObjectList+0x47:
8404863e 53              push    ebx
8404863f 8b5d0c          mov     ebx,dword ptr [ebp+0Ch]

nt!IoEnumerateDeviceObjectList+0x4b:
84048642 85ff            test    edi,edi
84048644 7412            je      nt!IoEnumerateDeviceObjectList+0x61 (84048658)

nt!IoEnumerateDeviceObjectList+0x4f:
84048646 8bcf            mov     ecx,edi
84048648 e8a7220700      call    nt!ObfReferenceObject (840ba8f4)
8404864d 893b            mov     dword ptr [ebx],edi
8404864f 8b7f0c          mov     edi,dword ptr [edi+0Ch]
84048652 83c304          add     ebx,4
84048655 4e              dec     esi
84048656 75ea            jne     nt!IoEnumerateDeviceObjectList+0x4b (84048642)

nt!IoEnumerateDeviceObjectList+0x61:
84048658 5b              pop     ebx

nt!IoEnumerateDeviceObjectList+0x62:
84048659 8a55ff          mov     dl,byte ptr [ebp-1]
8404865c 6a0a            push    0Ah
8404865e 59              pop     ecx
8404865f ff1560110484    call    dword ptr [nt!_imp_KeReleaseQueuedSpinLock (84041160)]
84048665 8b45f8          mov     eax,dword ptr [ebp-8]
84048668 5f              pop     edi
84048669 5e              pop     esi
8404866a c9              leave
8404866b c21000          ret     10h
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CnCrypt是一款专门为用户打造的磁盘加密软件,同时支持Windows2000-Win 10之间的所有操作系统。主要为用户提供便捷的电脑磁盘加密功能,能创建加密的“虚拟磁盘文件”(类似虚拟光驱,大小可以自定义),所有加密数据都是经过AES等加密算法的运算后的结果,无法破解。CnCrypt提供多种加密算法,包括:AES-256, Blowfish (448-bit key), CAST5, Serpent, Triple DES, and Twofish,其他特性还有支持FAT32和NTFS分区、隐藏卷标、热键启动等。 主要特性 1 所有加密都是以分区为基础的。 2 真加密,所有加密数据都是经过AES等加密算法的运算后的结果,无法破解(穷举法除外)。 3 能创建加密的“虚拟磁盘文件”(类似虚拟光驱,大小可以自定义) 4 加密单个分区或整个硬盘。 5 加密过程自动、实时、透明(使用加密文件或分区前输入密码,载入后就可以像使用一个普通分区一样使用加密分区。) 6 提供两级方案,以应对被强迫说出密码的情况(如抢劫)。 6.1 隐藏分区(覆盖式密码术,steganography) 6.2 无法探测到CnCrypt 加密分区(加密数据会被认为是随机数据) 7 加密算法:AES-256、Serpent、Twofish。为取得更好加密效果,可以同时使用两种或三种加密算法。操作模式:XTS。 8 多样化的身份认证 8.1支持通常使用的密码认证; 8.2支持密匙文件认证,通过指定的文件作为密匙对数据加密。(密匙文件支持:任何类型的文件)电脑上那么多文件,要是想尝试暴利破解,就等着累死吧。 8.3支持PKCS 11运行库,可以使用硬件口令卡(例如:U盾)进行加密认证。密钥随身携带,从而再次提高了数据的安全性,以此实现更高规格的防暴力破解。 CnCrypt V1.11 修改记录 实现单文件绿色版本,包括安装,创建,加载功能 修正V1.10中存在的一些细节BUG 密钥文件按钮上显示当前密钥文件个数 某些Windows错误弹窗为空白,无法获取到错误信息描述 菜单增加关联资源管理器,取消关联资源管理器选项 资源管理器菜单修改为子菜单方式 属性中增加占用磁盘空间项,可以显示动态卷目前已经占用的磁盘空间 在加密卷右键菜单上增加了创建桌面快捷方式菜单项 Mount命令行增加盘符被占用时自运选择空闲盘符选项,可与指定盘符功能一块用,例如 "/letter X: /letter auto" 增加快速创建加密卷(一键创建加密卷) 便携版本配置文件目录移动到用户数据目录(之前为程序目录) 增加文件日期修改工具 增加加密卷占用磁盘空间压缩功能 CnCrypt V1.10 修改记录 增加加密卷空间扩充工具 恢复了TrueCrypt原有系统加密功能 修正了TrueCrypt安全审计团队审计发现的几个BUG 当有子窗口时用快捷键退出存在的BUG WIN7之后系统修改显示密码选项后*号显示不一样的问题 对多处界面显示进行了修正 创建新加密卷时‘选择文件’按钮修改为‘指定文件’。 文件浏览窗口为非保存模式时,修改指定文件必须存在。 设备浏览窗口中分区前面加了若干空格来区分磁盘和卷。 Format和Mount的历史记录可以实时同步 挂载盘符时可以使用A和B盘符 盘符列表右键菜单增加了‘打开文件所在位置’功能 增加了检查更新功能,该功能不会自动连接网络,除非用户手动进行操作。 收藏加密卷中存在同样加密卷时进行提醒 对主菜单布局进行了调整 对中文进行了更好的优化 增加了CnCrypt加密方式,同时继续兼容TrueCrypt加密方式 对磁盘大小输入框进行输入验证 自动加载所有设备加密卷时,跳过对系统所在磁盘和系统分区的检测,节省一定时间。 密钥文件按钮上显示当前密钥文件个数 CnCrypt V1.00 修改记录 基于TrueCrypt7.1a的主要修改 完美支持win2000-win10的所有32位和64位版本。 增加了便携磁盘加密卷创建和加载功能(不会出现“未格式化”的提示) 增加了与Windows资源管理器的集成(加载加密卷,保存至加密卷,粉碎选择文件) 去除了有关系统盘\系统驱动器部分(UEFI之后已无法支持之前实现方式) 增加加密卷擦除功能 增加密码生成器功能 增加了密码输入软键盘功能 增加了磁盘痕迹擦除工具 增加了悬浮框,支持拖放加载,右键功能菜单等。 托盘菜单支持快速加载,支持加载历史记录,加载收藏卷等功能。 加密卷创建向导增加了向导步聚显示 界面细节的诸多优化 内核驱动一些BUG的处理 安装包体积缩小至1.67M,便携压缩包缩小至0.9M 界面完美支持中文 界面使用了操作系统风格 在界面中增加了Banner 对加密卷收藏夹界面进行较大修改 对语言选择界面进行较大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值