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

            awd BIOS rk ,'universal' tst

            創(chuàng)建時(shí)間:2007-05-28
            文章屬性:原創(chuàng)
            文章提交:icelord (icelord_at_sohu.com)

            Award BIOS Rootkit,universal test

            [author  ]:icelord
            [date    ]:2007/05/25
            [contact ]:icelord@sohu.com

            [申明]

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

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

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


            [.code]

            下面的文字僅為個(gè)人想法,目的拋磚引玉
            由于時(shí)間和環(huán)境問(wèn)題,暫時(shí)沒(méi)有機(jī)會(huì)來(lái)驗(yàn)證,所以沒(méi)有demo,可以
            在iclord基礎(chǔ)上作簡(jiǎn)單修改進(jìn)行驗(yàn)證測(cè)試
            歡迎有興趣的朋友測(cè)試驗(yàn)證
            也可能下面的想法估計(jì)是完全錯(cuò)誤的,如果您認(rèn)為不可行,歡迎指正

            '通用'所要面臨的問(wèn)題:
            (1)   BIOS效驗(yàn)和的問(wèn)題
            (2)   Rootkit啟動(dòng)的時(shí)機(jī)
            (3)   程序健壯性問(wèn)題
            (4)   BIOS刷新的問(wèn)題


            下面的方法是個(gè)很啰嗦的方法,如果您有更好的方法,歡迎指點(diǎn)
            brk:  boot rk,bios rk...

            [設(shè)計(jì)目標(biāo)]
                要求brk能夠在多種類型的BIOS內(nèi)植入并啟動(dòng)
                
                問(wèn)題:
                1.不同類型的bios的'效驗(yàn)和'位置不同,導(dǎo)致添加自己的brk后,不能正
                常啟動(dòng).
                2.需要在bios啟動(dòng)過(guò)程中啟動(dòng)自己的brk,不同類型的bios是個(gè)難題
                
                3.怎樣重新取得cpu?
                
                4.anti brk chk?這暫時(shí)談不到.
                
            [簡(jiǎn)單結(jié)構(gòu)]

            +--------------------+---[low ROM,Mem 4GB-ROMSize]
            |     bios mod       |
            +--------------------+
            |                    |
            +--------------------+
            |     free space     |
            +--------------------+
            |  brk rom section2  +-->ESCD better,brk real body
            +--------------------+
            |    free space      |
            +--------------------+
            |                    |
            +--------------------+---[Last Section,Mem 4GB-64KB]
            |                    |
            +--------------------+
            |  brk rom section1  +-->Brk init & restore orig_jmp
            +--------------------+
            |     boot rom       |
            +--------------------+
            |  hook far jmp here +-->jmp brk rom section1
            +--------------------+---[high ROM,Mem 4GB]


            一.BIOS效驗(yàn)的問(wèn)題
                不知道其它類型BIOS的自我效驗(yàn)如何,像Award BIOS的自我效驗(yàn)都
                是使用簡(jiǎn)單的'效驗(yàn)和'方式,就是將要效驗(yàn)的數(shù)據(jù)塊按uchar來(lái)相加,與原始效
                驗(yàn)和值比較。
                如果你修改了這些數(shù)據(jù)塊中的某些數(shù)據(jù),將會(huì)導(dǎo)致效驗(yàn)和失敗,BIOS啟動(dòng)時(shí)
                就會(huì)出現(xiàn)BIOS Checksum Error。
                
                那么怎樣來(lái)保證修改后的BIOS效驗(yàn)和能正常運(yùn)行?
                一直以來(lái)都是修改數(shù)據(jù)塊后重新計(jì)算效驗(yàn)和并寫(xiě)入到原始效驗(yàn)和的位置。
                某天,突然發(fā)現(xiàn)這個(gè)問(wèn)題實(shí)在太xx,只要修改后的數(shù)據(jù)塊的效驗(yàn)和與未修改時(shí)
                的效驗(yàn)和相等即可嘛...ft,大腦僵化的結(jié)果。
                
                但問(wèn)題又來(lái)了,如果BIOS所采用的效驗(yàn)方式不是效驗(yàn)和呢?的確(‘universal’
                這一說(shuō)法要打折扣),如果要采用別的加密的方法就更麻煩...
                
                先拿award bios來(lái)作例子...(假設(shè)其它BIOS的驗(yàn)證都使用效驗(yàn)和方式...?????)
                //contact icelord@sohu.com 如果有不同意見(jiàn)
                
                具體做法就是在BIOS ROM中查找足夠大(與brk的body大小相同)的空閑位置(
                全0xFF或0x0),計(jì)算這些空間的效驗(yàn)和,修正brk的效驗(yàn)和,與之相等,替換即可。
                
                這包括brk ROM Section1和brk ROM Section2兩部分
                其中brk ROM Section1在BIOS ROM最后64KB內(nèi)查找
                其中brk ROM Section2在BIOS ROM中間空閑位置查找
                
                
                上圖已經(jīng)說(shuō)明了brk的構(gòu)造
                (1).hook_far_jmp
                    在安裝時(shí)確定并修正此值
                    
                (2).brk ROM Section1
                    此部分作用為進(jìn)入保護(hù)模式,初始化brk的實(shí)體brk ROM Section2(安裝時(shí)構(gòu)造)
                    
                (3).brk ROM Section2
                    此部分為BIOS Rk的實(shí)體,可以放到brk ROM Section1中,按payload大小而定
                (安裝時(shí)構(gòu)造)
                    
                    
                解釋一下:
                    我不知道開(kāi)機(jī)時(shí)有多少ROM映射到1MB以內(nèi),但是可以確定的是BIOS ROM最后64KB
                會(huì)映射到0xF000段。
                    0xF000內(nèi)一般沒(méi)有足夠大的空間,所以將brk ROM Section2放置在BIOS ROM的靠前的
                空閑位置非,這樣就導(dǎo)致在0xF000段內(nèi)無(wú)法訪問(wèn)到brk ROM Section2 (in ROM)(in real mode).
                所以brk ROM Section1的作用是拷貝brk ROM Section2到1MB以下(其實(shí)是白拷,BIOS在初
                始化過(guò)程中會(huì)overwrite1MB一下的內(nèi)存為0,至少Award是這樣做的???,所以任務(wù)放
                到了mbr上),所以enter PM,訪問(wèn)brk ROM Section2.(按理BIOS ROM可直接EIP執(zhí)行...,
                因?yàn)閒irst jmp就是ROM指令...)
                ---------------------------------
                還有一個(gè)方法就是將brk放置到ESCD(extend system configuration data)或者DMI區(qū)域中,
                在第一條指令直接跳轉(zhuǎn)ESCD或者DMI區(qū)域。
                原因:(拿award來(lái)說(shuō))
                    實(shí)際發(fā)現(xiàn)ESCD區(qū)域中有很大的區(qū)域未使用(但是發(fā)現(xiàn)Toshiba R100幾乎沒(méi)有空閑,jp!),
                而且ESCD區(qū)域一般應(yīng)該不會(huì)進(jìn)行效驗(yàn)和檢測(cè)(award BIOS 沒(méi)有),因?yàn)楫?dāng)硬件改變時(shí),BIOS會(huì)
                更新此區(qū)域內(nèi)容,即開(kāi)機(jī)自檢過(guò)程中的 "Updating ESCD..."
                (具體可以看看ESCD specification).而且ESCD區(qū)域一般是4KB/8KB或者64KB (unit)????
                (不確定...)
                
                問(wèn)題:
                    ESCD區(qū)域是否可以在RM下訪問(wèn)到(without enter PM,嘗試一條指令的hook,在BIOS之前)
                    實(shí)際發(fā)現(xiàn)ESCD在256KB ROM中位于最后64KB,在512KB ROM中位于BIOS ROM起始位置,
                這跟BIOS ROM(類型)的sector大小有關(guān),還跟BIOS的layout有關(guān)(例如Award 的16K-8K-8K Unit),
                即使這樣做,仍然需要一個(gè)wrapper來(lái)使得在RM下可以訪問(wèn)到ESCD(胡亂猜測(cè))
                    
                
                /*這里有問(wèn)題!!!!!*/


            二.BIOS Rootkit啟動(dòng)的時(shí)機(jī)
                BIOS rk需要在pc啟動(dòng)的過(guò)程中獲取執(zhí)行的機(jī)會(huì),BIOS之前,過(guò)程中,之后,只要
                能獲取執(zhí)行即可。
                
                而啟動(dòng)brk的方式還是老套的那幾種hook,file...(virtualize?)
                
                就選擇最簡(jiǎn)單的hook吧,那么,選擇什么位置/代碼來(lái)hook才可以達(dá)到universal?
                最簡(jiǎn)單的答案就是BIOS入口處.
                x86 CPU在啟動(dòng)時(shí),CS的不可見(jiàn)部分(Base Addr)為0xFFFF0000,EIP為0xFFF0,第一條
                指令為 BIOS ROM最后16字節(jié)內(nèi),這個(gè)位置是比較universal的hook位置.
                一般來(lái)說(shuō),這條指令都是一個(gè)長(zhǎng)跳轉(zhuǎn)指令(也有非長(zhǎng)跳轉(zhuǎn)的,例如dell的某個(gè)BIOS),如果想
                不被明顯的看出來(lái),可以修改跳轉(zhuǎn)目的地址的指令,一般都在BIOS最后64KB,這個(gè)位
                置是直接映射到0xF000段的,長(zhǎng)跳轉(zhuǎn)到此。
                
                現(xiàn)在,brk可以啟動(dòng)了,而且是在BIOS之前,此時(shí),沒(méi)有任何可以使用的BIOS服務(wù).
                
                現(xiàn)在就要發(fā)揮你的想象能力了。你需要作一些事情,然后將CPU交給原始BIOS,使其進(jìn)行
                必要的初始化(硬件,BIOS服務(wù)等).此過(guò)程中BIOS 需要改變CPU模式,I/O等.
                
                當(dāng)前狀態(tài)是16bit RealMode,沒(méi)有多任務(wù),沒(méi)有BIOS服務(wù),現(xiàn)在要解決的問(wèn)題就是如何
                在放棄CPU后如何重新獲取CPU。
                
                hehe,想了好久,如果還是hook BIOS中間代碼,感覺(jué)很復(fù)雜,需要很多硬編碼數(shù)據(jù),
                還是使用老套的方式比較好,寫(xiě)文件。
                關(guān)于IDE的I/O操作很簡(jiǎn)單,一般是對(duì)I/O端口0x1F0~0x1F7進(jìn)行讀寫(xiě)操作,使用Loop I/O就
                更簡(jiǎn)單了。
                
                做法就是在MBR中寫(xiě)入幾個(gè)字節(jié)的jmp指令即可.這樣在選擇硬盤(pán)啟動(dòng)后可直接獲取cpu.
                //如果您有好的方法,歡迎指點(diǎn)。
                
                但是,這樣的做法將導(dǎo)致程序的健壯性打折扣。修改MBR時(shí)如果斷電則是個(gè)麻煩...
                怎么辦?
                
            三.程序健壯性
                其實(shí)也談不上健壯。
                要處理的問(wèn)題就是MBR寫(xiě)入的問(wèn)題和安裝操作系統(tǒng)的問(wèn)題
                
                (1).MBR寫(xiě)入的問(wèn)題
                IDE好說(shuō),直接使用cli;Loop I/O的方式讀寫(xiě)扇區(qū)即可
                SCSI/CDROM/Eth Boot,唉,不知道怎么辦了
                
                (2).安裝操作系統(tǒng)的問(wèn)題
                假設(shè)安裝winxp,確保在拷貝文件時(shí),BIOS hook已經(jīng)被卸載
                //reason:hook read service...,不知道在安裝開(kāi)始拷貝文件是否使用BIOS svc
                
                還有MBR不能被保存在BIOS中,以防止安裝操作系統(tǒng)后出現(xiàn)新的MBR的問(wèn)題
                
                所以還得在MBR中找到一個(gè)通用的hook code??
                
                也可在安裝時(shí)將MBR備份到MBR和第一個(gè)分區(qū)之間的空閑區(qū)域內(nèi)(至少62個(gè)扇區(qū)吧,
                估計(jì)。安裝nt后還有很多空閑,不知道安裝Grub會(huì)怎樣...反正能找到空閑位置),
                在brk啟動(dòng)時(shí)將MBR與備份MBR比較(同時(shí)檢查是否為hook過(guò)的 MBR,防止重復(fù)hook),
                如不同則備份。若相同,則讀取mbr,修改MBR,然后寫(xiě)入MBR.
                
                若發(fā)現(xiàn)MBR不完整(0xaa55),則使用備份MBR來(lái)覆蓋MBR,
                這樣來(lái)防止寫(xiě)入MBR斷電破壞MBR
                
                (注:'備份MBR'在安裝時(shí)寫(xiě)入,在MBR有效,且MBR與'備份MBR'不一致,則更
                新'備份MBR',根據(jù)實(shí)際情況來(lái)定了...)
                
                在從硬盤(pán)啟動(dòng)時(shí),恢復(fù)MBR為原始狀態(tài)。

                /*總之,就是使用備份技術(shù),來(lái)降低斷電破壞MBR的幾率*/
                待解決...
                
            四.BIOS刷新的問(wèn)題

                這是個(gè)老問(wèn)題了。可使用的方法有
                uniflash  (open src)
                award smi flash
                (ami smi flash).
                感興趣的可以看看
                
            五. 安裝程序的任務(wù)

                
                (1).在OS下Dump BIOS
                
                (2).在BIOS最后64KB查找空閑空間,構(gòu)造計(jì)算并防止jmp_hook和brk rom section1(盡量小)
                
                (3).在BIOS ROM中查找足夠大的空閑空間,構(gòu)造計(jì)算并放置brk rom section2
                
                (4).(釋放驅(qū)動(dòng))刷新BIOS    (最麻煩的問(wèn)題!!!待高手解決)
                
            六. IcLord2.test流程    
                
                (1).PC上電,CS.SegBase=0xFFFF0000 EIP=0xFFF0
                
                (2).在0xFFFF FFF0執(zhí)行被hook的(jmp)指令(in ROM),跳轉(zhuǎn)到brk rom section1(in ROM)
                
                (3).brk rom section1進(jìn)入PM(保持一致性),訪問(wèn)brk rom section2(in ROM),(拷貝到RAM,
                并執(zhí)行)
                
                (4).brk rom section2(in RAM)使用I/O來(lái)讀取MBR和磁盤(pán)臨時(shí)數(shù)據(jù)('備份MBR',sub_routine
                sector,hlper_routine sector...等)進(jìn)行有效性檢查(自定義了)
                
                (5).修改MBR,寫(xiě)回disk;
                    寫(xiě)入磁盤(pán)臨時(shí)數(shù)據(jù)(如果'備份MBR'無(wú)效,如果hlper_routine Sector無(wú)效)
                
                (6).恢復(fù)狀態(tài),跳轉(zhuǎn)原始 BIOS
                
                (7).BIOS初始化(上面說(shuō)的問(wèn)題在這里,BIOS檢測(cè)內(nèi)存會(huì)用到內(nèi)存讀寫(xiě),如果將brk放置
                到內(nèi)存中的話,可能在這個(gè)階段就被破壞了,所以,hehe,需要上面所說(shuō)的hlper_routine
                sector...)
                
                (8).如果Boot From IDE,則MBR被加載到0x7C00位置執(zhí)行,此時(shí)執(zhí)行的是我們自己的MBR,
                其任務(wù)就是加載存放于MBR和第一個(gè)分區(qū)之間的hlper_routine sector并執(zhí)行;
                hlper_routine為ROM Section2保留內(nèi)存,進(jìn)入PM,拷貝ROM Section2到保留內(nèi)存區(qū)域,Hook
                BIOS服務(wù),或者調(diào)用保留內(nèi)存區(qū)域的ROM Section2來(lái)I/O操作系統(tǒng)相關(guān)的文件(例如,你
                可以使用自己的buildin driver寫(xiě)磁盤(pán)文件,如果你想這樣做)
                    最后,加載‘備份 MBR’到0x7C00,并執(zhí)行
                    
                (9).MBR加載PBR(OBR),OBR加載osloader...,此時(shí)我們的hooker得到執(zhí)行機(jī)會(huì)...,然后進(jìn)行
                kernel subvertion...
                    //
                    //Win NT相關(guān):
                    //這里在說(shuō)一下iclord brk的簡(jiǎn)單flowchart:
                    //hook int 13h-->hook ntldr!BlSetupForNT!'xxxxx',使用堆棧ebp獲取BlLoaderBlock,
                    //修改內(nèi)存鏈表屬性,同時(shí)hook ndis.sys...-->ndis.sys hooker執(zhí)行,
                    //初始化ndis,然后初始化自己(展開(kāi)rootkit .sys文件進(jìn)行驅(qū)動(dòng)程序(boot driver)初始化),
                    //返回控制到IopInitializeBuiltinDriver()?
                    //over
                    //
                    
                (10).Rootkit's "show time" here...
                
            [Anti & 問(wèn)題]
                沒(méi)細(xì)想過(guò)。我備份了一下BIOS而已
                
                由于修改BootROM seg,而且借助(RW)了IDE之類的非固件存儲(chǔ)設(shè)備,導(dǎo)致所謂的'universal'在
                健壯性和安全性上較差,操作系統(tǒng)重裝沒(méi)有解決(可能會(huì)出問(wèn)題)...

                由于要修改BootBlock,有的FlashROM對(duì)BootBlock作了特殊的限制...
                
                用光盤(pán)啟動(dòng),檢查;
                啟動(dòng)到dos下檢查;
                
                
                /**
                以上想法有很多疑惑地方,猜測(cè)而已。
                至于挨罵,那時(shí)肯定的,hehe
                    
                期待高手斧正...
                */
                
            =============

                icelord@2007/05/25
                
                
            ----------
            revision @ 07/05/28
                PC啟動(dòng)時(shí)有幾個(gè)寄存器保留著一些信息

                如果PC從睡眠模式恢復(fù)...

            ----------

            posted on 2007-06-01 01:02 葉子 閱讀(506) 評(píng)論(0)  編輯 收藏 引用 所屬分類: rootkit

            老男人久久青草av高清| 国产99久久九九精品无码| 日批日出水久久亚洲精品tv| 久久久久久午夜精品| 久久久久久久波多野结衣高潮 | 久久精品国产亚洲av麻豆色欲| 久久亚洲精品无码AV红樱桃| 国产 亚洲 欧美 另类 久久| 色综合久久综合中文综合网| 一本久久久久久久| 国内精品久久久久久不卡影院| 色综合久久天天综线观看| 91久久精品91久久性色| 伊人精品久久久久7777| 久久成人国产精品二三区| 人妻无码αv中文字幕久久琪琪布| 国产精品久久网| 久久精品国产亚洲av麻豆色欲 | 99久久精品免费看国产一区二区三区| .精品久久久麻豆国产精品| 久久乐国产综合亚洲精品| 久久精品国产亚洲精品| 久久精品国产亚洲av麻豆小说 | 久久精品国产亚洲AV久| 久久久久国色AV免费观看| 色综合合久久天天综合绕视看| 久久国产V一级毛多内射| 久久精品国产99久久无毒不卡| 香蕉久久夜色精品国产尤物| 国产精品亚洲美女久久久| 99久久精品免费看国产一区二区三区 | 国产一级持黄大片99久久| 婷婷五月深深久久精品| 久久久久99这里有精品10| 久久久噜噜噜久久| 人妻丰满?V无码久久不卡| 久久精品无码免费不卡| 久久久久九九精品影院| 久久一区二区三区99| 国产69精品久久久久APP下载| 久久精品免费一区二区|