1. อ่านหมายเลขซีเรียลมาเธอร์บอร์ด
2. อ่านรหัสผ่าน Award BIOS
3. อ่านข้อมูล BIOS
4. รับข้อมูลวันที่ BIOS
1. อ่านหมายเลขซีเรียลมาเธอร์บอร์ด
ใช้ sha1, base64;
ฟังก์ชั่น gethashedbiosinfo: สตริง;
วาจา
sha1context: tsha1context;
sha1digest: tsha1digest;
เริ่ม
// รับข้อมูล BIOS
SetString (ผลลัพธ์, PCHAR (PTR ($ F0000)), $ 10,000);
// แฮชสตริง
sha1init (sha1context);
sha1update (sha1context, pchar (ผลลัพธ์), ความยาว (ผลลัพธ์));
sha1final (sha1context, sha1digest);
setstring (ผลลัพธ์, pchar (@sha1digest), sizeof (sha1digest));
// ส่งคืนสตริงแฮชที่เข้ารหัสในอักขระที่พิมพ์ได้
ผลลัพธ์: = B64ENCODE (ผลลัพธ์);
จบ;
ฟังก์ชั่น getBiosInfoastext: String;
วาจา
P, Q: PCHAR;
เริ่ม
ถาม: = ไม่มี;
P: = pchar (ptr ($ fe000));
ทำซ้ำ
ถ้า q <> nil แล้วเริ่มต้น
ถ้าไม่ใช่ (p^ ใน [ #10, #13, #32 .. #126, #169, #184]) จากนั้นเริ่มต้น
/t ถ้า (p^ = #0) และ (p - q> = 8) แล้วเริ่มต้น
/t ผลลัพธ์: = ผลลัพธ์ + trimright (สตริง (q)) + #13 #10;
/มีแนวโน้ม;
/tq: = nil;
จบ;
จบสิ้น
ถ้า p^ ใน [ #33 .. #126, #169, #184] แล้ว
/tq: = p;
Inc (P);
จนกระทั่ง p> pchar (ptr ($ fffff));
ผลลัพธ์: = trimright (ผลลัพธ์);
จบ;
ขั้นตอน TFORM1.FormCreate (ผู้ส่ง: TOBJECT);
เริ่ม
memo1.lines.text: = getBiosInfoastext;
จบ;
2. การอ่านรหัสผ่าน Award BIOS (ควรเป็นบทความ Jingtao แต่ไม่ได้บันทึก ID)
Award Biospas;
// เขียนโดย lovejingtao
//http://www.138soft.com
ส่วนต่อประสาน
ใช้ windows, sysutils;
ฟังก์ชั่น my_getbiospassword: สตริง;
การดำเนินการ
ฟังก์ชั่น calcpossiblePassword (passwordValue: Word): String;
วาจา
ฉัน: ไบต์;
C: Char;
S: String [8];
เริ่ม
i: = 0;
ในขณะที่ PasswordValue <> 0 ทำ
เริ่ม
inc (i);
ถ้า $ 263> PasswordValue แล้ว
เริ่ม
/t ถ้า $ 80> รหัสผ่านแล้ว
/t s : = char (passwordValue)
/t else ถ้า $ b0> passwordValue แล้ว
/t s : = char (passwordValue และ $ 77)
/T อื่นถ้า $ 11D> PasswordValue แล้ว
/t s : = char ($ 30 หรือ (รหัสผ่านและ $ 0f)))
/T อื่นถ้า $ 114> passwordValue แล้ว
/t เริ่มต้น
/t s : = char ($ 64 หรือ (รหัสผ่านและ $ 0f));
/t ถ้า '' 0 ''> s แล้ว
/t s : = char (byte (s ) + 8);
/มีแนวโน้ม
/T else ถ้า $ 1C2> passwordValue แล้ว
/t s : = char ($ 70 หรือ (รหัสผ่านและ $ 03)))
/T else ถ้า $ 1E4> passwordValue แล้ว
/t s : = char ($ 30 หรือ (รหัสผ่านและ $ 03)))
/T อื่น
/t เริ่มต้น
/t s : = char ($ 70 หรือ (รหัสผ่านและ $ 0f));
/t ถ้า '' z '' <s แล้ว
/t s : = char (byte (s ) - 8);
/มีแนวโน้ม;
จบ
อื่น
S : = Char ($ 30 หรือ (PasswordValue และ $ 3));
PasswordValue: = (PasswordValue - Byte (S )) SHR 2;
จบ;
s [0]: = char (i);
PasswordValue: = I Shr 1;
ในขณะที่ PasswordValue <ฉันทำ
เริ่มต้น {นี่คือทำเพราะรางวัลเริ่มคำนวณด้วยตัวอักษรตัวสุดท้าย}
c: = s [byte (s [0]) - i + 1];
s [byte (s [0]) - i + 1]: = s ;
S : = C;
ธ.ค. (i);
จบ;
calcposiblePassword: = s;
จบ;
ฟังก์ชั่น readCMOS (ปิด: ไบต์): ไบต์;
วาจา
ค่า: ไบต์;
เริ่ม
asm
xor ขวานขวาน
Mov Al, Off
ออก 70h, Al
ในอัล, 71h
ค่า MOV, AL
จบ;
readCMOS: = ค่า;
จบ;
ฟังก์ชั่น my_getbiospassword: สตริง;
วาจา
superpw, userpw: word;
S: String;
เริ่ม
ถ้า win32platform <> ver_platform_win32_nt แล้ว // ไม่ใช่ nt
เริ่ม
pchar (@superpw) [0]: = char (readcmos ($ 1c));
pchar (@superpw) [1]: = char (readcmos ($ 1d));
pchar (@userpw) [0]: = char (readcmos ($ 64));
pchar (@userpw) [1]: = char (readcmos ($ 65));
S: = '' รหัสผ่าน superuser คือ: ''+calcposiblePassword (superpw)+#13+'' รหัสผ่านผู้ใช้คือ: ''+calcposiblePassword (userpw);
ผลลัพธ์: = s;
จบ
อื่น
ผลลัพธ์: = '' ระบบผู้ใช้คือ NT และไม่สามารถรับรหัสผ่าน biso ได้! '';
จบ;
จบ.
3. อ่านข้อมูล BIOS
{โปรแกรมใช้แพลตฟอร์ม Windows 95/2000 ตรวจจับประเภทระบบโดยอัตโนมัติจากนั้นทำการโทรที่แตกต่างกัน}
ใช้ bioshelp;
ขั้นตอน tform1.button1click (ผู้ส่ง: tobject);
วาจา
Dump: Trombiosdump;
ฉัน: จำนวนเต็ม;
เริ่ม
readrombios (dump, rrbmautomatic);
สำหรับ i: = 1 ถึง $ 000FFFFF - $ 000F0000 - 1 DO
memo1.lines.add (inttohex (dump [i + $ 000fffff], 2));
จบ;
(*********************************************************** ********************************
*/T/T/T/T/T/T/T/T/T/T/T/T/T *
* BIOS Help - อ่าน ROM BIOS บน Windows 95/98/SE/ME/NT/2K/XP/T/T *
*/T/T/T/T/T/T/T/T/T/T/T/T/T *
* ลิขสิทธิ์ (c) 2001, Nico Bendlin ([email protected])/t/t/t *
*/T/T/T/T/T/T/T/T/T/T/T/T/T *
* คอมไพเลอร์: Delphi 4.03/5.01/6.00/T/T/T/T/T/T/T *
* เวอร์ชัน: 1.03, 2001-09-02/T/T/T/T/T/T/T/T *
*/T/T/T/T/T/T/T/T/T/T/T/T/T *
******************************************************** ******* ***************************************
{postum scriptum: ขออภัยสำหรับภาษาอังกฤษที่ไม่ดีฉันเขียนมันรีบ}
หน่วย bioshelp;
{$ จัดเรียงบน}
{$ minenumsize 4}
ส่วนต่อประสาน
ใช้
Windows;
พิมพ์
prombiosdump = ^trombiosdump;
trombiosdump = array [$ 000f0000 .. $ 000ffff] ของไบต์;
พิมพ์
treadrombiosmethod = (
rrbmautomatic,/t/t/t/t/t {ประเภทระบบปฏิบัติการอัตโนมัติและใช้วิธีที่เหมาะสม}
RRBMGENERIC,/T/T/T/T/T/T {ใช้โปรแกรม COM 16 บิตเพื่อทิ้ง BIOS}
rrbmmemory,/t/t/t/t/t {อ่านจากหน่วยความจำ (win9x)/t/t}
rrbmphysical/t/t/t/t/t {อ่านจากวัตถุหน่วยความจำกายภาพ (winnt)}
-
ฟังก์ชั่น readrombios (var dump: trombiosdump; วิธี: treadrombiosmethod;
หมดเวลา: dword = ไม่มีที่สิ้นสุด): บูลีน;
ฟังก์ชั่น getRombiosBuffer (const dump: Trombiosdump; ที่อยู่: ตัวชี้;
บัฟเฟอร์ var;
ฟังก์ชั่น getRombiosstring (const dump: trombiosdump; ที่อยู่: ตัวชี้): สตริง;
ฟังก์ชั่น getRombioslonglong (const dump: Trombiosdump; ที่อยู่: ตัวชี้): Longlong;
ฟังก์ชั่น getRombiosdword (const dump: trombiosdump; ที่อยู่: ตัวชี้): dword;
ฟังก์ชั่น getRombiOsword (const dump: Trombiosdump; ที่อยู่: ตัวชี้): Word;
ฟังก์ชั่น getRombiOpByte (const dump: Trombiosdump; ที่อยู่: ตัวชี้): ไบต์;
การดำเนินการ
{############## หดตัว ############################################ หดตัว ################################################################### ##
#/T/T/T/T/T/T/T/T/T/T/T/T #
#/t/t/t วิธีการทั่วไป/t/t/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
# สร้างโฟลเดอร์ชั่วคราวบันทึกโปรแกรม 16 บิต com (romdump.com) ลงไป #
# รันโปรแกรมที่เปลี่ยนเส้นทางไปยังไฟล์ (rom.dmp, romdump.com เพียงแค่ทิ้ง #
# หน่วยความจำช่วง F000: 0000-F000: FFFF ถึง stdout), อ่านไฟล์ดั๊มป์ลงในบัฟเฟอร์, #
# และในที่สุดก็ล้างข้อมูลไฟล์และไดเรกทอรีทั้งหมด/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
# (ฟังก์ชั่น romdumpcode เป็น x86 เฉพาะซึ่งฉันเขียนเพื่อสร้าง 16 บิต #
# รหัสด้วยความช่วยเหลือของคอมไพเลอร์ Delphi 23 บิตอย่าพยายามเรียกใช้ #
# pseudo-code ในโปรแกรมของคุณ!
#/T/T/T/T/T/T/T/T/T/T/T/T #
################################################################### ###################################################################################################ิจ ############################################################################## หดตัว
{ * ภายใน * - Pseudo 16 -bit code}}
พิมพ์
promdumpCodeInfo = ^tromdumpCodeInfo;
tromdumpCodeInfo = (rdcistart, rdciend, rdcisize);
ฟังก์ชั่น _romdumpcode (ข้อมูล: TromdumpCodeInfo): ตัวชี้;
วาจา
Codestart: ตัวชี้;
Codeend: ตัวชี้;
เริ่ม
asm
/t jmp @@ end
/t { * เริ่ม * รหัส 16 บิต}
/t { - อย่าใช้ในโปรแกรมของคุณ!
/t {com ที่เขียน rom-bios to stdout}
@@เริ่ม:
/t {dump f000: 0000-f000: fffe}
/t xor edx, edx // ds = 0xf000;
/t mov dh, 0f0h
/t mov ds, edx
/t xor edx, edx // dx = 0x0000;
/T XOR ECX, ECX // CX = 0xffff;
/T Dec ECX
/T XOR EBX, EBX // BX = 0x0001;
/t inc ebx
/T MOV AH, 40H // DOSCALL (0x40);
/t int 21h
/t jc @@ ออก // เกี่ยวกับข้อผิดพลาดทางออก;
/t {dump f000: ffff}
/t xor edx, edx // ds = 0xf000;
/t mov dh, 0f0h
/t mov ds, edx
/t xor edx, edx // dx = 0xffff;
/T Dec Edx
/T XOR ECX, ECX // CX = 0x0001;
/T inc ecx
/t mov ebx, ecx // bx = 0x0001;
/T MOV AH, 40H // DOSCALL (0x40);
/t int 21h
/t jc @@ ออก // เมื่อออกจากข้อผิดพลาด
/t mov al, 0 // ไม่มีข้อผิดพลาด
@@ ทางออก:
/t mov ah, 4ch // doscall (0x4c);
/t int 21h
@@จบ:
/t { * สิ้นสุด * รหัส 16 บิต}
/t mov codestart, Offset @@ start
/t mov codeend, ออฟเซ็ต @@ end
จบ;
ข้อมูลกรณีของ
rdcistart:
ผลลัพธ์: = codestart;
rdciend:
ผลลัพธ์: = codeend;
rdcisize:
ผลลัพธ์: = ตัวชี้ (Cardinal (codeend) - Cardinal (codestart));
อื่น
ผลลัพธ์: = ไม่มี;
จบ;
จบ;
{ * ภายใน * - บันทึกรหัส 16 บิตเป็นไฟล์}
ฟังก์ชั่น _romdumpcodetofile (ชื่อไฟล์ const: สตริง): บูลีน;
วาจา
Comfile: Thandle;
ขนาด: พระคาร์ดินัล;
เริ่ม
ผลลัพธ์: = เท็จ;
Comfile: = createFile (pchar (ชื่อไฟล์), generic_write, file_share_read, nil,
create_always, file_attribute_normal, 0);
ถ้า comfile <> invalid_handle_value แล้ว
พยายาม
ผลลัพธ์: = writefile (comfile, _romdumpcode (rdcistart)^,
พระคาร์ดินัล (_romdumpcode (rdcisize)), ขนาด, ไม่มี) และ
(size = cardinal (_romdumpcode (rdcisize)));
ถ้าไม่ผลลัพธ์แล้ว
DELETEFILE (PCHAR (ชื่อไฟล์));
ในที่สุด
ภาพใกล้ชิด (comfile);
จบ;
จบ;
{ * ภายใน * - เรียกใช้รหัส 16 บิตที่เปลี่ยนเส้นทางไปยังไฟล์}
ฟังก์ชั่น _romdumpcodeExecute (const com, dmp: string; timeout: dword): บูลีน;
วาจา
comspec: สตริง;
SI: TSTARTUPINFO;
PI: tprocessinformation;
เริ่ม
ผลลัพธ์: = เท็จ;
setLength (comspec, max_path);
setLength (comspec,
getenvironmentVariable ('' comspec '', pchar (@comspec [1]), max_path));
ถ้าความยาว (comspec)> 0 จากนั้น
เริ่ม
Fillchar (si, sizeof (tstartupinfo), 0);
si.cb: = sizeof (tstartupinfo);
si.dwflags: = startf_useshowwindow;
si.wshowwindow: = sw_hide;
ถ้า createProcess (ไม่มี, pchar (comspec + '' /c '' + com + ''> '' + dmp),
ไม่มี, ไม่มี, false, create_new_console หรือ create_new_process_group, nil,
Nil, si, pi) แล้ว
พยายาม
ผลลัพธ์: = waitforsingleobject (pi.hprocess, หมดเวลา) <> wait_timeout;
ในที่สุด
CloseHandle (pi.hprocess);
CloseHandle (PI.HTHREAD);
จบ;
จบ;
จบ;
ฟังก์ชัน DirectoryExists (const dir: string): บูลีน;
วาจา
attr: dword;
เริ่ม
attr: = getFileattributes (pchar (dir));
ผลลัพธ์: = (attr <> $ ffffffff) และ
(attr และ file_attribute_directory = file_attribute_directory);
จบ;
{รับ BIOS ทิ้งวิธีทั่วไป}
ฟังก์ชั่น readrombios16 (var buffer: trombiosdump; หมดเวลา: DWORD): บูลีน;
const
tempsub = '' ~ romdmp '';
comname = '' romdump.com '';
dmpName = '' rom.dmp '';
วาจา
Temppath: String;
Tempdir: String;
TEMPIDX: จำนวนเต็ม;
Tempidxstr: String;
Comfile: String;
dmpfile: สตริง;
Dmphandle: Thandle;
เขียน: dword;
เริ่ม
ผลลัพธ์: = เท็จ;
SetLength (Temppath, Max_Path);
SetLength (Temppath, getTemppath (max_path, pchar (@temppath [1])));
ถ้าความยาว (temppath)> 0 แล้ว
เริ่ม
ถ้า (temppath [ความยาว (temppath)] <> ''/'') แล้ว
Temppath: = Temppath + ''/'';
Tempidx: = 0;
ทำซ้ำ
Inc (Tempidx);
Str (Tempidx, Tempidxstr);
tempdir: = temppath + tempsub + tempidxstr;
จนกว่าจะไม่ได้มีไดเรกทอรี (tempdir);
หากสร้างไดเร็กทอรี่ (pchar (tempdir), nil) แล้ว
พยายาม
tempdir: = tempdir + ''/'';
Comfile: = tempdir + comname;
dmpfile: = tempdir + dmpname;
ถ้า _romdumpcodetofile (comfile) แล้ว
พยายาม
ถ้า _romdumpcodeExecute (comfile, dmpfile, หมดเวลา) แล้ว
เริ่ม
/t dmphandle: = createFile (pchar (dmpfile), generic_read,
/t file_share_read หรือ file_share_write, nil, open_existing, 0, 0);
/t ถ้า dmphandle <> invalid_handle_value แล้ว
/ไม่ลอง
/t Fillchar (บัฟเฟอร์, sizeof (Trombiosdump), 0);
/t ผลลัพธ์: = readfile (dmphandle, บัฟเฟอร์, sizeof (trombiosdump),
/t เขียน, ไม่มี) และ (เขียน = sizeof (trombiosdump));
/t ในที่สุด
/t closehandle (dmphandle);
/มีแนวโน้ม;
จบ;
ในที่สุด
DELETEFILE (PCHAR (DMPFILE));
DELETEFILE (PCHAR (Comfile));
จบ;
ในที่สุด
removedirectory (pchar (tempdir));
จบ;
จบ;
จบ;
{############## หดตัว ############################################ หดตัว ################################################################### ##
#/T/T/T/T/T/T/T/T/T/T/T/T #
#/t/t/t วิธีการโดยตรง (win9x)/t/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
# เนื่องจากข้อเท็จจริงที่ว่า Windows 95/98/ME แมป BIOS ในทุกกระบวนการ Win32 #
# สำหรับการเข้าถึงการอ่านมันง่ายมากที่จะเติมบัฟเฟอร์จากหน่วยความจำ/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
################################################################### ###################################################################################################ิจ ############################################################################## หดตัว
ฟังก์ชั่น readrombios9x (var buffer: trombiosdump): บูลีน;
เริ่ม
ผลลัพธ์: = เท็จ;
พยายาม
Fillchar (บัฟเฟอร์, sizeof (Trombiosdump), 0);
ย้าย (ตัวชี้ (ต่ำ (trombiosdump))^, บัฟเฟอร์, sizeof (trombiosdump));
ผลลัพธ์: = จริง;
ยกเว้น
// ละเว้นข้อยกเว้น
จบ
จบ;
{############## หดตัว ############################################ หดตัว ################################################################### ##
#/T/T/T/T/T/T/T/T/T/T/T/T #
#/t/t วิธีการทางกายภาพของหน่วยความจำ (winnt)/t/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
# บน Windows NT BIOS ROM มีให้เฉพาะผ่านวัตถุเคอร์เนลที่มีชื่อเท่านั้น #
# ''/device/physicalmemory ''
# โหมดผู้ใช้พร้อมฟังก์ชั่น Win32 API มาตรฐานเราใช้ประโยชน์จาก Nativeapi ของ NT 'ใน #
# ntdll.dll ("nt-layer") คือ zwopensection./t/t/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
# (หมายเหตุ: ส่วนใหญ่มีสองเวอร์ชันของทุกฟังก์ชัน ZWXXX และ NTXXX THE #
# ความแตกต่างเฉพาะในโหมดเคอร์เนลคือเวอร์ชัน ntxxx ทำงานในการพิจารณา- #
# ปันส่วนเพื่อความปลอดภัยในขณะที่ zwxxx ไม่ได้
#/T/T/T/T/T/T/T/T/T/T/T/T #
# ในตอนแรกส่วนที่เปิดด้วย zwopensection
# ZWMAPVIEWOFSECTION, ZWUNMAPVIEWOFSECTION และ NTCLOSE
# ซับซ้อนมากขึ้นและไม่จำเป็นต้องใช้
# ในโหมดผู้ใช้ "ง่ายมาก" =) ตอนนี้เราใช้ MapViewoffile, unmapviewoffile, #
# และ closehandle เพื่อแมปหน้าต่างหน่วยความจำ (BIOS ROM) เข้าสู่กระบวนการของเรา
#/T/T/T/T/T/T/T/T/T/T/T/T #
# เนื่องจากความจริงที่ว่า zwopensection ส่งคืนรหัสข้อผิดพลาด NT ในกรณีที่ล้มเหลว #
# เราต้องแปลเป็นรหัสข้อผิดพลาด Win32 (rtlntstatustodoserror)
# ฟังก์ชั่นเฉพาะทั้งหมด NT ถูกโหลดแบบไดนามิก - เนื่องจากแอปพลิเคชัน #
# ควรเริ่มต้นด้วย Win9x Systems =)/T/T/T/T/T/T #
#/T/T/T/T/T/T/T/T/T/T/T/T #
################################################################### ###################################################################################################ิจ ############################################################################## หดตัว
{สำหรับข้อมูลเพิ่มเติมดู Windows 2000/XP DDK}
{ใช้งานได้กับ Windows NT 4.0 ด้วยใช้ ntdll.dll}
พิมพ์
ntstatus = จำนวนเต็ม;
const
status_success = ntstatus (0);
Status_invalid_handle = ntstatus ($ c0000008);
status_access_denied = ntstatus ($ c0000022);
พิมพ์
punicodestring = ^tunicodestring;
tunicodestring = บันทึกที่บรรจุ
ความยาว: คำ;
ความยาวสูงสุด: Word;
บัฟเฟอร์: Pwidechar;
จบ;
const
obj_inherit = $ 00000002;
obj_permanent = $ 00000010;
obj_exclusive = $ 00000020;
obj_case_insensitive = $ 00000040;
obj_openif = $ 00000080;
OBJ_OPENLINK = $ 00000100;
obj_kernel_handle = $ 00000200;
obj_valid_attributes = $ 000003f2;
พิมพ์
pobjectattributes = ^tobjectattributes;
tobjectatTributes = บันทึก
ความยาว: Ulong;
Rootdirectory: Thandle;
ObjectName: Punicodestring;
คุณลักษณะ: Ulong;
SecurityDescriptor: PscurityDescriptor;
SecurityQualityOfService: PSCURITEMULITYOFSERVICE;
จบ;
const
ObjectPhysicalMemoryDevicename = ''/อุปกรณ์/physicalMemory '';
ObjectPhysicalMemoryName: tunicodestring = (
ความยาว: ความยาว (ObjectPhysicalMemoryDevicename) * 2;
ความยาวสูงสุด: ความยาว (ObjectPhysicalMemoryDevicename) * 2 + 2;
บัฟเฟอร์: ObjectPhysicalMemoryDevicename;
-
ObjectPhysicalMemoryAccessMask: access_mask = section_map_read;
ObjectPhysicalMemoryAttributes: tobjectatTributes = (
ความยาว: sizeof (tobjectattributes);
Rootdirectory: 0;
ObjectName: @ObjectPhysicalMemoryName;
แอตทริบิวต์: OBJ_CASE_INSSENSITITY;
SecurityDescriptor: Nil;
SecurityQualityofService: Nil;
-
พิมพ์
tfnzwopensection = function (out sectionhandle: thandle;
Desiredaccess: Access_mask;
stdcall;
tfnrtlntstatustodoserror = ฟังก์ชั่น (สถานะ: ntstatus): dword;
const
ntdll = '' ntdll.dll '';
วาจา
ZWOPENCECTION: TFNZWOPENCECTION;
rtlntstatustodoserror: tfnrtlntstatustodoserror;
ฟังก์ชั่น readrombiosnt (var buffer: trombiosdump; หมดเวลา: DWORD): บูลีน;
วาจา
ntlayer: hmodule;
สถานะ: ntstatus;
ส่วน: Thandle;
ดู: ตัวชี้;
เริ่ม
ผลลัพธ์: = เท็จ;
ntlayer: = getModuleHandle (ntdll);
ถ้า ntlayer = 0 แล้ว
SetLasterRor (ERROR_CALL_NOT_IMPLEMENTED)
อื่น
เริ่ม
หากไม่ได้รับมอบหมาย (zwopenection) จากนั้น
zwopensection: = getProcaddress (ntlayer, '' zwopenection '');
หากไม่ได้รับมอบหมาย (rtlntstatustodoserror) แล้ว
rtlntstatustodoserror: = getProcaddress (ntlayer, '' rtlntstatustodoserror '');
ถ้าไม่ (กำหนด (zwopenection) และกำหนด (rtlntstatustodoserror)) แล้ว
SetLasterRor (ERROR_CALL_NOT_IMPLEMENTED)
อื่น
เริ่ม
สถานะ: = zwopensection (ส่วน, ObjectPhysicalMemoryAccessMask
@ObjectPhysicalMemoryAttributes);
สถานะกรณีของ
Status_success:
/ไม่ลอง
/T View: = MapViewOffile (ส่วน, ObjectPhysicalMemoryAccessmask, 0, 0,
/t ต่ำ (trombiosdump), sizeof (trombiosdump));
/t ถ้าได้รับมอบหมาย (ดู) จากนั้น
/ไม่ลอง
/t Fillchar (บัฟเฟอร์, sizeof (Trombiosdump), 0);
/t ย้าย (ดู^, บัฟเฟอร์, sizeof (trombiosdump));
/t ผลลัพธ์: = true;
/t ในที่สุด
/t unmapviewoffile (ดู);
/มีแนวโน้ม;
/t ในที่สุด
/t closehandle (ส่วน);
/มีแนวโน้ม;
สถานะ _access_denied:
/t ผลลัพธ์: = readrombios16 (บัฟเฟอร์, หมดเวลา);
อื่น
SetlasterRor (RTLNTSTATTUSTODOSERROR (สถานะ))
จบ;
จบ;
จบ;
จบ;
{############## หดตัว ############################################ หดตัว ################################################################### ##
#/T/T/T/T/T/T/T/T/T/T/T/T #
#/t/t/t readrombios/t/t/t/t #
#/T/T/T/T/T/T/T/T/T/T/T/T #
################################################################### ###################################################################################################ิจ ############################################################################## หดตัว
ฟังก์ชั่น readrombios (var dump: trombiosdump; วิธี: treadrombiosmethod;
หมดเวลา: dword = ไม่มีที่สิ้นสุด): บูลีน;
เริ่ม
ผลลัพธ์: = เท็จ;
วิธีการกรณีของ
rrbmautomatic:
ถ้า (จำนวนเต็ม (getVersion) <0) จากนั้น
พยายาม
ผลลัพธ์: = readrombios9x (dump);
ยกเว้น
ผลลัพธ์: = readrombios16 (dump, หมดเวลา);
จบ
อื่น
ผลลัพธ์: = readrombiosnt (dump, หมดเวลา);
rrbmgeneric:
ผลลัพธ์: = readrombios16 (dump, หมดเวลา);
rrbmmemory:
ผลลัพธ์: = readrombios9x (dump);
rrbmphysical:
ผลลัพธ์: = readrombiosnt (dump, หมดเวลา);
อื่น
SetLasterRor (ERROR_INVALID_PARAMETER);
จบ;
จบ;
{############## หดตัว ############################################ หดตัว ################################################################### ##
#/T/T/T/T/T/T/T/T/T/T/T/T #
# ยูทิลิตี้เพื่อลดความซับซ้อนของการเข้าถึงข้อมูลเป็นประเภทมาตรฐานทั่วไป #
#/T/T/T/T/T/T/T/T/T/T/T/T #
################################################################### ###################################################################################################ิจ ############################################################################## หดตัว
ฟังก์ชั่น getRombiosBuffer (const dump: Trombiosdump; ที่อยู่: ตัวชี้;
บัฟเฟอร์ var;
เริ่ม
ผลลัพธ์: = 0;
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (Trombiosdump)) จากนั้น
เริ่ม
ผลลัพธ์: = บัฟเฟอร์
if (Cardinal (ที่อยู่) + Buffersize> High (Trombiosdump)) จากนั้น
ผลลัพธ์: = สูง (trombiosdump) - พระคาร์ดินัล (ที่อยู่) + 1;
ย้าย (dump [cardinal (ที่อยู่)], บัฟเฟอร์, ผลลัพธ์);
จบ;
จบ;
ฟังก์ชั่น getRombiosstring (const dump: trombiosdump; ที่อยู่: ตัวชี้): สตริง;
เริ่ม
ผลลัพธ์: = '' '';
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (Trombiosdump)) จากนั้น
ผลลัพธ์: = สตริง (pchar (@dump [cardinal (ที่อยู่)]));
จบ;
ฟังก์ชั่น getRombioslonglong (const dump: Trombiosdump; ที่อยู่: ตัวชี้): Longlong;
พิมพ์
Plonglong = ^Longlong;
เริ่ม
ผลลัพธ์: = 0;
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (trombiosdump) - sizeof (ยาว) + 1) จากนั้น
ผลลัพธ์: = plonglong (@dump [cardinal (ที่อยู่)])^;
จบ;
ฟังก์ชั่น getRombiosdword (const dump: trombiosdump; ที่อยู่: ตัวชี้): dword;
เริ่ม
ผลลัพธ์: = 0;
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (trombiosdump) - sizeof (dword) + 1) จากนั้น
ผลลัพธ์: = pdword (@dump [cardinal (ที่อยู่)])^;
จบ;
ฟังก์ชั่น getRombiOsword (const dump: Trombiosdump; ที่อยู่: ตัวชี้): Word;
เริ่ม
ผลลัพธ์: = 0;
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (trombiosdump) - sizeof (word) + 1) จากนั้น
ผลลัพธ์: = pword (@dump [cardinal (ที่อยู่)])^;
จบ;
ฟังก์ชั่น getRombiOpByte (const dump: Trombiosdump; ที่อยู่: ตัวชี้): ไบต์;
เริ่ม
ผลลัพธ์: = 0;
if (cardinal (ที่อยู่)> = ต่ำ (Trombiosdump)) และ
(พระคาร์ดินัล (ที่อยู่) <= สูง (Trombiosdump) - sizeof (byte) + 1) จากนั้น
ผลลัพธ์: = pbyte (@dump [cardinal (ที่อยู่)])^;
จบ;
จบ.
4. รับข้อมูลวันที่ BIOS
{--------------------------------------------- -----------------------------}
{รับข้อมูลวันที่ของ BIOS คาดว่าจะมีผลบังคับใช้ภายใต้ปี 2000 แต่อาจต้องได้รับอนุญาต}
ฟังก์ชั่น getBiosDate1: สตริง;
วาจา
บัฟเฟอร์: อาร์เรย์ [0..8] ของถ่าน;
n: dword;
เริ่ม
ReadProcessMemory (getCurrentProcess,
PTR ($ FFFF5)
@buffer
8,
n);
บัฟเฟอร์ [8]: = #0;
ผลลัพธ์: = strpas (บัฟเฟอร์)
จบ;
ฟังก์ชั่น getBiosDate2: สตริง;
เริ่ม
ผลลัพธ์: = สตริง (pchar (ptr ($ ffff5)));
จบ;