青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

[轉(zhuǎn)載]Windows NT/2000/XP下不用驅(qū)動(dòng)的Ring0代碼實(shí)現(xiàn)

Windows?NT/2000/XP下不用驅(qū)動(dòng)的Ring0代碼實(shí)現(xiàn)?????
??????????? WebCrazy(http://webcrazy.yeah.net/)

????大家知道,Windows?NT/2000為實(shí)現(xiàn)其可靠性,嚴(yán)格將系統(tǒng)劃分為內(nèi)核模式與用戶模式,在i386系統(tǒng)中分別對(duì)應(yīng)CPU的Ring0與Ring3級(jí)別。Ring0下,可以執(zhí)行特權(quán)級(jí)指令,對(duì)任何I/O設(shè)備都有訪問(wèn)權(quán)等等。要實(shí)現(xiàn)從用戶態(tài)進(jìn)入核心態(tài),即從Ring?3進(jìn)入Ring?0必須借助CPU的某種門機(jī)制,如中斷門、調(diào)用門等。而Windows?NT/2000提供用戶態(tài)執(zhí)行系統(tǒng)服務(wù)(Ring?0例程)的此類機(jī)制即System?Service的int?2eh中斷服務(wù)等,嚴(yán)格的參數(shù)檢查,只能嚴(yán)格的執(zhí)行Windows?NT/2000提供的服務(wù),而如果想執(zhí)行用戶提供的Ring?0代碼(指運(yùn)行在Ring?0權(quán)限的代碼),常規(guī)方法似乎只有編寫(xiě)設(shè)備驅(qū)動(dòng)程序。本文將介紹一種在用戶態(tài)不借助任何驅(qū)動(dòng)程序執(zhí)行Ring0代碼的方法。

????Windows?NT/2000將設(shè)備驅(qū)動(dòng)程序調(diào)入內(nèi)核區(qū)域(常見(jiàn)的位于地址0x80000000上),由DPL為0的GDT項(xiàng)8,即cs為8時(shí)實(shí)現(xiàn)Ring?0權(quán)限。本文通過(guò)在系統(tǒng)中構(gòu)造一個(gè)指向我們的代碼的調(diào)用門(CallGate),實(shí)現(xiàn)Ring0代碼。基于這個(gè)思路,為實(shí)現(xiàn)這個(gè)目的主要是構(gòu)造自己的CallGate。CallGate由系統(tǒng)中叫Global?Descriptor?Table(GDT)的全局表指定。GDT地址可由i386指令sgdt獲得(sgdt不是特權(quán)級(jí)指令,普通Ring 3程序均可執(zhí)行)。GDT地址在Windows?NT/2000保存于KPCR(Processor?Control?Region)結(jié)構(gòu)中(見(jiàn)《再談Windows?NT/2000環(huán)境切換》)。GDT中的CallGate是如下的格式:
????typedef?struct
????
{?
????????unsigned?
short??offset_0_15;
????????unsigned?
short??selector;

????????unsigned?
char????param_count?:?4;
????????unsigned?
char????some_bits???:?4;

????????unsigned?
char????type????????:?4;
????????unsigned?
char????app_system??:?1;
????????unsigned?
char????dpl?????????:?2;
????????unsigned?
char????present?????:?1;
????
????????unsigned?
short??offset_16_31;
?????}
?CALLGATE_DESCRIPTOR;
????GDT位于內(nèi)核區(qū)域,一般用戶態(tài)的程序是不可能對(duì)這段內(nèi)存區(qū)域有直接的訪問(wèn)權(quán)。幸運(yùn)的是Windows?NT/2000提供了一個(gè)叫PhysicalMemory的Section內(nèi)核對(duì)象位于\Device的路徑下。顧名思義,通過(guò)這個(gè)Section對(duì)象可以對(duì)物理內(nèi)存進(jìn)行操作。用objdir.exe對(duì)這個(gè)對(duì)象分析如下:
????C:\NTDDK\bin>objdir?/D?\Device

????PhysicalMemory???????????????????
????????Section
????????DACL?
-?
???????????Ace[?
0]?-?Grant?-?0xf001f?-?NT?AUTHORITY\SYSTEM
?????????????????????????????Inherit:?
?????????????????????????????Access:?
0x001F??and??(?D?RCtl?WOwn?WDacl?)

???????????Ace[?
1]?-?Grant?-?0x2000d?-?BUILTIN\Administrators
?????????????????????????????Inherit:?
?????????????????????????????Access:?
0x000D??and??(?RCtl?)
???從dump出的這個(gè)對(duì)象DACL的Ace可以看出默認(rèn)情況下只有SYSTEM用戶才有對(duì)這個(gè)對(duì)象的讀寫(xiě)權(quán)限,即對(duì)物理內(nèi)存有讀寫(xiě)能力,而Administrator只有讀權(quán)限,普通用戶根本就沒(méi)有權(quán)限。不過(guò)如果我們有Administrator權(quán)限就可以通過(guò)GetSecurityInfo、SetEntriesInAcl與SetSecurityInfo這些API來(lái)修改這個(gè)對(duì)象的ACE。這也是我提供的代碼需要Administrator的原因。實(shí)現(xiàn)的代碼如下:
???VOID?SetPhyscialMemorySectionCanBeWrited(HANDLE?hSection)
????
{?

???????PACL?pDacl
=NULL;
???????PACL?pNewDacl
=NULL;
???????PSECURITY_DESCRIPTOR?pSD
=NULL;
???????DWORD?dwRes;
???????EXPLICIT_ACCESS?ea;

???????
if(dwRes=GetSecurityInfo(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,
??????????????????NULL,NULL,
&pDacl,NULL,&pSD)!=ERROR_SUCCESS)
??????????
{?
?????????????printf(?
"GetSecurityInfo?Error?%u\n",?dwRes?);
?????????????
goto?CleanUp;
???????????}


???????ZeroMemory(
&ea,?sizeof(EXPLICIT_ACCESS));
???????ea.grfAccessPermissions?
=?SECTION_MAP_WRITE;
???????ea.grfAccessMode?
=?GRANT_ACCESS;
???????ea.grfInheritance
=?NO_INHERITANCE;
???????ea.Trustee.TrusteeForm?
=?TRUSTEE_IS_NAME;
???????ea.Trustee.TrusteeType?
=?TRUSTEE_IS_USER;
???????ea.Trustee.ptstrName?
=?"CURRENT_USER";


???????
if(dwRes=SetEntriesInAcl(1,&ea,pDacl,&pNewDacl)!=ERROR_SUCCESS)
??????????
{?
?????????????printf(?
"SetEntriesInAcl?%u\n",?dwRes?);
?????????????
goto?CleanUp;
???????????}


???????
if(dwRes=SetSecurityInfo(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL)!=ERROR_SUCCESS)
??????????
{?
?????????????printf(
"SetSecurityInfo?%u\n",dwRes);
?????????????
goto?CleanUp;
???????????}


????CleanUp:

???????
if(pSD)
??????????LocalFree(pSD);
???????
if(pNewDacl)
??????????LocalFree(pSD);
?????}


????這段代碼對(duì)給定HANDLE的對(duì)象增加了如下的ACE:?

????PhysicalMemory???????????????????
????????Section
????????DACL?
-?
???????????Ace[?
0]?-?Grant?-?0x2?-?WEBCRAZY\Administrator
?????????????????????????????Inherit:?
?????????????????????????????Access:?
0x0002????//SECTION_MAP_WRITE

???這樣我們?cè)谟蠥dministrator權(quán)限的條件下就有了對(duì)物理內(nèi)存的讀寫(xiě)能力。但若要修改GDT表實(shí)現(xiàn)Ring?0代碼。我們將面臨著另一個(gè)難題,因?yàn)閟gdt指令獲得的GDT地址是虛擬地址(線性地址),我們只有知道GDT表的物理地址后才能通過(guò)\Device\PhysicalMemory對(duì)象修改GDT表,這就牽涉到了線性地址轉(zhuǎn)化成物理地址的問(wèn)題。我們先來(lái)看一看Windows?NT/2000是如何實(shí)現(xiàn)這個(gè)的:
????kd>?u?nt!MmGetPhysicalAddress?l?30
????ntoskrnl
!MmGetPhysicalAddress:
????801374e0?
56???????????????push????esi
????801374e1?8b742408?????????mov?????esi,[esp
+0x8]
????801374e5?33d2?????????????xor?????edx,edx
????801374e7?81fe00000080?????cmp?????esi,
0x80000000
????801374ed?722c?????????????jb????ntoskrnl
!MmGetPhysicalAddress+0x2b?(8013751b)
????801374ef?81fe000000a0?????cmp?????esi,
0xa0000000
????801374f5?
7324?????????????jnb???ntoskrnl!MmGetPhysicalAddress+0x2b?(8013751b)
????801374f7?39153ce71780?????cmp?????[ntoskrnl
!MmKseg2Frame?(8017e73c)],edx
????801374fd?741c?????????????jz????ntoskrnl
!MmGetPhysicalAddress+0x2b?(8013751b)
????801374ff?8bc6?????????????mov?????eax,esi
????
80137501?c1e80c???????????shr?????eax,0xc
????
80137504?25ffff0100???????and?????eax,0x1ffff
????
80137509?6a0c?????????????push????0xc
????8013750b?
59???????????????pop?????ecx
????8013750c?e8d3a7fcff???????call????ntoskrnl
!_allshl?(80101ce4)
????
80137511?81e6ff0f0000?????and?????esi,0xfff
????
80137517?03c6?????????????add?????eax,esi
????
80137519?eb17?????????????jmp???ntoskrnl!MmGetPhysicalAddress+0x57?(80137532)
????8013751b?8bc6?????????????mov?????eax,esi
????8013751d?c1e80a???????????shr?????eax,
0xa
????
80137520?25fcff3f00???????and?????eax,0x3ffffc
????
80137525?2d00000040???????sub?????eax,0x40000000
????8013752a?8b00?????????????mov?????eax,[eax]
????8013752c?a801?????????????test????al,
0x1
????8013752e?
7506?????????????jnz???ntoskrnl!MmGetPhysicalAddress+0x44?(80137536)
????
80137530?33c0?????????????xor?????eax,eax
????
80137532?5e???????????????pop?????esi
????
80137533?c20400???????????ret?????0x4
????從這段匯編代碼可看出如果線性地址在0x80000000與0xa0000000范圍內(nèi),只是簡(jiǎn)單的進(jìn)行移位操作(位于801374ff-80137519指令間),并未查頁(yè)表。我想Microsoft這樣安排肯定是出于執(zhí)行效率的考慮。這也為我們指明了一線曙光,因?yàn)镚DT表在Windows?NT/2000中一般情況下均位于這個(gè)區(qū)域(我不知道/3GB開(kāi)關(guān)的Windows?NT/2000是不是這種情況)。

