欧美性猛交黑人xxxx,成人毛片一区二区三区,久久综合九色综合精品,男的把j放进女人下面视频免费

檢測并禁用隱藏服務(wù)

  • 發(fā)布于:2022-02-21
  • 261 人圍觀
隱藏服務(wù)的概念是由hxdef 和rootkit這些后門工具提出的。這些后門工具通過掛鉤系統(tǒng)本地調(diào)用來隱藏自己,原本通過調(diào)用Windows API調(diào)用查看系統(tǒng)服務(wù)的企圖都是徒勞的。所以這時(shí)的系統(tǒng)是不可靠的,不值得信任的。目前針對查找隱藏服務(wù)的工具已經(jīng)有很多,比如IceSword,knlsc,F(xiàn)HS等等。雖然這些軟件都是免費(fèi)的,但是它們到目前為止都不是開源,所以將自己的實(shí)現(xiàn)版本展示出來,正如knlsc的作者所說的那樣,這是一個(gè)簡單的小程序。

Knlsc是通過將%SystemRoot%/System32/Config/System這個(gè)Hive文件轉(zhuǎn)儲(chǔ)出來,提取出ControlSet001/Services的子項(xiàng)再與RegEnumKeyEx的輸出結(jié)果進(jìn)行比對,發(fā)現(xiàn)若是在RegEnumKeyEx的輸出結(jié)果中沒有的子項(xiàng)就可以認(rèn)為是一個(gè)隱藏的服務(wù)。當(dāng)然knlsc還認(rèn)為隱藏服務(wù)必須同時(shí)擁有ImagePath,Start,Type三個(gè)鍵值。據(jù)說knlsc運(yùn)行時(shí)還將從資源段中放出一個(gè)驅(qū)動(dòng)程序,但是估計(jì)這個(gè)驅(qū)動(dòng)是假的。將knlsc托殼后用VC從資源段中導(dǎo)出的文件是一個(gè)沒有EntryPoint但有MZ標(biāo)志的驅(qū)動(dòng),沒有辦法進(jìn)行反匯編。或許作者使用了SMC技術(shù),放出資源文件后在進(jìn)行修改,在執(zhí)行文件中也有NtLoadDriver的調(diào)用片段,但是同一作者的knlps中的資源驅(qū)動(dòng)卻未作任何的處理。要實(shí)現(xiàn)檢測隱藏服務(wù)的功能其實(shí)沒有必要使用驅(qū)動(dòng)程序,即使可以驗(yàn)證knlsc驅(qū)動(dòng)的真實(shí)性。直接對Hive文件的轉(zhuǎn)儲(chǔ)也不是必須的,雖然這只要通過修改Gary Nebbett的示例代碼就可做到。

Hive文件的轉(zhuǎn)儲(chǔ)可以通過RegSaveKey函數(shù)來進(jìn)行,rootkitrevealer就是使用這個(gè)API的擴(kuò)充函數(shù)RegSaveKeyEx工作的,至少到目前為止還沒有掛鉤這類函數(shù)的后門,但是世上沒有永遠(yuǎn)的安全,在理論上是可行的,可能不得不對該函數(shù)的輸出文件進(jìn)行處理,這將在一定程度上影響該函數(shù)的執(zhí)行時(shí)間。使用該函數(shù)時(shí)還必須賦予調(diào)用進(jìn)程以SE_BACKUP_NAME權(quán)限。

在實(shí)現(xiàn)中將“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services"的子項(xiàng)都轉(zhuǎn)儲(chǔ)為Hive格式文件(使用DumpServiceInfo函數(shù)),存放在C:\tmp.hive,在C盤下不可有同名文件,否則會(huì)發(fā)生Dump錯(cuò)誤。現(xiàn)在的問題是如何對Hive格式文件進(jìn)行處理,在這一點(diǎn)上必須感謝Petter Nordahl-Hagen所寫的NT Registry Hive access library,它是The Offline NT Password Editor的一部分。本人的實(shí)現(xiàn)很大程度上就是參照他的程序,然而這個(gè)庫工作在Linux環(huán)境,但是它向VC編譯器移植的工作量是極少的,只需稍加修改。

1.將 #include  去掉

2.將程序中三處的

#define D_OFFS(o) ( (void *)&(key->o)-(void *)hdesc->buffer-vofs )

改為

#define D_OFFS(o) ( (int *)&(key->o)-(int *)hdesc->buffer-vofs )

因?yàn)樵冢郑弥袩o法打印void * 類型,只得改為int * 。

3.將程序中唯一的一處使用snprintf函數(shù)該為_snprintf,即

