一丶简介

这些问题主要是工作中会遇到.包括后面的逆向对抗技术.有的可能只会提供思路.并且做相应的解决与对抗.

二丶实战 + 环境模拟

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解除文件句柄,删除文件的更多相关文章

  1. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  2. 20145336张子扬 《网络对抗技术》 PC平台逆向破解

    #20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...

  3. 20145337《网络对抗技术》逆向及BOF基础

    20145337<网络对抗技术>逆向及BOF基础 实践目标 操作可执行文件pwn1,通过学习两种方法,使main函数直接执行getshall,越过foo函数. 实践内容 手工修改可执行文件 ...

  4. 20145302张薇《网络对抗技术》PC平台逆向破解

    20145302张薇<网络对抗技术>PC平台逆向破解 实验任务 1.简单shellcode注入实验 2.Return-to-libc 攻击实验 实验相关原理 Bof攻击防御技术 从防止注入 ...

  5. 20145333 《网络对抗技术》 PC平台逆向破解

    20145333 <网络对抗技术> PC平台逆向破解 20145333 <网络对抗技术> PC平台逆向破解 Shellcode注入 基础知识 Shellcode实际是一段代码, ...

  6. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  7. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  8. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  9. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

随机推荐

  1. 给自己看的Cache,三段代码

    此篇是我记录代码的一个草稿,不是一篇正式的博文,误点的别介意啊. 公司的框架中Cache实现文件: (1)CacheUtil.cs using System.Collections.Generic; ...

  2. spark-sql使用笔记

    如何使用hive的udf 可以使用spark-sql --jars /opt/hive/udf.jar,指定udf的路径 还可以在spark-default.conf里指定spark.jars /op ...

  3. 连续子数组的最大乘积及连续子数组的最大和(Java)

    1. 子数组的最大和 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, ...

  4. Java 之 Response 文件下载案例

    文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框 ...

  5. insmod/rmmod

    insmod -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入 -k 将模块设置为自动卸除 -m 输出模块的载入信息 -o <模块名称> 指定模块的名 ...

  6. Java开发环境之RabbitMQ

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 捌章:RabbitMQ安装教程 1)下载安装Erlang 官网下载:http://www.erlang.org,有时比较难 ...

  7. 原创:基于visual studio 2010 对话框程序的创建

    1)创建工程 2)选择对话框应用 3)打开工具箱 先打开资源管理器,点击IDD_TEST1_DIALOG对话框,然后在菜单栏中“视图”----“工具箱”

  8. MySQL用户与权限

    用户连接到mysql,并做各种查询,在用户和服务器中间分为两个阶段: 1:用户是否有权连接上来 2:用户是否有权执行此操作(如select,update等等) 先看第一个阶段:服务器如何判断用户是否有 ...

  9. CentOS安装MySQL8.x

    MySQL的安装 (4,5,6可省略) 声明:CentOS版本为7.6,安装的MySQL版本为8.0.17 1. 首先要卸载掉本机自带的mysql相关,包括MariaDB. rpm -pa | gre ...

  10. linux设备驱动程序-i2c(1):i2c总线的添加与实现

    linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...