VC++中讀寫注冊表


 

提到注冊表,各位黑友沒有哪個不或多或少都有所了解,因為在好多的黑客軟件中,可能需要涉及到這方面的編程,如系統啟動自動加載程序運行,收集肉機的相關信息,修改相關的設置,提高服務器的抗拒絕服務攻擊能力等,所以說,對注冊表的編程操作是我們各位黑友進行工具開發的重要內容,我們沒有理由不深入了解它。

WINDOWS系列操作系統的注冊數據庫(Registry)是系統中非常重要的組成部分,在Win32 API中有一組注冊表操作函數來處理這些問題,其一般的讀寫過程如下:
 
    1
、使用RegOpenKeyExRegCreateKeyEx函數打開或創建一個鍵; 
    2
、如果上一步成功,使用RegQueryValueEx讀取子鍵的值,使用RegSetValueEx設置子鍵值,使用RegEnumKey獲得所有子鍵,使用RegDeleteKey刪除一個鍵;
 
    3
、完成操作后使用RegCloseKey關閉鍵。

 

 而Windows API 中可用於注冊表的函數一共有二十多個,根據其功能不同可以分為如下幾類:

 

鍵管理類

RegCloseKey()

RegCreateKey()

RegCreateKeyEx()

RegDeleteKey()

 

RegDeleteKeyEx()

RegOpenKey()

RegOpenKeyEx()

 

 

值管理類

RegDeleteValue()

RegQueryValue()

RegQueryValueEx()

RegSetValue()

 

 

RegSetValueEx()

 

 

 

 

查詢計數類

RegQueryInfoKey()

RegEnumKey()

RegEnumKeyEx()

RegEnumValue()

 

備份/恢復類

RegLoadKey()

RegReplaceKey()

RegRestoreKey()

RegSaveKey()

 

實用類

RegConnectRegistry()

RegNotifyChangeKeyValue() 

RegUnloadKey()

安全類
(
僅適用於NT)

RegGetKeySecurity()

RegSetKeySecurity()

 

以上注冊表函數的細節請參閱注冊表函數細節,地址是:(包括相關的也在相鄰地方,這里僅是RegCloseKey()這個函數)http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regclosekey.asp 下邊我們就來詳細介紹相關的內容。

           一、基本操作介紹

  我們對注冊表的操作一般的步驟是,打開、讀寫、關閉,那就先來看看相關最重要的幾個函數介紹吧,其它更多的函數還得靠大家去MSDN查閱。

首先來看看,打開與關閉函數,在讀寫注冊表前,必須先將目標的子鍵打開,也就是取得一個操作的句柄,而打開這個函數最常用的就是RegCreateKeyEx如果沒有這個鍵存在,那么就會自動的創建這個子鍵項。

LONG RegCreateKeyEx(

      HKEY hKey,                         //父鍵的句柄

      LPCTSTR lpSubKey,               //子鍵名稱

      DWORD Reserved,                  //一般為0

      LPTSTR lpClass,                      //一般為0

      DWORD dwOptions,               //創建子鍵時的選項

      REGSAM samDesired,             //打開方式

      LPSECURITY_ATTRIBUTES lpSecurityAttributes,      //指定繼承性

      PHKEY phkResult,                                 //用於返回子鍵的句柄

      LPDWORD lpdwDisposition                  //打開還是創建子鍵的信息

);

    如果函數調用成功,會返回ERROR_SUCCESS也就是說成功會返回0,失敗返回非0值。

SamDesired參數有多個取值,最后這個lpdwDisposition參數用於返回信息,有兩個取值:

REG_CREATED_NEW_KEY 指定的鍵不存在,那么創建。

REG_OPENED_EXISTING_KEY 指定的鍵存在,那么打開。另外還有相近的函數如下:

LONG RegOpenKeyEx(

      HKEY hKey,         // 要打開主鍵的句柄

      LPCTSTR lpSubKey,   //要打開子鍵

      DWORD ulOptions,    //保留

      REGSAM samDesired,  //安全存取參數

      PHKEY phkResult      //打開鍵句柄的地址

);

與打開函數相比,關閉就比較容易了,它的函數原型如下:

LONG RegCloseKey( HKEY hKey);所以只需傳入一個要關閉的句柄就行了。

然后,我們來看看讀寫的相關函數,讀取的函數原型如下:

LONG RegQueryValueEx(

  HKEY hKey,            //子鍵句柄

  LPCTSTR lpValueName,  //鍵值名稱

  LPDWORD lpReserved,   //0

  LPDWORD lpType,      //返回鍵值的數據類型

  LPBYTE lpData,         //返回鍵值的數據

  LPDWORD lpcbData     //緩沖區的大小

);

函數調用成功后,返回ERROR_SUCCESS.

 

