什么是API?
API(應用程序接口)是一組預定義的Windows函數,用於控制每個Windows元素的外觀和行為(從桌面窗口的外觀到新進程的內存分配)。每個用戶操作都會導致執行多個或多個API函數,從而告訴Windows發生了什么。
它類似於Windows的本機代碼。其他語言僅充當外殼程序,以提供一種自動化且更輕松的方法來訪問API。在.NET中,我們可以使用平台Interop Services調用Win 32 API,該平台位於System.Runtime.InteropServices命名空間。
Windows API位於Windows系統目錄中的DLL中,例如User32.dll,GDI32.dll,Shell32.dll等。這些基本的win32 API分為三種不同的類型,具體取決於它們中駐留的代碼。 分離如下 User32.dll-處理用戶界面內容 Kernel32.dll-文件操作,內存管理 Gdi32.dll-涉及圖形化Whatnots
現在,我將介紹如何在您的.NET應用程序中使用這些Win32 API來享受Win32 API的奢華。我要介紹的這些用法是我們將要進行的一些步驟,並討論一些實時示例,這些示例將向您展示Win32 API的美麗。
讓我們從API聲明開始,正如我之前提到的,.NET具有可與外部DLL一起使用的Interop Services。因此,通過在應用程序中使用Syetem.Runtime.InteropServices命名空間,您可以獲得一些功能,通過這些功能可以調用外部應用程序。
寫入服務名和描述

這里給出Myservice的代碼(代碼對應服務啟動暫停終止時候執的操作)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace MyFirstService
{
public partial class Service1 : ServiceBase
{
Timer timer = new Timer(); // name space(using System.Timers;)
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
WriteToFile("Service is started at " + DateTime.Now);
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 5000; //number in milisecinds
timer.Enabled = true;
}
protected override void OnStop()
{
WriteToFile("Service is stopped at " + DateTime.Now);
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
WriteToFile("Service is recall at " + DateTime.Now);
}
public void WriteToFile(string Message)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
if (!File.Exists(filepath))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(filepath))
{
sw.WriteLine(Message);
}
}
else
{
using (StreamWriter sw = File.AppendText(filepath))
{
sw.WriteLine(Message);
}
}
}
}
}
使用net的創建服務方式
c:\Windows\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe C:\Users\localhost\Desktop\WindowsService\MyFirstService\bin\Debug\7dapExec.exe

可以看見安裝完成


但是在火絨全開保護的情況下會創建失敗

由於代碼是類似sc create方式創建的服務我這里嘗試更底層一些去看看能不能繞過
// WindowsAPIcreatServer.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#define SERVICE_NAME "Myservice"
#pragma comment(lib, "advapi32.lib")
void ServiceInstall()
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
char binpath[]= "c:\\programdata\\config.exe";
char szPath[MAX_PATH] = { 0 };
if (!GetModuleFileNameA(NULL, szPath, MAX_PATH))
return;
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!schSCManager)
return;
schService = CreateServiceA(schSCManager,
SERVICE_NAME,
SERVICE_NAME,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
binpath,
NULL,
NULL,
NULL,
NULL,
NULL);
/* GetModuleFileName(NULL, path, MAX_PATH);
if ((bslash = strrchr(path, '\\')))
*bslash = 0;
strcpy(binpath, path);
strcat(binpath, "\\wircd.exe");
hService = CreateService(hSCManager, "UnrealIRCd", "UnrealIRCd",
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, binpath,
NULL, NULL, NULL, NULL, NULL);*/
if (!schService)
{
CloseServiceHandle(schSCManager);
return;
}
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
}
int main(int argc, char** argv)
{
ServiceInstall();
std::cout << "Hello World!\n";
return 0;
}
但是還是被攔截了,我又嘗試了利用自己手上一些有簽名的文件加載我的dll去創建服務,但是還是會被攔截(但是這種方法bypass360沒問題)
現在腦殼里面想的就是搞一個火絨簽名的exe去加載我的創建服務惡意文件bypass
暫時還沒有想到啥其他方法