????經(jīng)過(guò)這樣的分析,我們就可以只通過(guò)用戶態(tài)程序修改GDT表了。而增加一個(gè)CallGate就不是我可以介紹的了,找本Intel手冊(cè)自己看一看了。具體實(shí)現(xiàn)代碼如下:
????typedef?struct?gdtr?{?
????????
short?Limit;
????????
short?BaseLow;
????????
short?BaseHigh;
?????}
?Gdtr_t,?*PGdtr_t;

????ULONG?MiniMmGetPhysicalAddress(ULONG?virtualaddress)
????
{?
????????
if(virtualaddress<0x80000000||virtualaddress>=0xA0000000)
???????????
return?0;
????????
return?virtualaddress&0x1FFFF000;
?????}


????BOOL?ExecRing0Proc(ULONG?Entry,ULONG?seglen)
????
{?
???????Gdtr_t?gdt;
???????__asm?sgdt?gdt;
?????
???????ULONG?mapAddr
=MiniMmGetPhysicalAddress(gdt.BaseHigh<<16U|gdt.BaseLow);
???????
if(!mapAddr)?return?0;

???????HANDLE???hSection
=NULL;
???????NTSTATUS?status;
???????OBJECT_ATTRIBUTES????????objectAttributes;
???????UNICODE_STRING?objName;
???????CALLGATE_DESCRIPTOR?
*cg;

???????status?
=?STATUS_SUCCESS;
???
???????RtlInitUnicodeString(
&objName,L"\\Device\\PhysicalMemory");

???????InitializeObjectAttributes(
&objectAttributes,
??????????????????????????????????
&objName,
??????????????????????????????????OBJ_CASE_INSENSITIVE?
|?OBJ_KERNEL_HANDLE,
??????????????????????????????????NULL,
?????????????????????????????????(PSECURITY_DESCRIPTOR)?NULL);

???????status?
=?ZwOpenSection(&hSection,SECTION_MAP_READ|SECTION_MAP_WRITE,&objectAttributes);

???????
if(status?==?STATUS_ACCESS_DENIED){?
??????????status?
=?ZwOpenSection(&hSection,READ_CONTROL|WRITE_DAC,&objectAttributes);
??????????SetPhyscialMemorySectionCanBeWrited(hSection);
??????????ZwClose(hSection);
??????????status?
=ZwOpenSection(&hSection,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&objectAttributes);
????????}


???????
if(status?!=?STATUS_SUCCESS)
?????????
{?
????????????printf(
"Error?Open?PhysicalMemory?Section?Object,Status:%08X\n",status);
????????????
return?0;
??????????}

??????
???????PVOID?BaseAddress;

???????BaseAddress
=MapViewOfFile(hSection,
?????????????????????FILE_MAP_READ
|FILE_MAP_WRITE,
?????????????????????
0,
?????????????????????mapAddr,????
//low?part
?????????????????????(gdt.Limit+1));

???????
if(!BaseAddress)
??????????
{?
?????????????printf(
"Error?MapViewOfFile:");
?????????????PrintWin32Error(GetLastError());
?????????????
return?0;
???????????}


???????BOOL?setcg
=FALSE;

???????
for(cg=(CALLGATE_DESCRIPTOR?*)((ULONG)BaseAddress+(gdt.Limit&0xFFF8));(ULONG)cg>(ULONG)BaseAddress;cg--)
???????????
if(cg->type?==?0){?
?????????????cg
->offset_0_15?=?LOWORD(Entry);
?????????????cg
->selector?=?8;
?????????????cg
->param_count?=?0;
?????????????cg
->some_bits?=?0;
?????????????cg
->type?=?0xC;??????????//?386?call?gate
?????????????cg->app_system?=?0;??????//?A?system?descriptor
?????????????cg->dpl?=?3;?????????????//?Ring?3?code?can?call
?????????????cg->present?=?1;
?????????????cg
->offset_16_31?=?HIWORD(Entry);
?????????????setcg
=TRUE;
?????????????
break;
???????????}


???????
if(!setcg){?
????????????ZwClose(hSection);
????????????
return?0;
????????}


???????
short?farcall[3];

???????farcall[
2]=((short)((ULONG)cg-(ULONG)BaseAddress))|3;??//Ring?3?callgate;

???????
if(!VirtualLock((PVOID)Entry,seglen))
??????????
{?
?????????????printf(
"Error?VirtualLock:");
?????????????PrintWin32Error(GetLastError());
?????????????
return?0;
???????????}


???????SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);

