.NET 技術 | 調用系統API創建Windows服務

01閱讀須知

此文所提供的信息只為網絡安全人員對自己所負責的網站、服務器等(包括但不限于)進行檢測或維護參考,未經授權請勿利用文章中的技術資料對任何計算機系統進行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失,均由使用者本人負責。本文所提供的工具僅用于學習,禁止用于其他方面

02SCM函數基本介紹

在Windows操作系統中,Services服務是以后臺進程的形式運行的,通常以高權限啟動并運行。因此,紅隊經常利用.NET框架,通過創建和管理Windows服務來實現權限維持。

2.1 SCM函數原型

OpenSCManager是Windows API中的一個核心函數,用于打開服務控制管理器 (Service Control Manager, SCM) 數據庫。服務控制管理器是Windows操作系統中管理服務的組件。通過這個函數,我們可以獲取一個句柄,用于后續操作(如創建、查詢、啟動或停止服務)。函數原型如下所示。

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);

OpenSCManager函數需要提供三個參數,machineName: 指定目標計算機名稱,databaseName: 指定要打開的數據庫名稱。dwAccess: 指定所需的訪問權限,例如SC_MANAGER_CREATE_SERVICE (值為2U),允許創建系統服務,詳細的權限說明如下所示。

圖片

當成功時,返回一個非零值 (IntPtr),表示服務控制管理器數據庫的句柄,如果遇到失敗:返回IntPtr.Zero,可以通過調用Marshal.GetLastWin32Error獲取詳細的錯誤信息。

2.2?使用SCM函數

以下是一個使用OpenSCManager函數打開本地服務控制管理器并創建服務的完整示例,具體代碼如下所示。

