逆向对抗技术之ring3解除文件句柄,删除文件
一丶简介
这些问题主要是工作中会遇到.包括后面的逆向对抗技术.有的可能只会提供思路.并且做相应的解决与对抗.
二丶实战 + 环境模拟
1.环境模拟.
假设现在有一个进程.打开了你的文件.而你现在无法关系.
其中一个原因就是句柄被占用了. 因为句柄占用的原因你无法删除.
这里遇到了句柄占用.所以采用解除句柄的方法.
无法删除例子如下.

2.删除原理
我自己闪现了一个解除文件句柄并删除文件的方法. 需要使用未公开的API
原理很简单.主要是使用 ZwQueryObject的 2号功能获取句柄类型. 使用1号功能获取句柄对象文件名. 使用DuplicateHandle 传入DUPLICATE_CLOSE_SOURCE宏在拷贝的时候关闭其句柄占用.
步骤:
1.随便打开一个文件.获取其文件句柄在操作系统的中类型
2.打开进程.使用查询句柄个数(这步可以略过,不查询)
3.循环拷贝进程句柄,拷贝成功的使用 ZwQueryObject的2号功能遍历出文件名
4.解析文件名是否跟你要解除的文件名一样.
4.1 如果一样.则调用DuplicateHandle. 传入DUPLICATE_CLOSE_SOURCE
3.代码实现
1.查询文件句柄类型
setp 1. 随便打开一个文件根据文件句柄查询文件类型号.
 DWORD dwSystemFileHandleType = 0;
    TCHAR szPath[MAX_PATH] = { 0 };
    GetModuleFileName(GetModuleHandle(NULL), szPath, MAX_PATH * sizeof(TCHAR));
    HANDLE hFile = CreateFile(szPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if (INVALID_HANDLE_VALUE == hFile)
        return 0;
    dwSystemFileHandleType = NatHndGetHandleTypeWithHandle(hFile);
NatHndGetHandleTypeWithHandle 内部实现.
因为自己封装在项目工程中.所以直接拿出来了.想要自己用自己需要改改.
这个函数主要作用就是用 ZwQueryObject的2号功能.遍历出文件类型号.
USHORT CNativeApiManger::NatHndGetHandleTypeWithHandle(HANDLE handle)
{
    if (INVALID_HANDLE_VALUE == handle || 0 == handle)
        return 0;
    if (NULL == m_ZwQueryObject)
        return 0;
    PfnZwQueryObject CurZwQueryObject = NULL;
    CurZwQueryObject = reinterpret_cast<PfnZwQueryObject>(m_ZwQueryObject);
    if (CurZwQueryObject == NULL)
        return 0;
    char * pBuffer = new char[0x300];
    ULONG uRetSize = 0;
    OBJECT_INFORMATION_CLASS ob = ObjectTypeInformation;
    CurZwQueryObject(handle, ob, pBuffer, 0x300, &uRetSize);
    USHORT Type = 0;
    PPUBLIC_OBJECT_TYPE_INFORMATION PtypeInfo = reinterpret_cast<PPUBLIC_OBJECT_TYPE_INFORMATION>(pBuffer);  //查询类型信息
    Type = PtypeInfo->MaintainTypeList;
    delete[] pBuffer;
    return Type;
}
2.打开进程获得进程句柄
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwPid);
3.遍历进程拷贝句柄.判断文件类型过滤.关闭句柄
这个属于核心代码
HANDLE hTarHandle;
    for (int i = 0; i < 0x40000; i++) //65535
    {
        if (NatHndDuplicateHandle(hProcess, (HANDLE)i, GetCurrentProcess(), &hTarHandle, 0, 0, 2))
        {
            //成功了.查询类型信息
            char * pBuffer = new char[0x300]();
            ULONG uRetSize = 0;
            OBJECT_INFORMATION_CLASS ob = ObjectTypeInformation;
            ZwQueryObject((HANDLE)hTarHandle, ob, pBuffer, 0x300, &uRetSize);
            PPUBLIC_OBJECT_TYPE_INFORMATION PtypeInfo = reinterpret_cast<PPUBLIC_OBJECT_TYPE_INFORMATION>(pBuffer);  //查询类型信息
            PtypeInfo->MaintainTypeList;
            if (PtypeInfo->MaintainTypeList == dwSystemFileHandleType)
            {
                //是文件.尝试使用DumpLicateHandle 传入DUPLICATE_CLOSE_SOURCE 来关闭.
                //psOpt.HndDuplicateHandle(hProcess, (HANDLE)i, GetCurrentProcess(), NULL, 0, 0, DUPLICATE_CLOSE_SOURCE);
                //如果是是文件.查询其文件名.
                OBJECT_INFORMATION_CLASS ob = ObjectFileInformation;
                char * Buffer1 = new char[0x100];
                memset(Buffer1, 0, 0x100);
                ZwQueryObject(hTarHandle, ob, Buffer1, 0x100, &uRetLength);
                POBJECT_NAME_INFORMATION pFileInfo = reinterpret_cast<POBJECT_NAME_INFORMATION>(Buffer1);
                PWSTR pszBuffer = new wchar_t[0x255]();
                char szBuffer[0x256] = { 0 };
                if (pFileInfo->Name.Buffer == 0)
                    continue;
                memcpy(pszBuffer, pFileInfo->Name.Buffer, pFileInfo->Name.Length);
                WideCharToMultiByte(CP_ACP, 0, pszBuffer, 0X256 * sizeof(TCHAR), szBuffer, 0x256, 0, 0);
                string str = szBuffer;
                str.substr(str.find_last_of("\\"));
                if (str.find(OccFileName) != string::npos)
                {
                    //关闭其句柄
                    NatHndDuplicateHandle(hProcess, (HANDLE)i, GetCurrentProcess(), NULL, 0, 0, DUPLICATE_CLOSE_SOURCE);
                    CloseHandle(hProcess);
                    return TRUE;
                }
            }
        }
    }
    CloseHandle(hProcess);
    return FALSE;