???????Sleep(
0);

???????_asm?call?fword?ptr?[farcall]

???????SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);

???????VirtualUnlock((PVOID)Entry,seglen);

???????
//Clear?callgate
???????*(ULONG?*)cg=0;
???????
*((ULONG?*)cg+1)=0;

???????ZwClose(hSection);
???????
return?TRUE;

?????}


????我在提供的代碼中演示了對(duì)Control?Register與I/O端口的操作。CIH病毒在Windows?9X中就是因?yàn)楂@得Ring?0權(quán)限才有了一定的危害,但Windows?NT/2000畢竟不是Windows?9X,她已經(jīng)有了比較多的安全審核機(jī)制,本文提供的代碼也要求具有Administrator權(quán)限,但如果系統(tǒng)存在某種漏洞,如緩沖區(qū)溢出等等,還是有可能獲得這種權(quán)限的,所以我不對(duì)本文提供的方法負(fù)有任何的責(zé)任,所有討論只是一個(gè)技術(shù)熱愛(ài)者在討論技術(shù)而已。謝謝!?

????參考資料:
??????1.Intel Corp<<Intel Architecture Software Developer's Manual,Volume 3>>?

posted on 2006-04-14 18:54 楊粼波 閱讀(647) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合导航| 欧美在线视频a| 国产欧美精品va在线观看| 欧美日韩在线三区| 欧美三级视频在线| 国产精品视频自拍| 国产日韩精品一区二区浪潮av| 国产精品激情电影| 国产午夜精品视频| 曰韩精品一区二区| 在线视频日本亚洲性| 亚洲一区二区三区精品在线观看 | 午夜激情综合网| 香蕉久久夜色| 久久综合伊人77777| 欧美日本一区二区三区| 国产精品网站视频| 91久久在线| 欧美亚洲一区二区在线| 欧美mv日韩mv国产网站app| 亚洲精品一区二区三区婷婷月 | 免费亚洲电影| 国产精品一区二区久久| 依依成人综合视频| 亚洲无限乱码一二三四麻| 久久精品首页| 99视频精品免费观看| 欧美在线免费看| 欧美日韩免费观看中文| 狠狠色2019综合网| 亚洲一区二区在线视频| 噜噜噜噜噜久久久久久91| 日韩一级免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品自拍一区| 一区二区三区国产精品| 欧美aaa级| 欧美在线不卡| 国产精品视频一区二区三区| 日韩视频永久免费| 欧美成人精品激情在线观看| 亚洲永久视频| 国产精品美女黄网| 亚洲一区二区在线看| 亚洲精品少妇| 欧美理论电影网| 亚洲精品视频免费观看| 你懂的一区二区| 欧美在线视频一区| 国产一区二区黄色| 久久久噜久噜久久综合| 午夜精品久久| 国产日韩欧美精品一区| 亚洲欧美日韩精品一区二区| 日韩视频精品在线观看| 欧美精品v日韩精品v国产精品| 最新国产成人av网站网址麻豆| 欧美暴力喷水在线| 免费观看一级特黄欧美大片| 亚洲国产小视频在线观看| 另类综合日韩欧美亚洲| 玖玖精品视频| 亚洲精品影院在线观看| 亚洲国产高潮在线观看| 蜜乳av另类精品一区二区| 亚洲一区二区动漫| 亚洲欧美激情一区| 国产精品久久久久久久久借妻 | 毛片一区二区三区| 91久久精品美女| 亚洲精品亚洲人成人网| 欧美日韩亚洲一区二区三区在线 | 亚洲自拍都市欧美小说| 国产精品一区二区女厕厕| 午夜精品一区二区三区在线视 | 中文欧美字幕免费| 国产精品亚洲不卡a| 久热综合在线亚洲精品| 欧美成人黑人xx视频免费观看| 9久re热视频在线精品| 亚洲视频每日更新| 精品91视频| 亚洲人被黑人高潮完整版| 欧美日韩综合久久| 久久成人羞羞网站| 欧美v亚洲v综合ⅴ国产v| 亚洲一区二区三| 欧美伊人久久| 日韩视频免费在线观看| 亚洲欧美中文另类| 亚洲精品国精品久久99热一| 亚洲一区二区成人在线观看| 在线看片日韩| 亚洲一区成人| 亚洲精品欧洲精品| 欧美一区二区三区视频免费播放| 亚洲肉体裸体xxxx137| 亚洲欧美精品伊人久久| 亚洲欧洲日本国产| 欧美影视一区| 亚洲男人的天堂在线| 欧美69wwwcom| 久久久综合网站| 欧美精品在线看| 美女国内精品自产拍在线播放| 欧美日韩午夜| 亚洲电影免费| 黄色精品网站| 亚洲欧美另类在线| 亚洲视频在线一区| 欧美精品激情在线| 奶水喷射视频一区| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧洲日夜超级视频| 狠狠色狠狠色综合人人| 午夜精品久久久久久久男人的天堂| 日韩视频中文| 国产精品大全| 久久亚洲免费| 欧美怡红院视频| 欧美日韩综合视频网址| 亚洲国产女人aaa毛片在线| 韩国av一区二区三区| 午夜精品久久久久久久久| 亚洲在线中文字幕| 欧美涩涩网站| 日韩视频免费在线观看| 亚洲精品中文字幕在线| 免费观看日韩av| 亚洲成人在线视频网站| 伊人色综合久久天天五月婷| 久久久精品国产99久久精品芒果| 性欧美超级视频| 国产人久久人人人人爽| 午夜国产精品视频| 欧美在线91| 国产性天天综合网| 午夜精品一区二区在线观看| 欧美一区亚洲| 国产原创一区二区| 久久人人97超碰人人澡爱香蕉| 免费视频最近日韩| 亚洲国产综合在线看不卡| 欧美激情导航| 亚洲一区二区三区在线视频 | 欧美激情在线有限公司| 亚洲高清精品中出| 欧美国产先锋| 99国产精品久久久久久久| 亚洲一区制服诱惑| 国产亚洲精品一区二555| 久久久久久**毛片大全| 亚洲激情在线观看| 亚洲欧美日韩精品久久奇米色影视| 欧美性猛交视频| 欧美一级欧美一级在线播放| 美女脱光内衣内裤视频久久网站| 亚洲经典三级| 欧美视频精品在线| 欧美亚洲一区| 亚洲韩国青草视频| 午夜日韩电影| 亚洲国产精品va在看黑人| 欧美日韩国产在线观看| 亚洲一区二区在线视频| 美女国内精品自产拍在线播放| aa亚洲婷婷| 国产视频在线观看一区二区三区 | 国产精品女人网站| 久久久成人网| 在线视频亚洲一区| 欧美1级日本1级| 午夜亚洲精品| 亚洲乱码精品一二三四区日韩在线| 国产精品mm| 老司机一区二区| 亚洲一卡二卡三卡四卡五卡| 欧美国产亚洲精品久久久8v| 欧美一区二区三区免费视| 亚洲美女av网站| 精品成人在线| 国产精品久久久久久久久免费桃花 | 久久久久久久一区二区| 久久动漫亚洲| 99精品欧美一区| 免费短视频成人日韩| 亚洲免费网站| 亚洲理论在线| 亚洲国产导航| 国产在线成人| 国产精品爽黄69| 欧美午夜久久| 欧美三级免费| 欧美激情bt| 欧美波霸影院| 美国成人直播| 久久先锋影音av| 久久av最新网址| 性娇小13――14欧美| 亚洲制服欧美中文字幕中文字幕|