snprintf(path,maxlen,"(...)%s",tmp);改為

_snprintf(ptth,maxlen,”(…)%s”,tmp);

4.添加兩個(gè)VC不支持的函數(shù)來使編譯通過

void bzero(void *s,int n)

{

memset(s,0,n);

}

int strncasecmp(const char *s1, const char *s2, size_t n)

{

return _stricmp(s1,s2);

}

為了表示對Petter Nordahl-Hagen的尊重,我不再修改他的庫文件ntreg.c和ntreg.h(除了以上移植的需要),而是將所有需要重寫和添加的函數(shù)放到KHS.C文件中,這樣可以使原來的庫文件保持其獨(dú)立性。

由于在Petter庫中openHive函數(shù)使用open 和 read 函數(shù)來進(jìn)行hive文件的讀取,在VC條件下的read函數(shù)有一個(gè)問題,每當(dāng)文件中存在一個(gè)0x1a的二進(jìn)制數(shù)值時(shí),read函數(shù)就會(huì)在那兒終止,這樣就會(huì)導(dǎo)致hive文件無法完全導(dǎo)入。所以就使用了Windows API重寫openHive,命名為My_openHive。相應(yīng)的還重寫了closeHive,writeHive并加上了前綴My_。

隨后GetPatterns函數(shù)將使用RegEnumKey枚舉的服務(wù)鍵值名稱保存在pattern的全局變量指針中,為以后的匹配作準(zhǔn)備。ShowHideService函數(shù)是由nk_ls函數(shù)改寫的,將由Hive文件導(dǎo)出的buffer中的服務(wù)名稱與pattern作比較,這個(gè)比較過程使用CompareHive函數(shù)。若比較結(jié)果為相同,CompareHive會(huì)將pattern置為NULL,以提高匹配速度,或許有更好的匹配算法,但在這個(gè)小程序中也不使用了。若結(jié)果不同,則說明該服務(wù)是隱藏的,顯示出該隱藏服務(wù)的名稱,文件路徑(ShowPathImage是由cat_vk改寫的),啟動(dòng)類型和服務(wù)類型,并將該隱藏服務(wù)的啟動(dòng)類型改為SERVICE_DISABLED。如果存在隱藏服務(wù)并且禁止了該隱藏服務(wù)(僅在buffer中的修改),通過調(diào)用My_writeHive將修改過的hive 的buffer保存在C:\tmp2.hiv文件中,此時(shí)提供用戶一個(gè)選擇“是否要禁用隱藏服務(wù)”,默認(rèn)的選擇是“否”,如果用戶確實(shí)想要禁用,可輸入“Yes”或“Y",接著使用RestoreServiceInfo函數(shù)將C:\tmp2.hiv文件導(dǎo)回原來的%SystemRoot%/System32/Config/System這個(gè)Hive文件中,這一步由系統(tǒng)自己來完成,值得一提的是Win32函數(shù)RegRestoreKey即使在dwFlags參數(shù)中使用了REG_FORCE_RESTORE (8) ,在第一次調(diào)用時(shí)往往會(huì)錯(cuò)誤返回,一般在第二次調(diào)用就會(huì)成功,所以就使用了一個(gè)循環(huán)直到它成功后為止,并且調(diào)用它的進(jìn)程需要有SE_RESTORE_NAME的權(quán)限。

至于讓隱藏服務(wù)真正失去作用,仍然需要重新啟動(dòng)計(jì)算機(jī)之后。



下面給出KHS.C的完整源代碼:

/*

* KHS.cpp - Kill Hide Services v0.1

* Copyright (c) 2005 linux2linux.

*

* It takes notes from knlsc and FHS.

* Thank you, Petter Nordahl-Hagen, for your "NT Registry Hive access library"

*

* Freely distributable in source or binary for noncommercial purposes.

*

* THIS SOFTWARE IS PROVIDED BY PETTER NORDAHL-HAGEN `AS IS'' AND

* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

* ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE

* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

* SUCH DAMAGE.

*

*/



#include "ntreg.h"

#include



char **pattern;

int pattern_count;



int nohideservice;

int ischange;



extern char *val_types[REG_MAX+1];



struct hive *My_openHive(char *filename, int mode);

void My_closeHive(struct hive *hdesc);



int CompareHive(char *sample)

{

int i;

for(i = 0; i < pattern_count ; i++)

{

if(pattern!=NULL)

{

if( strcmp ( sample , pattern[ i ] ) == 0 )

{

free(pattern);

pattern=NULL;

return 1;

}

}

}

return 0;

}



