一 学习目标

这是一段远程控制木马开机启动的代码,主要使用了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

https://www.leavesongs.com/C/ActiveX-Auto-Start.html

编程实现木马的ActiveX启动和注入IE的启动方式

http://blog.csdn.net/chinafe/article/details/3947762

三 实现流程

编程环境

操作系统: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 <process.h> // 删除原先创建的键值
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;
}

成功截图

【API】开机自启动- ActiveX启动的更多相关文章

  1. CentOS中在/etc/rc.local添加开机自启动项启动失败

    应项目要求需要在开机的时候启动自己的Agent程序,想当然的直接就往/etc/rc.local当中添加启动命令,结果重启之后发现什么都没有发生....一开始还以为是Python路径的问题,结果改成绝对 ...

  2. 注册表 API 以及开机自启动

    注册表是window系统中非常重要的一部分,今天在网上查了一些文章学习了下,觉得其中有一句话总结的很经典:注册表是用来存储信息的. 这句话虽然有点废,但是说的没错.当然,注册表中包含的内容非常多,远没 ...

  3. Linux Oracle服务启动&停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  4. nginx启动、开机自启动、重启、关闭

    yum -y  install nginx # yum info nginx Loaded plugins: fastestmirror Loading mirror speeds from cach ...

  5. Linux Oracle服务启动&停止脚本与开机自启动[转]

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  6. 【转】Linux Oracle服务启动&停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设置相关参数,首先先介 ...

  7. ubuntu16.04 程序开机自启动设置及启动优化

    使用过程中,为了方便使用,有一些程序需要开机时自启动应用,下面将介绍一下ubuntu16.04下程序的开机自启动设置方法. 1  建立一个可执行程序的运行脚本如 keepalive.sh.内部写入要执 ...

  8. (转)Linux Oracle服务启动&停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  9. C# winform程序实现开机自启动,并且识别是开机启动还是双击启动

    开机启动程序,在很多场合都会用到,尤其是那种在后台运行的程序. 效果图: 以上两幅图都用到了命令行启动程序,为了模拟开机启动或者其他程序调用此程序. 第一幅图:程序启动可以根据不同参数,执行不同的操作 ...

随机推荐

  1. HNOI2018滚粗记

    day 0 最近发现机房的人都有些焦虑(除了一些神犇)自己也被影响地紧张起来 唉,不知道是不是一种好的心态,紧张是必然的... 随便打了点板子(\(FFT,SA,LCT\)) 很棒一个都没考 day ...

  2. [luogu3801]红色的幻想乡

    题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在 ...

  3. linux-shell数据重定向详细分析

    在了解重定向之前,我们先来看看linux 的文件描述符.linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写 ...

  4. luogu4360 锯木厂选址 (斜率优化dp)

    设: sw[i]为1..i的w之和 sd[i]为1到i的距离 cost[i]为把第一个锯木厂建在i带来的花费 all[i,j]为把i..j所有木头运到j所需要的花费 所以$all[i,j]=cost[ ...

  5. 一不小心用oracle关键子创建了表,如何修改

    一不小心将备注字段建成了ORACLE的关键子COMMENT. 用下面的语句修改成NOTES ------------------------------------------------------ ...

  6. SpaceNet 数据集

    SpaceNet 数据集 SpaceNet是DigitalGlobe商业卫星公司提供的遥感图像集合,包含一些标记信息可用作机器学习研究. SpaceNet Challenge主页: https://s ...

  7. hdu 1756(判断点是否在多边形中)

    传送门 题解: 射线法判定点是否在多边形内部: AC代码: #include<iostream> #include<cstdio> #include<cmath> ...

  8. 1021. Deepest Root (25)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  9. 部署支持 https 的 Nginx 服务

    通过 Certbot 为 nginx 开启https支持. 环境 CentOS 7.1 python2.x(这玩意系统里本来就有) 安装Nginx sudo yum install nginx -y ...

  10. JAVA记录-SpringMVC scope属性的两种模式

    singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只 ...