NatHndDuplicateHandle其实内部就是对 DuplicateHandle 函数的封装.
关于结构网上也很多.我这里也直接进行拷贝了.
.h跟.cpp都提供一下.看的容易.
链接:https://pan.baidu.com/s/1ct-kNoe1Sr1j9LjM9sflCA
提取码:nxo3
逆向对抗技术之ring3解除文件句柄,删除文件的更多相关文章
- 20145206邹京儒《网络对抗技术》 PC平台逆向破解
		
20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...
 - 20145336张子扬 《网络对抗技术》 PC平台逆向破解
		
#20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
 - 20145337《网络对抗技术》逆向及BOF基础
		
20145337<网络对抗技术>逆向及BOF基础 实践目标 操作可执行文件pwn1,通过学习两种方法,使main函数直接执行getshall,越过foo函数. 实践内容 手工修改可执行文件 ...
 - 20145302张薇《网络对抗技术》PC平台逆向破解
		
20145302张薇<网络对抗技术>PC平台逆向破解 实验任务 1.简单shellcode注入实验 2.Return-to-libc 攻击实验 实验相关原理 Bof攻击防御技术 从防止注入 ...
 - 20145333 《网络对抗技术》 PC平台逆向破解
		
20145333 <网络对抗技术> PC平台逆向破解 20145333 <网络对抗技术> PC平台逆向破解 Shellcode注入 基础知识 Shellcode实际是一段代码, ...
 - 20165221 《网络对抗技术》EXP1 PC平台逆向破解
		
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
 - 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
		
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
 - 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
		
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
 - 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
		
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
 
随机推荐
- 表单提交学习笔记(一)—利用jquery.form提交表单(后台.net MVC)
			
起因:一开始想用MVC本身的Form提交方法,但是提交完之后想进行一些提示,MVC就稍显不足了,最后用jquery插件---jquery.form.js,完美解决了问题~~ 使用方法 一.下载jque ...
 - 1.Tomcat组件梳理—Bootstrap启动器
			
Tomcat组件梳理-Bootstrap启动器 一开始是直接从Server开始做梳理的,但是发现有很多东西是从Catalina传输过来的,Catalina又是从Bootstrap启动的,所以还是回过头 ...
 - python 基础(文件)
			
文件句柄:可简单理解为应该内存对象 open()函数 参考 https://www.runoob.com/python3/python3-file-methods.html 读.写.追加 ''' t ...
 - in __init__     self._traceback = tf_stack.extract_stack()的一个原因
			
这样就会出错,原因在于函数返回为三个变量,若直接向写入函数那样运用sess.run()得到,就会导致错误. sess=tf.Session() sess.run(tf.initialize_all_v ...
 - Jquery 跨Dom窗口操作
			
. 子窗口给父窗口元素赋值 function modifyTheme(id){ $("#parent_dom",window.parent.document).attr(" ...
 - 关于justify-content属性的再学习(区分三个属性)
			
justify-content属性: 用来表示可伸缩项目在主轴方向上的对齐方式: 取值范围为flex-start,flex-end,center,space-between,space-around: ...
 - Unity Physicals Rigidbody with multiple colliders
			
Rigidbody with multiple colliders adding colliders changes the center of mass and rotation behaviour ...
 - 解决window  tomcat 8.5 启动控制台输出为乱码
			
解决办法 1.打开你安装Tomcat的所在目录. 2. 打开后选择conf目录. . 3. 将里面的logging.properties文件用编辑器打开,本例子是使用“Notepad++”编辑器打开. ...
 - docker 安装prometheus
			
使用到的命令: [root@lgswork ~]# docker search prometheus NAME DESCRIPTION STARS OFFICIAL AUTOMATED prom/pr ...
 - 为安卓项目添加FileProvider
			
简单记录 android7.0开始出现FileProvider.从一个小白角度看需要注意这几点: Manifest.xml中添加provider节点 添加xml文件 模块的build.gradle中添 ...