//Because read can't work well in windows.

//while it read 0x1a from the opened file, the function read will stop there.

//I don't know the reason why, it work well in linux envoriment.



// read the dumped hive file to fill hive struct.

// return the point



struct hive *My_openHive(char *filename, int mode)

{

HANDLE hFile;

int szread;

struct hive *hdesc;

int vofs;

unsigned long pofs;

char *c;

struct hbin_page *p;

struct regf_header *hdr;

int verbose = (mode & HMODE_VERBOSE);



CREATE(hdesc,struct hive,1);



hdesc->filename = str_dup(filename);

hdesc->state = 0;

hdesc->size = 0;

hdesc->buffer = NULL;



hFile = CreateFile(hdesc->filename,

GENERIC_READ,                 // open for reading

0,                            // do not share

NULL,                         // no security

OPEN_ALWAYS,                // existing file only

FILE_ATTRIBUTE_NORMAL,        // normal file

NULL);                                   // no attr. template



if (hFile == INVALID_HANDLE_VALUE)

{

printf("Could not open hive file.");  // process error

return 0;

}



/* Read the whole file */

hdesc->size = GetFileSize(hFile,  NULL);

ALLOC(hdesc->buffer,1,hdesc->size);

ReadFile(hFile, (void *)hdesc->buffer, hdesc->size, &szread, NULL);

CloseHandle(hFile);



if (szread < hdesc->size) {

printf("Could not read file, got %d bytes while expecting %d\n",

szread, hdesc->size);

My_closeHive(hdesc);

return(NULL);

}



/* Now run through file, tallying all pages */

/* NOTE/KLUDGE: Assume first page starts at offset 0x1000 */



pofs = 0x1000;



hdr = (struct regf_header *)hdesc->buffer;

if (hdr->id != 0x66676572) {

printf("openHive(%s): File does not seem to be a registry hive!\n",filename);

return(hdesc);

}

for (c = hdr->name; *c && (c < hdr->name + 64); c += 2) putchar(*c);



hdesc->rootofs = hdr->ofs_rootkey + 0x1000;



while (pofs < hdesc->size) {

#ifdef LOAD_DEBUG

if (verbose) hexdump(hdesc->buffer,pofs,pofs+0x20,1);

#endif

p = (struct hbin_page *)(hdesc->buffer + pofs);

if (p->id != 0x6E696268) {

printf("Page at 0x%lx is not 'hbin', assuming file contains garbage at end",pofs);

break;

}

hdesc->pages++;

#ifdef LOAD_DEBUG

if (verbose) printf("\n###### Page at 0x%0lx has size 0x%0lx, next at 0x%0lx ######\n",pofs,p->len_page,p->ofs_next);

#endif

if (p->ofs_next == 0) {

#ifdef LOAD_DEBUG

if (verbose) printf("openhive debug: bailing out.. pagesize zero!\n");

#endif

return(hdesc);

}

#if 0

if (p->len_page != p->ofs_next) {

#ifdef LOAD_DEBUG

if (verbose) printf("openhive debug: len & ofs not same. HASTA!\n");

#endif

exit(0);

}

#endif





vofs = pofs + 0x20; /* Skip page header */

#if 1

while (vofs-pofs < p->ofs_next) {

vofs += parse_block(hdesc,vofs,verbose);



}

#endif

pofs += p->ofs_next;

}



return(hdesc);



}



void My_closeHive(struct hive *hdesc)

{

FREE(hdesc->filename);

FREE(hdesc->buffer);

FREE(hdesc);

}



int My_writeHive(struct hive *hdesc)

{

HANDLE hFile;

DWORD dwBytesWritten;



hFile = CreateFile("C:\\tmp2.hiv",

GENERIC_WRITE,                // open for writing

0,                            // do not share

NULL,                         // no security

CREATE_ALWAYS,                  // open or create

FILE_ATTRIBUTE_NORMAL,        // normal file

NULL);



if(hFile == INVALID_HANDLE_VALUE)

{      printf("Can't open dump file");

return 0;

}



WriteFile(hFile, hdesc->buffer, hdesc->size,&dwBytesWritten, NULL);



if(dwBytesWritten != hdesc->size)

{

printf("WriteHive error\n");

}



CloseHandle(hFile);

return 0;

}



void CleanPatterns()

{

int i;

if(pattern!=NULL)

{

for(i = 0; i < pattern_count; i++)

{

if(pattern!=NULL)

free(pattern);

}

free(pattern);

}

}



void GetPatterns()

