此篇文章說是原創有些牽強。就像題目所說的,更多的是對前人方法的總結。寫作的初衷倒也不是技術方面的研究,不過是工作的需求罷了。
方法中涉及到一些函式需要提權,其實我一直以為網上那個標準的提權函式沒什麼用,直到這次寫程式我才知道原來有的時候是真的需要提權的。現附上乙份比較好看的提權**,也方便自己以後使用。
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...