寫的函數主要是RegCreateKeyEx外,還有RegSetValueEx,它的原型如下:

LONG RegSetValueEx(

  HKEY hKey,      //鍵值所在子鍵的句柄

  LPCTSTR lpValueName,  //要設置的鍵值名稱

  DWORD Reserved,      //0

  DWORD dwType,       //設置鍵值的數據類型

  const BYTE* lpData,     //設置鍵值的數據緩沖區

  DWORD cbData        //設置鍵值的數據緩沖區大小

);

 

最后再介紹一下刪除鍵值的函數,它就是:

LONG RegDeleteValue(

HKEY hKey,      //子鍵的句柄

LPCTSTR lpValueName   //刪除鍵值的名稱

);

 

這兩個函數的返回情況一樣,如果函數調用成功,會返回ERROR_SUCCESS也就是說成功會返回0,失敗返回非0值。

現在,我們在編程操作中常用到的幾個函數介紹完了,大家也有所了解了,但我們在實際編程中,當然要參考的函數還很多,下而我們就舉例的說明,一個是讀的,一個是寫的。

 

           二、注冊表的讀操作

在這里我們用編程操作實現讀注冊表里的配置信息,從而查詢出CPU的相關信息,CPU的重要性當然不用說,我們入侵了一台肉機后,可能很想知道CPU的相關信息,在注冊表的這個路徑下:HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/0

下邊我們看看編程的實現:

void CPUINFO(void)

{

    long lRet;

    HKEY hKey;

    TCHAR tchData[64];

    DWORD dwSize;

    lRet = RegOpenKeyEx(

    HKEY_LOCAL_MACHINE,

    "Hardware//Description//System//CentralProcessor//0",

    0,

    KEY_QUERY_VALUE,

    &hKey

);    //打開注冊表

if(lRet == ERROR_SUCCESS)//讀操作成功

{

    dwSize = sizeof(tchData);

    lRet = RegQueryValueEx(

                 hKey,

                "ProcessorNameString",

                NULL,

                NULL,

                (LPBYTE)tchData,

                 &dwSize

);    //如果打開成功,則讀

if(lRet == ERROR_SUCCESS)

{

    printf("/n CPU INFO:");

    printf("%s/n",tchData);

}

//以下是讀取失敗

else

{

    printf("/nCPU INFO:");

    printf("UNKNOWN/n");

}

 

}

//以下是打開失敗

else

{

    printf("/n CPU INFO:");

    printf("UNKNOWN/n");

}

RegCloseKey(hKey);//記住,一定要關閉

}

 

 

                三、注冊表的寫操作

在各種后門程序中,要實現的一個重要功能就是讓后門程序能在開機的時候實現自動啟動,當然,實現這樣自己啟動的方法有很多種,我這里主要是介紹的是修改注冊表中的相關設置來實現。另外就是不同的系統可能有點不一樣,需要修改改一下相關的內容。下邊是實現的程序:

void SELFRUN(void)

{

// 根鍵、子鍵名稱、和到子鍵的句柄

HKEY hRoot = HKEY_LOCAL_MACHINE;

char *szSubKey = "Software//Microsoft//Windows//CurrentVersion//Run";

HKEY hKey;// 打開指定子鍵

DWORD dwDisposition = REG_OPENED_EXISTING_KEY;

// 如果不存在不創建

LONG lRet =  RegCreateKeyEx(

hRoot,

szSubKey,

0,

NULL,

REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,

NULL,

&hKey,

&dwDisposition

);

if(lRet != ERROR_SUCCESS)

return ;

// 得到當前執行文件的文件名(包含路徑)

char szModule[MAX_PATH] ;

GetModuleFileName (NULL, szModule, MAX_PATH);

// 創建一個新的鍵值,設置鍵值數據為文件名

lRet = RegSetValueEx(

hKey,

"SelfRunDemo",

0,

REG_SZ,

(BYTE*)szModule,

strlen(szModule));

if(lRet == ERROR_SUCCESS)

{

printf(" self run success/n");

}

// 關閉子鍵句柄

RegCloseKey(hKey);

 

 

}

                四、函數的主體

#include <stdio.h>

#include <windows.h>

void SELFRUN(void)

void CPUINFO(void)

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

{

CPUINFO();

// SELFRUN();

//要用時自己改一下這,這里我僅是為了調試方便,放在一起了

}

最后說說,其實我們在實際的編程中,可能遠遠比這復雜,但基本知識還是這些,只要你多參考下相關的函數說明,我想你也會對注冊表的操作得心應手的,別人都說,不會自己寫程序的黑客,不叫黑客,現在你動手吧,不要讓別人再笑話你了,寫幾個簡單的程序其實也不是想象中的那么困難喲,祝各位黑友玩得高興!

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com