{

HANDLE hService;

CHAR     achKey[MAX_PATH];

DWORD i;

DWORD retCode;

int Nohide = 1;

DWORD SubKeyNum = 0;

pattern_count = 0;



if(RegOpenKeyEx(

HKEY_LOCAL_MACHINE,         // handle to open key

"SYSTEM\\ControlSet001\\Services", // subkey name

NULL,   // reserved

KEY_ALL_ACCESS,// security access mask

&hService    // handle to open key

) != ERROR_SUCCESS)

{

printf("sorry %d\n",GetLastError());

return;

}



RegQueryInfoKey( hService,

NULL,

NULL,

NULL,

&SubKeyNum,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL);



//Before it don't work well , because i set the wrong premission of HKEY

//KEY_ALL_ACCESS is needed



if(SubKeyNum == 0)

{

printf("SubKey's Number is NULL, it's too strange.\n");

return;

}



pattern = malloc(sizeof(char *) * SubKeyNum );



for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++)

{

retCode = RegEnumKey(

hService,      // handle to key to query

i,  // index of subkey to query

achKey,  // buffer for subkey name

MAX_PATH   // size of subkey name buffer

);



if (retCode == (DWORD)ERROR_SUCCESS)

{

//What i add to get pattern Services Table.

pattern[ pattern_count ] = strdup ( achKey ) ;

pattern_count++;

}

}

CloseHandle(hService);

}



void ShowPathImage(struct hive *hdesc, int nkofs, char *path)

{

void *data;

int len,i,type;

char string[SZ_MAX+1];



type = get_val_type(hdesc, nkofs, path);

if (type == -1) {

printf("No such value <%s>\n",path);

return;

}



len = get_val_len(hdesc, nkofs, path);

if (!len) {

printf("Value <%s> has zero length\n",path);

return;

}



data = (void *)get_val_data(hdesc, nkofs, path, 0);

if (!data) {

printf("Value <%s> references NULL-pointer (bad boy!)\n",path);

abort();

return;

}



switch (type) {

case REG_SZ:

case REG_EXPAND_SZ:

case REG_MULTI_SZ:

cheap_uni2ascii(data,string,len);

for (i = 0; i < (len>>1)-1; i++) {

if (string == 0) string = '\n';

if (type == REG_SZ) break;

}

puts(string);

break;

case REG_DWORD:

printf("0x%08x",*(unsigned short *)data);

break;

default:

printf("Don't know how to handle type yet!\n");

case REG_BINARY:

hexdump((char *)data, 0, len, 1);

}



}



void EnablePriv(LPCTSTR lpName)

{

HANDLE hToken;

LUID sedebugnameValue;

TOKEN_PRIVILEGES tkp;



if ( ! OpenProcessToken( GetCurrentProcess(),

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )

{    printf("open process error\n");

return;

}

if ( ! LookupPrivilegeValue( NULL, lpName  , &sedebugnameValue ) ){



printf("can't find privilege error\n");

CloseHandle( hToken );

return;

}

tkp.PrivilegeCount = 1;

tkp.Privileges[0].Luid = sedebugnameValue;

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof (tkp), NULL, NULL ) )

{

printf("adjust error\n");

CloseHandle( hToken );

}

}



int DumpServiceInfo()

{

HKEY hService;

EnablePriv(SE_BACKUP_NAME);



if(RegOpenKeyEx(

HKEY_LOCAL_MACHINE,         // handle to open key

"SYSTEM\\ControlSet001\\Services", // subkey name

NULL,   // reserved

KEY_ALL_ACCESS, // security access mask

&hService    // handle to open key

) != ERROR_SUCCESS)

{    printf("can't get key handle\n");

return 0;

}



if(RegSaveKey(hService,"C:\\tmp.hiv",NULL) != ERROR_SUCCESS)

{

printf("Can't dump Service info\n");

CloseHandle(hService);

return 0;

}

CloseHandle(hService);

return 1;

}



void ShowHideService(struct hive *hdesc, char *path, int vofs, int type)

