史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 作業系統操作技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-12-12, 02:53 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 如何在windows程序中讀取bios內容(實體記憶體內容)

標題:如何在windows程序中讀取bios內容(實體記憶體內容)
作者: 火翼[CCG]
組織 : [CCG] (China Cracking Group)

今天和夜月兄討論了一下在windows nt/2000/xp下如何讀取bios信息,現在把
結果向大家匯報一下。
大家都知道,windows接管了對實體記憶體的直接存取,而bios信息存在實體記憶體
的f000:0000處,關鍵就是如何讀取實體記憶體。
查閱了msdn的文章後,發現以下有幾個函數和實體記憶體訪問有關:
NTSTATUS ZwOpenSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSTATUS ZwMapViewOfSection(IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect
);
NTSTATUS ZwUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);

用到的結構定義如下

typedef struct _UNICODE_STRING {
USHORT Length;//長度
USHORT MaximumLength;//最大長度
PWSTR Buffer;//緩衝游標,訪問實體記憶體時,此處指向UNICODE字串串"\device\physicalmemory"
} UNICODE_STRING,*PUNICODE_STRING;


typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;//長度 18h
HANDLE RootDirectory;// 00000000
PUNICODE_STRING ObjectName;//指向對像名的游標
ULONG Attributes;//對像內容00000040h
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;



函數說明
第一個函數ZwOpenSection用來開啟section,第一個參數是指向HANDLE變數的游標,第二個是訪問參數,第三個是指向OBJECT_ATTRIBUTES的游標
第二個函數ZwMapViewOfSection用來建立實體記憶體和當前工作的一段實體記憶體的聯繫,參數很多,一會在例程裡再詳細解釋
第三個函數ZwUnmapViewOfSection用來中斷連線實體記憶體和當前工作中的映射中斷連線聯繫,第一個參數是工作句柄,必須掉用第二個函數時一樣,第二
個是當前工作中映射的基址,由ZwMapViewOfSection返回

這三個函數都在ntdll.dll中,msdn裡的說明 說這幾個函數用在驅動編制上。
例程如下

//結構定義
typedef struct _UNICODE_STRING {
USHORT Length;//長度
USHORT MaximumLength;//最大長度
PWSTR Buffer;//緩衝游標
} UNICODE_STRING,*PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;//長度 18h
HANDLE RootDirectory;// 00000000
PUNICODE_STRING ObjectName;//指向對像名的游標
ULONG Attributes;//對像內容00000040h
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;

//函數游標變數類型生命
typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);
typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);
//以上在程序開始定義全局變數處定義

//以下在程序的主函數里
//變數宣告
UNICODE_STRING struniph;
OBJECT_ATTRIBUTES obj_ar;
ZWOS ZWopenS;
ZWMV ZWmapV;
ZWUMV ZWunmapV;
HANDLE hSection;
DWORD ba;
LARGE_INTEGER so;
SIZE_T ssize;
so.LowPart=0x000f0000;//實體記憶體的基址,就是f000:0000
so.HighPart=0x00000000;
ssize=0xffff;
wchar_t strPH[30]=L"\\device\\physicalmemory";
//變數啟始化
ba=0;//聯繫後的基址將在這裡返回
struniph.Buffer=strPH;
struniph.Length=0x2c;//注意大小是按字元算
struniph.MaximumLength =0x2e;//也是字元
obj_ar.Attributes =64;//內容
obj_ar.Length =24;//OBJECT_ATTRIBUTES類型的長度
obj_ar.ObjectName=&struniph;//指向對象的游標
obj_ar.RootDirectory=0;
obj_ar.SecurityDescriptor=0;
obj_ar.SecurityQualityOfService =0;
//讀入ntdll.dll,得到函數位址
hinstLib = LoadLibrary("ntdll.dll");
ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");
ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");
ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");
//使用函數,對實體記憶體進行映射
ZWopenS(&hSection,4,&obj_ar);
ZWmapV(
(HANDLE)hSection, //開啟Section時得到的句柄
(HANDLE)0xffffffff, //將要映射工作的句柄,
&ba, //映射的基址
0, //沒怎麼看明白,設為0就好了
0xffff, //分配的大小
&so, //實體記憶體的位址
&ssize, //指向讀取記憶體塊大小的游標
1, //子工作的可繼承性設定
0, //分配類型
2 //保護類型
);
//執行後會在當前工作的空間開闢一段64k的空間,並把f000:0000到f000:ffff處的內容映射到這裡
//映射的基址由ba返回,如果映射不在有用,應該用ZwUnmapViewOfSection中斷連線映射
BTW:
思路主要是來之上次跟蹤的聯想的安裝驗證程序,真的要感謝聯想的技術人員了:-)。


98下相同功能的程式碼 (1千字)
詳細資料:

//隨便用回編寫了點程式碼,懶的解釋,功能同2000下讀取bois
void* ptrmem=malloc(0xffff);
_asm
{
PUSHAD

PUSH 0
SIDT [ESP-2]
POP EDI ; EDI -> IDT base
ADD EDI, 32 ; EDI -> target Int Entry

MOV ECX,[EDI+4]
MOV CX, WORD PTR [EDI] ; ECX -> original Int Handler

mov ESI,offset pNewIntHandler ; ESI -> new Int Handler


; make the Int Handler address point to pNewIntHandler
MOV [EDI], SI
SHR ESI, 16
MOV [EDI+6], SI

INT 4 ; "call" hooked interrupt

; restore the original Int Handler address
MOV [EDI], CX
SHR ECX, 16
MOV [EDI+6], CX

POPAD
jmp ring0_out
pNewIntHandler:
PUSHAD
MOV ECX,0FFFFh
MOV EAX,0F0000h
MOV EBX,ptrmem
CONTINUE:
MOV DL,SS:[EAX]
MOV [EBX],DL
INC EBX
INC EAX
DEC ECX
JNZ CONTINUE
POPAD
iretd

ring0_out:
}

另外
我發現每次2000啟動後1408-140a偏移處程式碼都不一樣

搜尋相異處

1. C:\pll20001.tmp: 65,535 字元
2. C:\pll2000.tmp: 65,535 字元

1408: 90 E9
1409: 47 3E
140A: E8 A8

3 差別 發現。

為什麼會變化呢?有知道這幾個字元的意思的兄弟麼?

pll621
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:22 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1