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

小默

RING0和RING3穿透還原軟件zz

寫了兩天的程序,總算把RING3下的搞定了。這個太強悍了,可以穿透所有的主動防御和還原軟件和影子系統~~危害太大,代碼我就不發了~~關于RING0驅動過還原的可以看機器狗的代碼~

  隨著機器狗病毒和MJ的Tophet.a的放出,無論是RING0還是RING3下穿透還原軟件的技術突然浮現在了大眾的眼前。讓你的毒毒和小馬能穿透還原軟件/卡,的確很吸引人~~
  最近學習SCSI總線命令,結合以前的知識做了一下穿透還原軟件,學習是個曲線前進過程,有可能文中有些觀點不對,主要來自《SCSI程序員指南》和《scsi總線及IDE接口(協議、應用和編程)》~~

IRP是從文件系統->卷驅動 -> 磁盤驅動-> 類驅動-> 端口驅動-> 微端口驅動
ntfs/fat32.sys->partmgr.sys->ftdisk.sys->disk.sys->classpnp.sys->acpi.sys->atapi.sys
  其中不少是value-added和filter驅動,主要的是文件系統驅動ntfs/fat32.sys,storage驅動disk.sys和總線驅動atapi.sys,我們知道,文件系統驅動做的工作就是把下層讀扇區得到的RAW數據轉換成文件,向上提供,磁盤驅動這層就是把上層請求的讀扇區的IRP換成帶SCSI命令的IRP
發給下層的miniport ATAPI.sys,ATAPI.sys調用hal中的write_port_char最后來直接端口I/O了。還原程序是在哪一層呢?是在disk.sys之上插了一個filter,如果直接繞過上層的驅動直接發帶SRB的IRP給Disk.sys或是ATAPI.sys,那么就實現了穿透。另外,當然還有別的方法,譬如端口I/O,但是通用性不好,與硬盤具體的接口有關(IDE,SCSI等)
kd>bu atapi!IdePortStartIo


上圖可看到,在disk這層的irp處理交給了classpnp了,在disk這層之上有個DeepFrz的驅動,這是我測試用的冰點還原的驅動,可以的確冰點還原的驅動是位于disk之上的,從理論上說我們發SRB給disk是可以繞過還原的。到了atapi這層就是走atapi!IdePortStartIo->nt!IoStartPacket->IdePortStartIo,之后就分有無DMA能力區別對待了。
  首先SCSI總線上設備數據傳輸的過程:
申請—仲裁(建立連接)—消息—命令—數據(如果命令產生數據傳輸)—消息(通知結束,發送狀態碼)
SCSI有以下幾個階段:
1總線空閑階段
2總裁階段
3選擇階段
4重新選擇階段
5消息輸出階段
6命令階段(接受CDB)
CDB分為0,1,2,5號組命令,命令組號告訴目標器在CDB中有多少字節,然后會產生以下三種階段情況(本段參考《SCSI程序員指南》,比較老了,根據SCSI SPC-3上有16字節的等)
0號組CDB是6字節長
1,2號組CDB是10字節長
5號組CDB是12字節長
CDB的第一個字節是描述該命令的操作碼,高三位表示命令所屬的命令組0-7,低五位表示命令碼
CDB的第二個字節高三位表示一個LUN(邏輯單元號)
  其中LUN是什么呢?LUN的全稱是Logical Unit Number,也就是邏輯單元號。我們知道SCSI總線上可掛接的設備數量是有限的,一般為6個或者15個,我們可以用Target ID(也有稱為SCSI ID的)來描述這些設備,而實際上我們需要用來描述的對象,是遠遠超過該數字的,于是我們引進了LUN的概念,也就是說LUN ID的作用就是擴充了Target ID。每個Target下都可以有多個LUN Device,我們通常簡稱LUN Device為LUN,這樣就可以說每個設備的描述就有原來的Target x變成Target x LUN y了,那么顯而易見的,我們描述設備的能力增強了。
  從第三字節開始是命令參數字段,對直接存取設備來說是邏輯塊地址,對傳輸數據的命令是傳輸長度
  最后一個字段是Control字段,如Link標志指出該CDB是否是一系列連接命令的一部分,Flag標志決定一條連接的命令成功執行后目標器返回的狀態碼(6-7廠商自定,2-5保留,1標志位,0連接位)
  強制命令(適用于所有設備的命令,采用大端點數)
