什么是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:WindowsMicrosoft.NETFrameworkv4.0.30319>InstallUtil.exe C:UserslocalhostDesktopWindowsServiceMyFirstServiceinDebug7dapExec.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! "; return 0; }
但是还是被拦截了,我又尝试了利用自己手上一些有签名的文件加载我的dll去创建服务,但是还是会被拦截(但是这种方法bypass360没问题)
现在脑壳里面想的就是搞一个火绒签名的exe去加载我的创建服务恶意文件bypass
暂时还没有想到啥其他方法