using System;
using System.Runtime.InteropServices;class Program
{[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);const uint SC_MANAGER_CREATE_SERVICE = 0x2;static void Main(){// 打開服務控制管理器IntPtr scmHandle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);// 檢查返回值是否為零if (scmHandle == IntPtr.Zero){int errorCode = Marshal.GetLastWin32Error();Console.WriteLine($"Failed to open SCM. Error Code: {errorCode}");return;}Console.WriteLine("Successfully opened the Service Control Manager.");// 后續邏輯:創建服務、啟動服務等// ...// 記得關閉句柄(如果需要)}
}

上述代碼,通過P/Invoke調用OpenSCManager函數,打開服務管理器的句柄,OpenSCManager是服務管理的起點,其返回的句柄直接影響后續操作的成功與否。使用時需注意提供正確的權限和參數,避免運行時錯誤。

03CreateService基本介紹

成功獲取SCM句柄后,可以通過調用CreateService函數創建一個新的系統服務,函數的原型如下所示。

[DllImport("Advapi32.dll")]
public static extern IntPtr CreateService(IntPtr serviceControlManagerHandle,string lpSvcName,string lpDisplayName,Program.SERVICE_ACCESS dwDesiredAccess,uint dwServiceType,uint dwStartType,uint dwErrorControl,string lpPathName,string lpLoadOrderGroup,IntPtr lpdwTagId,string lpDependencies,string lpServiceStartName,string lpPassword);

通常,創建服務時,需要提供服務的名稱、顯示名稱、啟動類型和服務路徑等關鍵信息,詳細參數列表如下所示。

圖片

以下代碼演示如何創建服務,服務創建失敗,會返回IntPtr.Zero,需要處理錯誤,具體代碼如下所示。

string serviceName = "MyService";
string serviceDisplayName = "My Custom Service";
string binPath = @"C:\Path\To\YourService.exe";IntPtr serviceHandle = Program.CreateService(scmHandle,serviceName,serviceDisplayName,SERVICE_ACCESS.SERVICE_ALL_ACCESS,16U, 2U,  1U,  binPath,null,IntPtr.Zero,null,null,null);if (serviceHandle == IntPtr.Zero)
{throw new Exception("Failed to create service.");
}

04工具實現

攻擊者通過?Sharp4Stay.exe 工具,利用?OpenSCManager 和?CreateService 函數打開服務控制管理器數據庫、創建系統服務以及啟動服務等這些步驟,實現目標權限維持。

因為圖片過長,不便于文章展示,因此通過隱藏部分用法達到縮短圖片長度,不便之處請讀者朋友們諒解。

05.NET安全星球

dot.Net安全矩陣星球已成為中國.NET安全領域最知名、最活躍的技術知識庫之一,從.NET Framework到.NET Core,從Web應用到PC端軟件應用,無論您是初學者還是經驗豐富的開發人員,都能在這里找到對應的安全指南和最佳實踐。

星球匯聚了各行業安全攻防技術大咖,并且每日分享.NET安全技術干貨以及交流解答各類技術等問題,社區中發布很多高質量的.NET安全資源,可以說市面上很少見,都是干貨。

圖片

圖片

圖片

星球文化始終認為授人以魚不如授人以漁!加入星球后可以跟星主和嘉賓們一對一提問交流,20+個專題欄目涵蓋了點、線、面、體等知識面,助力師傅們快速成長!其中主題包括.NET Tricks、漏洞分析、內存馬、代碼審計、預編譯、反序列化、webshell免殺、命令執行、C#工具庫等等。

圖片

????我們傾力打造專刊、視頻等配套學習資源,循序漸進的方式引導加深安全攻防技術提高以及崗位內推等等服務。

.NET?免殺WebShell
.NET?反序列化漏洞
.NET?安全防御繞過
.NET?內網信息收集
.NET?本地權限提升
.NET?內網橫向移動
.NET?目標權限維持
.NET?數據外發傳輸

這些階段所涉及的工具集不僅代表了當前.NET安全領域的最前沿技術,更是每一位網絡安全愛好者不可或缺的實戰利器。

文章涉及的工具已打包,請加/入/后下/載:https://wx.zsxq.com/group/51121224455454

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63472.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt】QWidget中的常見屬性及其功能(二)

目錄 六、windowOpacity 例子: 七、cursor 例子: 八、font 九、toolTip 例子: 十、focusPolicy 例子: 十一、styleSheet 計算機中的顏色表示 例子: 六、windowOpacity opacity是不透明度的意思。 用于設…

Elasticsearch02-安裝7.x

零、文章目錄 Elasticsearch02-安裝7.x 1、Windows安裝Elasticsearch (1)JDK安裝 Elasticsearch是基于java開發的,所以需要安裝JDK。我們安裝的Elasticsearch版本是7.15,對應JDK至少1.8版本以上。也可以不安裝jdk,…

php學習資料分享

php學習資料分享:夸克網盤分享

UWA Gears V1.0.5|新增Thread Load指標

UWA Gears 是UWA最新發布的無SDK性能分析工具。針對移動平臺,提供了實時監測和截幀分析功能,幫助您精準定位性能熱點,提升應用的整體表現。 本次版本更新主要是新增了Thread Load指標,幫助大家更直觀地了解多線程任務的負載分布情…

IAR中如何而將定義的數組放在指定的位置

在keil中可以使用下面的方法將數組定義到指定的位置 uint8_t g_usart_rx_buf[USART_REC_LEN] __attribute__ ((at(0X20001000)));但是這個方法在IAR中是用不了的,通過網上查找各種資料,發現了兩種可用的方法。我這里測試的單片機是stm32f103c8t6,其他單…

共創共建!葡萄城 SpreadJS 完成 HarmonyOS NEXT 操作系統兼容認證

最新技術資源(建議收藏) https://www.grapecity.com.cn/resources/ 近日,華為“企業工作必備應用鴻蒙化論壇”在北京圓滿落幕,論壇匯聚了眾多行業精英和合作伙伴,聚焦討論企業數字化轉型與原生鴻蒙生態融合等話題。葡萄…

hpe服務器更新陣列卡firmware

背景 操作系統:RHEL7.8 hpe服務器經常出現硬盤斷開,陣列卡重啟問題,導致系統hang住。只能手動硬重啟。 I/O error,dev sda smartpqi 0000:5c:00:0: resettiong scsi 1:1:0:1 smartpqi 0000:5c:00:0: reset of scsi 1:1:0:1:…

websocket的心跳檢測和斷線重連

心跳檢測和斷線重連可以通過WebSocket的事件和屬性來實現。以下是一個簡單的JavaScript示例,使用WebSocket API實現心跳檢測和斷線重連的功能: let ws;function connectWebSocket() {ws new WebSocket(ws://your-websocket-server-url);ws.onopen fun…

ES6學習Symbol(五)

這里寫目錄標題 一、概述二、代碼 一、概述 ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。 它是 JavaScript 語言的第七種數據類型,前六種是: undefined 、 null 、布爾值(Boolean)、字符串(St…

Spark-Streaming容錯語義

一、背景 為了理解Spark Streaming提供的語義,我們先回顧西Spark RDD的基本容錯語義學。 RDD是一個不可變的、確定性可重新計算的分布式數據集。每個RDD都記住在容錯輸入數據集上用于創建它的確定性操作的沿襲。如果RDD的任何分區由于工作節點故障而丟失&#xff…

AmpliconSuite-pipeline

AmpliconSuite-pipeline: 多線程支持的端到端工具,用于從配對端全基因組測序數據分析局部拷貝數擴增(如ecDNA或BFB) AmpliconSuite-pipeline 是一個多線程支持的端到端工具,用于 AmpliconArchitect 和 AmpliconClassifier,以支持從配對端全基因組測序數據分析局部拷貝數擴…

QNX通過pfctl工具查看socket通信狀態

通過pfctl -si && pfctl -ss可以查看當前主機IP和外域IP之間的所有socket通信狀態,顯示的格式是 傳輸層協議 | 主機IP | 外域IP | 主機端狀態:外域狀態 ------------------------------------------------------------------------…

Windows安全中心(病毒和威脅防護)的注冊

文章目錄 Windows安全中心(病毒和威脅防護)的注冊1. 簡介2. WSC注冊初探3. WSC注冊原理分析4. 關于AMPPL5. 參考 Windows安全中心(病毒和威脅防護)的注冊 本文我們來分析一下Windows安全中心(Windows Security Center…

JSX和vue模版哪個更好?

JSX和Vue模板各有優缺點,選擇哪種取決于具體需求和個人偏好。? JSX的優點 ?靈活性?:JSX允許在JavaScript代碼中直接插入任意表達式,這使得它在處理復雜邏輯時更加靈活。例如,條件渲染和循環渲染可以通過JavaScript的標準語法…

[代碼隨想錄21回溯]組合問題,電話號碼的字母組合問題

前言 回溯的提出是解決循環問題,回溯的提出就是為了解決排列和組合問題,以及多層遍歷問題,因為如果遍歷的層數越多我們的效率就會越低,回溯加上剪枝能很好解決這個問題。 題目鏈接 77. 組合 - 力扣(LeetCode&#xff…

智能工廠的設計軟件 三種處理單元(NPU/GPU/CPU)及其在深度學習框架中的作用 之2

本文要點 分類學 利用NPU、GPU和CPU的分工協作,實現 一個信息系統架構中的靈活的模塊化框架,該框架使用一個類似元素周期表的分類法,將 該元素周期表 左邊的行矢(時間關系,由應用規格 約束) 、頂上的列簇…

幾款主流的超聲波流量計應用場景梳理

清水應用 這款 聲樂 在含有最少固體或曝氣(≤ 1-2%)的清潔水的情況下表現出色。該儀表融合了卓越的性能和經濟性,使其成為需要外夾式超聲波流量計的應用的理想選擇。它在市政水處理設施中特別有效,其精度和成本效益確保了最佳運行…

Flag 驗證器

Flag 驗證器使用教程 Flag 驗證器 是一種常用工具,用來驗證命令行參數或配置文件中的標志(flag)是否符合預期規則。這些工具可以幫助開發者確保傳入的參數滿足一定的條件,避免因參數錯誤而導致程序運行失敗。以下是對各個驗證器功…

二進制分析的新興趨勢:塑造安全的移動應用

在當今快速發展的數字世界中,保障移動應用的安全性變得尤為重要。隨著移動技術的廣泛應用,安全性需求也日益增強。二進制分析作為確保移動應用安全和合規性的重要手段,通過對已編譯的應用進行深入分析,能夠發現源代碼中難以察覺的…

Python:動態粒子愛心

預覽 代碼結構概述 這段代碼使用了 pygame 庫來創建一個動態的圖形窗口,繪制一個心形圖案,并在其中顯示閃爍的文本。代碼主要分為以下幾個部分: 初始化和設置心形曲線的計算粒子類的定義生成粒子文本設置主循環 1. 初始化和設置 import p…