00H Test unitReady
  簡單的報告設備是否已經為執行命令做好準備,6字節組(高三位為0)
03H Request Sense(讀取)
12H Inquiry
  查詢設備的制造商,模型信息等
1DH Send Diagnostic

 設備類型特定命令
mode sense(獲取目標機操作參數信息)和mode select(改變參數)有6字節和10字節
Read和Write命令有6字節和10字節版本,分屬與0號組和2號組
數據階段
狀態階段
消息輸入階段
  SCSI miniport驅動器實現了對SCSI接口適配器的直接控制。miniport驅動器對SCSI適配器進行初始化,并向硬件傳輸I/O請求,處理中斷的產生,執行適配器水平的錯誤修復和記錄。miniport驅動器是一種小型的仿制的SCSI I/O模型,它隱藏了SCSI適配器硬件水平上的細節內容。它提供了帶有連續,低層次的借口的高水平的SCSI模型,而根本不用考慮實際的硬件接口。只要實現了規定的SCSI miniport 接口,SCSI miniport驅動器就不必對傳統的SCSI適配器進行控制,這就允許外設制造商在他們的硬件上使用不同的總線接口。ATAPI設備擁有一套幾乎與SCSI完全一致的命令,但是它們進行的數據傳輸卻是基于IDE總線的。windows中的ATAPI的
miniport驅動接受了低層次的SCSI命令,并把它們通過IDE總線發送出去
  SCSIPORT驅動器對于系統中的所有SCSI請求提供了唯一的入口點,對系統中各種各樣的miniport驅動器進行初始化,把系統特有的SCSI I/O請求轉化成標準的SRB,并把這些請求發送給適當的miniport驅動器。由于硬件細節被隱藏在了miniport驅動器中,所以高層次的驅動器可以調用SCSIPORT驅動器來執行所有的SCSI I/O操作,而不必在乎所使用的硬件接口,在windows NT中,有很多種標準的SCSI類驅動器,包括用來處理磁盤驅動器(disk.sys)和CD-ROM驅動器的類驅動器。文件系統的驅動器可以調用磁盤類驅動器來執行高層次,面向塊的I/O請求。磁盤類驅動會把文件系統的請求轉化成一系列的SCSI I/O請求,然后它們會被傳送到SCSIPORT驅動。
  sense data(檢測數據) :當一個SCSI設備(通常是一個LUN)發現它自己處于異常狀態時,它就拒絕執行下面的命令,并返回一個check condition狀態。產生至少18個
字節長的數據,包括經過編碼的關于錯誤的信息,稱為檢測數據。
IOCTL_SCSI_PASS_THROUGH
IOCTL_SCSI_PASS_THROUGH_DIRECT
  NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來對簇進行定位。LCN是對整個卷中所有的簇從頭到尾所進行的簡單編號。用卷因子乘以LCN,NTFS就能夠得到卷上的物理字節偏移量,從而得到物理磁盤地址。VCN則是對屬于特定文件的簇從頭到尾進行編號,以便于引用文件中的數據。VCN可以映射成LCN,而不必要求在物理上連續。
  總之,不用擔心下層的具體硬件接口是什么,是IDE還是SCSI,都可以用SCSI命令發給ATAPI,實現文件的讀寫。其實正常的文件讀寫也是這樣
的流程,只不過我們自己繞過上層,自己構造SRB而已~


