有關遍歷程序中控制代碼的方法總結

2021-06-19 11:16:21 字數 3880 閱讀 8003

此篇文章說是原創有些牽強。就像題目所說的,更多的是對前人方法的總結。寫作的初衷倒也不是技術方面的研究,不過是工作的需求罷了。

方法中涉及到一些函式需要提權,其實我一直以為網上那個標準的提權函式沒什麼用,直到這次寫程式我才知道原來有的時候是真的需要提權的。現附上乙份比較好看的提權**,也方便自己以後使用。

bool adjustprocessprivilege(handle hprocess, lpctstr lpprivilegename, dword dwprivilegeattribute)

}//關閉程序令牌控制代碼

closehandle(hprocesstoken);

}return bretvalue;

}呼叫方法如下:

if(adjustprocessprivilege((handle)null, se_debug_name, se_privilege_enabled) == false ||

adjustprocessprivilege((handle)null, se_take_ownership_name, se_privilege_enabled) == false ||

adjustprocessprivilege((handle)null, se_security_name, se_privilege_enabled) == false ||

adjustprocessprivilege((handle)null, se_audit_name, se_privilege_enabled) == false)

整個提權流程實現起來比較傻瓜化,很符合我的喜好。

好了,步入正體。開始總結如何遍歷乙個程序中所開啟的控制代碼。首先,介紹兩個結構體。

typedef struct _system_handle

system_handle, *psystem_handle;

typedef struct _system_handle_information

system_handle_information, *psystem_handle_information;

這兩個結構體定義了系統控制代碼的資訊。接下來,我們看**:

void myclosehandle(dword pid)

closehandle(hfile);

}closehandle(hprocess);}}

}heapfree(hheap, 0, info);

}printf("duplicate finish.\n");

}hheap是乙個handle型的全域性變數,由於用的地方多並且我比較懶,所以定義成了乙個全域性變數。最好還是作為區域性變數從函式中傳遞。至於getinfotable留到下面再說。systemhandleinformation則是用來獲取系統中控制代碼資訊的乙個重要引數。參見結構體:

typedef enum _systeminfoclass

systeminfoclass, *psysteminfoclass;

通篇文章用到了很多系統未公開函式和結構體。其實這些東西網上都可以查到,我就不細說了。其實水平太菜,想說清楚也不太容易。

當找到屬於目標程序中的控制代碼後,通過duplicatehandle將該控制代碼再次開啟,只不過這次開啟為當前程序所用,以備獲取該控制代碼的其它資訊。接下來通過getfilename獲得該控制代碼的名稱。當然這個函式也留到後面再說。我們先來看一下getinfotable。

pvoid getinfotable(in ulong atabletype)

zwquerysysteminformation zwquerysysteminformation = (zwquerysysteminformation)getprocaddress(hntdll, "zwquerysysteminformation");

if( zwquerysysteminformation == null)

status = zwquerysysteminformation(atabletype, mptr, msize, null);

if (status == status_info_length_mismatch)

} while (status == status_info_length_mismatch);

if (nt_success(status)) return mptr;

heapfree(hheap, 0, mptr);

return null;

}這個函式則是利用zwquerysysteminformation獲取當前系統中的控制代碼資訊。而zwquerysysteminformation則是乙個未公開函式。

typedef ntstatus (winapi *zwquerysysteminformation)(unsigned long, pvoid, ulong, pulong);

ntstatus

zwquerysysteminformation(

in systeminfoclass systeminformationclass,

out pvoid systeminformation,

in ulong systeminformationlength,

out pulong returnlength optional

);然後我們再看getfilename,看看是如何獲取到控制代碼所對應的檔名稱的。

void getfilename(handle hfile, pchar thename)

其中,pnm_info結構體如下:

typedef struct _file_name_information file_name_information, *pfile_name_information;

typedef struct _nm_info

nm_info, *pnm_info;

接下來這裡通過建立執行緒getfilenamethread來進一步獲取控制代碼資訊。

dword winapi getfilenamethread(pvoid lpparameter)

zwqueryinformationfile zwqueryinformationfile = (zwqueryinformationfile)getprocaddress(hntdll, "zwqueryinformationfile");

if( zwqueryinformationfile == null)

zwqueryinformationfile(nminfo->hfile, &iostatus, &nminfo->info, sizeof(nm_info) - sizeof(handle), filenameinformation);

return 0;

}我們發現,函式中利用到了zwqueryinformationfile來獲取控制代碼詳細資訊。而zwqueryinformationfile則又是乙個未公開函式。

typedef ntstatus (winapi *zwqueryinformationfile)(handle, pio_status_block, pvoid, ulong,

file_information_class);

ntstatus

zwqueryinformationfile(

in handle  filehandle,

out pio_status_block  iostatusblock,

out pvoid  fileinformation,

in ulong  length,

in file_information_class  fileinformationclass

);而file_information_class則是乙個列舉型別。

typedef enum _file_information_class file_information_class, *pfile_information_class;

時間有點緊,總結的有些粗略。回頭抽出時間來再完善吧。

獲取視窗的控制代碼方法總結

控制代碼獲取方法 獲取該視窗的控制代碼後,即可向該視窗類類傳送訊息 處理程式 例如 postmessage 控制代碼 wm user drawviewpic eds,0,0 0。獲取所在類視窗的控制代碼 this m hwnd 1。主視窗的控制代碼 無論在主視窗類內,還是子視窗類內,獲取主視窗控制代...

陣列反向遍歷ios iOS中遍歷的方法總結

在ios開發中,可以使用多種方法進行元素遍歷,具體有一下幾種 經典for迴圈 nsarray iosarray a b c d e f g for int i 0 i iosarray.count i 處理陣列中資料 nslog iosarray i nsenumerator遍歷 nsarray i...

C 遍歷系統程序的方法

建立乙個listbox將程序名稱遍歷進去 this.listbox1.items.clear process myprocesses process.getprocesses foreach process myprocess in myprocesses this.listbox1.selecte...