版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第詳解C語(yǔ)言內(nèi)核字符串轉(zhuǎn)換方法在內(nèi)核編程中字符串有兩種格式ANSI_STRING與UNICODE_STRING,這兩種格式是微軟推出的安全版本的字符串結(jié)構(gòu)體,也是微軟推薦使用的格式,通常情況下ANSI_STRING代表的類(lèi)型是char*也就是ANSI多字節(jié)模式的字符串,而UNICODE_STRING則代表的是wchar*也就是UNCODE類(lèi)型的字符,如下文章將介紹這兩種字符格式在內(nèi)核中是如何轉(zhuǎn)換的。
在內(nèi)核開(kāi)發(fā)模式下初始化字符串也需要調(diào)用專(zhuān)用的初始化函數(shù),如下分別初始化ANSI和UNCODE字符串,我們來(lái)看看代碼是如何實(shí)現(xiàn)的。
#includentifs.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
//定義內(nèi)核字符串
ANSI_STRINGansi;
UNICODE_STRINGunicode;
UNICODE_STRINGstr;
//定義普通字符串
char*char_string="hellolyshark";
wchar_t*wchar_string=(WCHAR*)"hellolyshark";
//初始化字符串的多種方式
RtlInitAnsiString(ansi,char_string);
RtlInitUnicodeString(unicode,wchar_string);
RtlUnicodeStringInit(str,L"hellolyshark");
//改變?cè)甲址▉y碼位置,此處僅用于演示賦值方式)
char_string[0]=(CHAR)"A";//char類(lèi)型每個(gè)占用1字節(jié)
char_string[1]=(CHAR)"B";
wchar_string[0]=(WCHAR)"A";//wchar類(lèi)型每個(gè)占用2字節(jié)
wchar_string[2]=(WCHAR)"B";
//輸出字符串%Z
DbgPrint("輸出ANSI:%Z\n",ansi);
DbgPrint("輸出WCHAR:%Z\n",unicode);
DbgPrint("輸出字符串:%wZ\n",str);
DbgPrint("驅(qū)動(dòng)加載成功\n");
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
代碼輸出效果:
內(nèi)核中還可實(shí)現(xiàn)字符串與整數(shù)之間的靈活轉(zhuǎn)換,內(nèi)核中提供了RtlUnicodeStringToInteger這個(gè)函數(shù)來(lái)實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù),與之對(duì)應(yīng)的RtlIntegerToUnicodeString則是將整數(shù)轉(zhuǎn)為字符串這兩個(gè)內(nèi)核函數(shù)也是非常常用的。
#includentifs.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//Power:lyshark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
NTSTATUSflag;
ULONGnumber;
DbgPrint("hellolyshark\n");
UNICODE_STRINGuncode_buffer_source={0};
UNICODE_STRINGuncode_buffer_target={0};
//字符串轉(zhuǎn)為數(shù)字
//By:LyShark
RtlInitUnicodeString(uncode_buffer_source,L"100");
flag=RtlUnicodeStringToInteger(uncode_buffer_source,10,number);
if(NT_SUCCESS(flag))
DbgPrint("字符串-數(shù)字:%d\n",number);
//數(shù)字轉(zhuǎn)為字符串
uncode_buffer_target.Buffer=(PWSTR)ExAllocatePool(PagedPool,1024);
uncode_buffer_target.MaximumLength=1024;
flag=RtlIntegerToUnicodeString(number,10,uncode_buffer_target);
if(NT_SUCCESS(flag))
DbgPrint("數(shù)字-字符串:%wZ\n",uncode_buffer_target);
//釋放堆空間
RtlFreeUnicodeString(uncode_buffer_target);
DbgPrint("驅(qū)動(dòng)加載成功\n");
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
代碼輸出效果:
繼續(xù)看另一種轉(zhuǎn)換模式,將UNICODE_STRING結(jié)構(gòu)轉(zhuǎn)換成ANSI_STRING結(jié)構(gòu),代碼中調(diào)用了RtlUnicodeStringToAnsiString內(nèi)核函數(shù),該函數(shù)也是微軟提供的。
#includentifs.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//Power:lyshark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("hellolyshark\n");
UNICODE_STRINGuncode_buffer_source={0};
ANSI_STRINGansi_buffer_target={0};
//初始化UNICODE字符串
RtlInitUnicodeString(uncode_buffer_source,L"hellolyshark");
//轉(zhuǎn)換函數(shù)
NTSTATUSflag=RtlUnicodeStringToAnsiString(ansi_buffer_target,uncode_buffer_source,TRUE);
if(NT_SUCCESS(flag))
DbgPrint("ANSI:%Z\n",ansi_buffer_target);
//銷(xiāo)毀ANSI字符串
RtlFreeAnsiString(ansi_buffer_target);
DbgPrint("驅(qū)動(dòng)加載成功\n");
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
代碼輸出效果:
如果將上述過(guò)程反過(guò)來(lái),將ANSI_STRING轉(zhuǎn)換為UNICODE_STRING結(jié)構(gòu),則需要調(diào)用RtlAnsiStringToUnicodeString這個(gè)內(nèi)核專(zhuān)用函數(shù)實(shí)現(xiàn)。
#includentifs.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//Power:lyshark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("hellolyshark\n");
UNICODE_STRINGuncode_buffer_source={0};
ANSI_STRINGansi_buffer_target={0};
//初始化字符串
RtlInitString(ansi_buffer_target,"hellolyshark");
//轉(zhuǎn)換函數(shù)
NTSTATUSflag=RtlAnsiStringToUnicodeString(uncode_buffer_source,ansi_buffer_target,TRUE);
if(NT_SUCCESS(flag))
DbgPrint("UNICODE:%wZ\n",uncode_buffer_source);
//銷(xiāo)毀UNICODE字符串
RtlFreeUnicodeString(uncode_buffer_source);
DbgPrint("驅(qū)動(dòng)加載成功\n");
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
代碼輸出效果:
如上代碼是內(nèi)核通用結(jié)構(gòu)體之間的轉(zhuǎn)換類(lèi)型,又是還需要將各類(lèi)結(jié)構(gòu)體轉(zhuǎn)為普通的字符類(lèi)型,例如下方的兩個(gè)案例:
例如將UNICODE_STRING轉(zhuǎn)為CHAR*類(lèi)型。
#define_CRT_SECURE_NO_WARNINGS
#includentifs.h
#includewindef.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//powerBY:LyShark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("hellolyshark\n");
UNICODE_STRINGuncode_buffer_source={0};
ANSI_STRINGansi_buffer_target={0};
charszBuf[1024]={0};
//初始化UNICODE字符串
RtlInitUnicodeString(uncode_buffer_source,L"hellolyshark");
//轉(zhuǎn)換函數(shù)
NTSTATUSflag=RtlUnicodeStringToAnsiString(ansi_buffer_target,uncode_buffer_source,TRUE);
if(NT_SUCCESS(flag))
strcpy(szBuf,ansi_buffer_target.Buffer);
DbgPrint("輸出char*字符串:%s\n",szBuf);
//銷(xiāo)毀ANSI字符串
RtlFreeAnsiString(ansi_buffer_target);
DbgPrint("驅(qū)動(dòng)加載成功\n");
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
代碼輸出效果:
如果反過(guò)來(lái),將CHAR*類(lèi)型轉(zhuǎn)為UNICODE_STRING結(jié)構(gòu)呢,可以進(jìn)行中轉(zhuǎn)最終轉(zhuǎn)為UNICODE_STRING結(jié)構(gòu)體。
#define_CRT_SECURE_NO_WARNINGS
#includentifs.h
#includewindef.h
#includentstrsafe.h
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//powerBY:LyShark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("hellolyshark\n");
UNICODE_STRINGuncode_buffer_source={0};
ANSI_STRINGansi_buffer_target={0};
//設(shè)置CHAR*
charszBuf[1024]={0};
strcpy(szBuf,"hellolyshark");
//初始化ANSI字符串
RtlInitString(ansi_buffer_target,szBuf);
//轉(zhuǎn)換函數(shù)
NTSTATUSflag=RtlAnsiStringToUnicodeStri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)業(yè)主題公園運(yùn)營(yíng)策略方法
- 2026年HRBP業(yè)務(wù)伙伴角色賦能課
- 2026年鄉(xiāng)村治理積分制應(yīng)用策略
- 2026湖北武漢武昌區(qū)中南電力設(shè)計(jì)院有限公司數(shù)智科技公司招聘4人備考題庫(kù)及答案詳解1套
- 趣味天文知識(shí)
- 職業(yè)噪聲暴露限值標(biāo)準(zhǔn)的制定依據(jù)
- 職業(yè)健康風(fēng)險(xiǎn)評(píng)估方法學(xué)在化工行業(yè)中的創(chuàng)新應(yīng)用
- 2023年船企裝備行業(yè)分析報(bào)告及未來(lái)五至十年行業(yè)發(fā)展報(bào)告
- 職業(yè)健康風(fēng)險(xiǎn)評(píng)估與員工職業(yè)發(fā)展精準(zhǔn)匹配策略-1
- 職業(yè)安全教育培訓(xùn)收獲課件
- 2026重慶高新開(kāi)發(fā)建設(shè)投資集團(tuán)招聘3人備考考試試題及答案解析
- 2026年度宣城市宣州區(qū)森興林業(yè)開(kāi)發(fā)有限公司第一批次員工公開(kāi)招聘筆試參考題庫(kù)及答案解析
- 老年人管理人員培訓(xùn)制度
- 2025年湖南常德市鼎城區(qū)面向全市選調(diào)8名公務(wù)員備考題庫(kù)及答案詳解(新)
- 2026北京海淀初三上學(xué)期期末語(yǔ)文試卷和答案
- 2025學(xué)年度人教PEP五年級(jí)英語(yǔ)上冊(cè)期末模擬考試試卷(含答案含聽(tīng)力原文)
- GB/T 3098.6-2023緊固件機(jī)械性能不銹鋼螺栓、螺釘和螺柱
- 公司食材配送方案
- GA/T 952-2011法庭科學(xué)機(jī)動(dòng)車(chē)發(fā)動(dòng)機(jī)號(hào)碼和車(chē)架號(hào)碼檢驗(yàn)規(guī)程
- 教科版科學(xué)五年級(jí)下冊(cè)《生物與環(huán)境》單元教材解讀及教學(xué)建議
- 5Why分析法(經(jīng)典完整版)課件
評(píng)論
0/150
提交評(píng)論