首先看驅動發SRB
參見
http://www.osronline.com/DDKx/storage/k306_0hte.htm
typedef struct _SCSI_REQUEST_BLOCK {
    USHORT Length;                  // 該SRB的長度
    UCHAR Function;                 // 功能碼,如果想發SCSI命令,設置為SRB_FUNCTION_EXECUTE_SCSI
    UCHAR SrbStatus;                // SRB發送后返回的狀態,一般SRB發送后不會立即執行,會放入一個隊列中,所以通常返回

SRB_STATUS_PENDING
    UCHAR ScsiStatus;               // 是否成功發送,與上面一樣均為返回值
    UCHAR PathId;                   // 指明是總線ID,(PathId,TargetId,Lun)來確定一個設備
    UCHAR TargetId;                 //
    UCHAR Lun;                      //
    UCHAR QueueTag;                 // 隊列TAG
    UCHAR QueueAction;              // 與上述結構有關
    UCHAR CdbLength;                // SCSI命令塊長度
    UCHAR SenseInfoBufferLength;    // 存儲返回經過編碼的關于錯誤的信息的緩沖區的長度
    ULONG SrbFlags;                 // Srb的相關參數,SRB_FLAGS_DATA_IN為讀出,SRB_FLAGS_DATA_OUT為寫入設備
    ULONG DataTransferLength;       // 指出傳輸數據的大小
    ULONG TimeOutValue;             // 設定超時
    PVOID DataBuffer;               // 數據緩沖區
    PVOID SenseInfoBuffer;          // 檢測緩沖區
    struct _SCSI_REQUEST_BLOCK *NextSrb; // 下一個SRB,一般的命令只要一個SRB
    PVOID OriginalRequest;          // 指向原始IRP
    PVOID SrbExtension;             //
    union {
        ULONG InternalStatus;       //
        ULONG QueueSortKey;         //
    };
    UCHAR Cdb[16];                  // SCSI總線命令了,這里不一定是16字節,正如上面所說,具體幾個字節,得看第一個字節。
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
  SRB是與操作系統相關的,即是操作系統定義的結構,不在SCSI規范里的,相當于對CDB的一層包裹。而真正執行命令的是CDB


取自SCSI Primary Commands - 3
  因為一般硬盤不會太大,10字節的DiskPos是32位的,可以操作4g*512字節的空間,一般已經足夠了,如果要大點的話,可以用12字節,16字節的CDB(可去參考SCSI Primary Commands - 3)具體結合機器狗的AtapiReadWriteDisk函數進行學習~
ULONG AtapiReadWriteDisk(PDEVICE_OBJECT dev_object,ULONG MajorFunction, PVOID buffer,ULONG DiskPos, int BlockCount)
{
//dev_object為通過ObReferenceObjectByName得到的disk.sys設備對象,另外說句題外話,根

//據MJ的說法,disk.sys對于上層的SCSI_PASS_THROUGH是直接轉發給總線設備,那么構造

//相應的IRP直接發給總線設備也可以~這樣貌似更底層
//MajorFunction為自定義的一個參數,根據傳輸進來IRP功能IRP_MJ_READ和IRP_MJ_WRITE

//來轉換。可以查SCSI Primary Commands - 3的B章的operation codes知道10字節的寫為2Ah,

//讀為28h,機器狗代碼中是將2*((UCHAR)MajorFunction+ 17)付給了srb->Cdb[0],我們知道ntd

//dk.h中定義IRP_MJ_READ為0x3,IRP_MJ_WRITE為0x4,其實這只是個簡單的換算而已
//buffer為輸入輸出的緩沖區
//DiskPos為32位指定的磁盤起始邏輯扇區號
//BlockCount為要讀(寫)的扇區數
......
srb->Length=sizeof(SCSI_REQUEST_BLOCK);
        srb->Function=0;     //0即是SRB_FUNCTION_EXECUTE_SCSI
        srb->DataBuffer=buffer;
        srb->DataTransferLength=BlockCount<<9;//因為每扇區是512字節
        srb->QueueAction=SRB_FLAGS_DISABLE_AUTOSENSE;
        srb->SrbStatus=0;
        srb->ScsiStatus=0;//這兩個都是輸出,隨便填
        srb->NextSrb=0;
        srb->SenseInfoBuffer=sense;
        srb->SenseInfoBufferLength=sizeof(SENSE_DATA);
        if(MajorFunction==IRP_MJ_READ)
                srb->SrbFlags=SRB_FLAGS_DATA_IN;
        else
                srb->SrbFlags=SRB_FLAGS_DATA_OUT;

        if(MajorFunction==IRP_MJ_READ)
                srb->SrbFlags|=SRB_FLAGS_ADAPTER_CACHE_ENABLE;

            srb->SrbFlags|=SRB_FLAGS_DISABLE_AUTOSENSE;
                srb->TimeOutValue=(srb->DataTransferLength>>10)+1;
                srb->QueueSortKey=DiskPos;//指定從目標設備的開始位置
                srb->CdbLength=10;
                srb->Cdb[0]=2*((UCHAR)MajorFunction+ 17);//參見上圖10字節CDB的格式
                srb->Cdb[1]=srb->Cdb[1] & 0x1F | 0x80;//高三位是保留位,與0x1f清0高三位,高位置1
                srb->Cdb[2]=(unsigned char)(DiskPos>>0x18)&0xFF;     //大端點數,右移24位,取高8位放入Cdb
                srb->Cdb[3]=(unsigned char)(DiskPos>>0x10)&0xFF;     //
                srb->Cdb[4]=(unsigned char)(DiskPos>>0x08)&0xFF;     //
                srb->Cdb[5]=(UCHAR)DiskPos;           //填寫sector位置
                srb->Cdb[7]=(UCHAR)BlockCount>>0x08;
                srb->Cdb[8]=(UCHAR)BlockCount;
......
}
  當然SRB也是屬于IRP中一部分,自己發IRP給總線設備,當然還得自己填充IRP包,這個就不具體討論了
  總的思路是:先發IoControlCode=FSCTL_GET_RETRIEVAL_POINTERS的IRP給文件系統驅動,得到某個文件的起始邏輯扇區號和大小,然后得到disk.sys的dev,再發構造好的SRB的IRP給disk.sys就ok了,這樣就繞過了還原軟件


RING3發SCSI_PASS_THROUGH:

遍歷符號鏈接找到總線設備
對應的符號鏈接,發送SCSI_PASS_THROUGH_DIRECT給總線設備實現文件讀寫,從而繞過主動防御,其中思路MJ0011說了,不過他給的代碼基本沒用,好幾個暗樁~

posted on 2010-02-06 00:22 小默 閱讀(2896) 評論(1)  編輯 收藏 引用 所屬分類: Windows

評論

# re: RING0和RING3穿透還原軟件zz 2010-02-13 00:07 mj0011

誰說有暗樁了,代碼就是正宗R3穿還原的好不好,已經是2年前的老技術的,放幾年前是有點新,現在就土了啊,樓主真OUT  回復  更多評論   

導航

統計

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费成人av资源网| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一区二区高清| 一区二区高清视频| 中文av字幕一区| 亚洲手机视频| 亚洲欧美视频在线观看| 午夜精品三级视频福利| 欧美资源在线观看| 欧美成人精品在线观看| 国产精品高潮在线| 激情成人亚洲| 日韩午夜黄色| 欧美一区二区三区在线看| 另类欧美日韩国产在线| 亚洲激情一区二区三区| 一区二区高清视频| 久久男女视频| 国产精品久久久久999| 在线观看视频一区| 亚洲欧美一区二区原创| 免费久久精品视频| 夜夜精品视频一区二区| 久久精品人人| 欧美日韩在线影院| 国产一区二区毛片| 亚洲天堂成人在线观看| 米奇777在线欧美播放| 在线一区欧美| 美女在线一区二区| 国产精品女同互慰在线看| 亚洲国产精品久久久久秋霞不卡| 亚洲午夜精品久久久久久浪潮| 久久亚洲国产成人| 国产精品人成在线观看免费| 久久久精品2019中文字幕神马| 欧美福利视频一区| 国产在线视频欧美| 亚洲午夜一区二区| 欧美顶级大胆免费视频| 亚洲男女自偷自拍图片另类| 欧美精品久久久久久| 一区一区视频| 欧美在线视频一区二区三区| 亚洲免费成人av| 欧美黄色大片网站| 亚洲丶国产丶欧美一区二区三区| 欧美淫片网站| 亚洲欧美成aⅴ人在线观看| 欧美日韩视频一区二区三区| 亚洲日本黄色| 亚洲电影在线播放| 另类亚洲自拍| 亚洲国产成人精品视频| 久久精品首页| 久久精品国产成人| 一区二区三区在线免费播放| 久久日韩粉嫩一区二区三区| 香蕉久久夜色精品国产使用方法| 国产精品亚洲片夜色在线| 亚洲欧美日韩一区二区在线 | 亚洲一区精品在线| 亚洲国产精品ⅴa在线观看| 久久久久国色av免费看影院 | 亚洲深夜福利网站| 亚洲精品女人| 农村妇女精品| 亚洲精品中文字幕女同| 亚洲福利视频在线| 免费观看一区| 日韩午夜电影| 中文成人激情娱乐网| 国产欧美一区二区三区久久 | 91久久夜色精品国产网站| 亚洲福利在线观看| 欧美日韩天堂| 香蕉成人久久| 久久大逼视频| 91久久精品日日躁夜夜躁欧美| 亚洲国产成人精品久久久国产成人一区| 久久综合久色欧美综合狠狠| 亚洲精品国产品国语在线app| 亚洲精品欧美极品| 国产欧美日韩综合| 欧美高清视频一区二区三区在线观看| 欧美精品久久99久久在免费线| 国产精品久久久久国产精品日日| 国产精品久久久久9999吃药| 欧美亚洲免费电影| 久久影院午夜论| 国产精品99久久久久久久女警 | 久久久久久久成人| 日韩一级网站| 午夜一区二区三区在线观看| 在线免费日韩片| 亚洲美女色禁图| 国产综合视频在线观看| 米奇777在线欧美播放| 欧美日韩免费观看一区二区三区| 欧美在线亚洲在线| 欧美激情综合色| 久久国产66| 欧美日韩在线观看视频| 美女图片一区二区| 国产精品系列在线| 亚洲精品视频免费在线观看| 国内精品视频一区| 亚洲视频福利| 亚洲精品国产无天堂网2021| 午夜免费日韩视频| 亚洲视频碰碰| 免费日韩精品中文字幕视频在线| 欧美与黑人午夜性猛交久久久| 欧美激情中文字幕在线| 免费观看成人| 国产一区二区三区在线观看网站| 一本色道久久综合狠狠躁篇的优点 | 亚洲国产天堂网精品网站| 国产精品入口福利| 亚洲精品日韩在线观看| 最新国产の精品合集bt伙计| 久久国产精品黑丝| 午夜一区在线| 欧美视频三区在线播放| 亚洲国产成人精品久久久国产成人一区| 国产精品综合av一区二区国产馆| 日韩小视频在线观看专区| 99视频精品全部免费在线| 开心色5月久久精品| 乱中年女人伦av一区二区| 国产一区日韩二区欧美三区| 亚洲欧美激情在线视频| 亚洲欧美综合精品久久成人| 欧美三级电影精品| 99国内精品久久| 在线一区二区三区做爰视频网站| 女人色偷偷aa久久天堂| 欧美福利影院| 亚洲美女诱惑| 欧美日韩三级电影在线| 日韩亚洲欧美一区| 亚洲一区二区三区免费在线观看 | 一区二区三区在线看| 久久精品99国产精品日本| 久久久久久久999精品视频| 国产在线国偷精品产拍免费yy| 亚洲欧美成人| 久久久久成人精品| 免费欧美日韩| 亚洲免费av电影| 欧美午夜宅男影院| 亚洲综合好骚| 久久五月激情| 最新国产拍偷乱拍精品| 欧美日韩精品一区二区三区四区| 99精品欧美一区| 久久av在线看| 亚洲经典三级| 国产精品成人一区二区艾草| 亚洲欧美日韩一区二区| 久久亚洲综合网| 亚洲精品少妇| 国产精品久久| 久久婷婷综合激情| 一区二区三区视频在线播放| 久久精品欧美| 亚洲精品日韩精品| 国产精品日韩久久久久| 久久综合图片| 亚洲一级特黄| 欧美激情日韩| 欧美一区二区三区精品| 亚洲黑丝在线| 国产欧美一区二区精品性| 你懂的成人av| 亚洲欧美日韩高清| 91久久综合| 久久亚洲综合色| 西西裸体人体做爰大胆久久久| 亚洲欧洲免费视频| 国产有码在线一区二区视频| 欧美肉体xxxx裸体137大胆| 久久久久久久网站| 亚洲一区免费在线观看| 亚洲国产你懂的| 久久青草欧美一区二区三区| 亚洲无毛电影| 亚洲精品乱码| 1024国产精品| 国产欧美日韩一级| 国产精品高潮视频| 欧美国产先锋| 久久综合狠狠综合久久激情| 亚洲欧美激情精品一区二区| 99日韩精品| 亚洲精品在线看| 亚洲黄色影院| 亚洲二区三区四区| 亚洲电影在线| 亚洲国产精品激情在线观看|