{

struct nk_key *key;

int nkofs;

struct ex_data ex;

int count = 0, countri = 0;

//wHAT I ADD

void *data;

int nkofs_cat;

int serviceno;



serviceno = 1;



nkofs = trav_path(hdesc, vofs, path, 0);



if(!nkofs) {

printf("nk_ls: Key <%s> not found\n",path);

abort();

return;

}

nkofs += 4;



key = (struct nk_key *)(hdesc->buffer + nkofs);



if (key->id != 0x6b6e) {

printf("Error: Not a 'nk' node!\n");

debugit(hdesc->buffer,hdesc->size);

}



if (key->no_subkeys) {

while ((ex_next_n(hdesc, nkofs, &count, &countri, &ex) > 0)) {

if(!CompareHive(ex.name) )

{

nohideservice = 0;



if(!(serviceno - 1))

printf("Hide Service List:\n");



printf("\n%d.------------------------------------------------------------\n",serviceno++ );

printf("Hide Service : %s\n", ex.name );

nkofs_cat = trav_path(hdesc, vofs, ex.name, 0);



printf("Image Path   : ");

ShowPathImage(hdesc, nkofs_cat + 4, "ImagePath");



data = (void *) get_val_data(hdesc, nkofs_cat + 4, "Start", 0 );

if( data != NULL)

{

printf("Start Type   : ");

switch(*(unsigned short *)data)

{

case 0:

printf("SERVICE_BOOT_START");

break;

case 1:

printf("SERVICE_SYSTEM_START");

break;

case 2:

printf("SERVICE_AUTO_START");

break;

case 3:

printf("SERVICE_DEMAND_START");

break;

case 4:

printf("SERVICE_DISABLED");

break;

default:

printf("UNKOWN START TYPE");

}



//disable the service



if( *(unsigned short *)data != 4 )

{

printf("(Will be set to Disabled)");

put_dword(hdesc, nkofs_cat + 4, "Start", 4);

ischange = 1;

}



printf("\n");



}



data = (void *) get_val_data(hdesc, nkofs_cat + 4, "Type", 0 );

printf("Service Type : ");

if( data != NULL)

{

if(*(unsigned short *)data & 1)

printf("SERVICE_KERNEL_DRIVER ");

if(*(unsigned short *)data & 2)

printf("SERVICE_FILE_SYSTEM_DRIVER " );

if(*(unsigned short *)data & 8)

printf("SERVICE_RECOGNIZER_DRIVER ");

if(*(unsigned short *)data & 16)

printf("SERVICE_WIN32_OWN_PROCESS ");

if(*(unsigned short *)data & 32)

printf("SERVICE_WIN32_SHARE_PROCESS ");

if(*(unsigned short *)data & 256)

printf("SERVICE_INTERACTIVE_PROCESS ");

printf("\n");

}

}

FREE(ex.name);

}

}



if(nohideservice)

printf("There are no hide services.\n");

else

printf("\nTotal Hide Services is %d\n\n",serviceno - 1);



}



int RestoreServiceInfo()

{

HKEY hService;

LONG tmp;



EnablePriv(SE_RESTORE_NAME);



if(RegOpenKeyEx(

HKEY_LOCAL_MACHINE,         // handle to open key

"SYSTEM\\ControlSet001\\Services", // subkey name

NULL,   // reserved

KEY_ALL_ACCESS,// security access mask

&hService    // handle to open key

) != ERROR_SUCCESS)

{

printf("Can't open Service key\n");

return 0;

}



//The first time to Restore always fail even you set the Force flag

//The second time will success.

for(;;)

{

if((tmp = RegRestoreKey(hService,"C:\\tmp2.hiv", 8 ) ) == ERROR_SUCCESS )

{

break;

}

}

CloseHandle(hService);

return 1;

}





int main(int argc, char* argv[])

{

struct hive *pHive;

char c;



nohideservice = 1;

ischange = 0;



printf("KHS - kill hide services 0.1 by linux2linux, 2005/5/26.\n");

printf("Take notes from knlsc and FHS.                         \n\n");



if(!DumpServiceInfo())

return 0;



pHive = My_openHive("C:\\tmp.hiv",HMODE_RW);

if(pHive == NULL)

{

printf("Open Hive fail\n");

return 0;

}



GetPatterns();

ShowHideService(pHive,"",pHive->rootofs + 4 , 0);

CleanPatterns();



if(!nohideservice && ischange )

{

My_writeHive(pHive);



printf("Do you want Disable the hide Services ( Yes / No )? [ No ]:");

c = getchar();

if( ( c == 'Y' )|| c == 'y')

{

if( RestoreServiceInfo() )

printf("Success Restore\n");

}

else

{    printf("Quit without Restore.\n");

}

DeleteFile("C:\\tmp2.hiv");

}

DeleteFile("C:\\tmp.hiv");

My_closeHive(pHive);



return 0;

}



參考資源



1.The Offline NT Password Editor 源程序 - Petter Nordahl-Hagen

http://home.eunet.no/~pnordahl/ntpasswd/

2.<> - Gary Nebbett

3.Knlsc, FHS, IceSword 使用說明
萬企互聯(lián)
標(biāo)簽: