alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2872回复:6

如何在读写CMOS

楼主#
更多 发布于:2003-04-24 14:34
如何在读写CMOS :(

最新喜欢:

cyliucyliu
好好学习,天天向上...
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-25 16:17
70h是地址,71h是数据,你说怎么读?呵呵
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-04-26 13:05
                               新来的客人想发言必须注册!请点击此处!  


原有信息:
序 号:257109
标 题:一个字“强!!!!!!!!!!”。 (32千字)
发信人:柯南[CCG]
时 间:2003-3-3 13:38:34
阅读次数:99
详细信息:

朋友的水平,真是另人刮目相待,读了这片文章有醍醐灌顶之感。遗憾的是有写地方我能力有限,没有看透,呵呵(笑..........)。
有一点你好象没有删除Section对象ZwClose 搞定。
还有这里有一篇和\\Device\\PhysicalMemory有点关系的文章,好象你不只可以读bios,如果有system权限的话,还可以写bios呢!,呵呵^@^...希望兄弟研究研究(做点XXX毒啦),我能力有限就算了,期待你的大做!
以下是转载:

原文:“Playing with Windows /dev/(k)mem”(p59-0x10)
原作者:crazylord <crazylord@minithins.net>

翻译:Refdom


1、介绍

2、介绍WINDOWS对象
2.1 它们是什么
2.2 它们的结构
2.3 对象操作

3、介绍 \\Device\\PhysicalMemory
3.1 对象
3.2 需要写权限?

4、玩 \\Device\\PhysicalMemory
4.1 读/写内存
4.2 什么是Callgate
4.3 不用驱动运行ring0代码
4.4 深入到进程表
4.5 Bonus Track

5、代码示例
5.1 kmem.h
5.2 chmod_mem.c
5.3 winkdump.c
5.2 winkps.c
5.4 fun_with_ipd.c



--[ 1 介绍

本文介绍Windows /dev/kmem,我的研究是在Windows 2000 professional上实施的,这意味着本文中的
多数代码都可以在windows 2000版本上运行,稍经改动,也可以运行在XP上。很明显Windows 9x/Me不会支持,
因为它们的核心结构并不相同。


--[ 2 介绍Windows对象

Windows2000使用对象模型来提供非常简单的方式操作多数基本的核心元素。我们可以在本节看看这些对
象和怎么去操作它们。

----[ 2.1 What are they?

按照微软的说法,设计对象管理器只要来达到下面这些目的:
* 使用命名对象方便识别
* 支持POSIX子系统
* 提供方便的方法来操作系统资源
* 提供一种装填机制来限制进程使用的资源
* 顺应C2安全的要求。

有27种不同的对象类型:
* Adapter * File * Semaphore
* Callback * IoCompletion * SymbolicLink
* Controler * Job * Thread
* Desktop * Key * Timer
* Device * Mutant * Token
* Directory * Port * Type
* Driver * Process * WaitablePort
* Event * Profile * WindowStation
* EventPair * Section * WmiGuid

多数这些对象从命令就能够看出它们是关于什么的了。我会解释一些模糊的名字:
* 一个EventPair只是2个Event对象
* Mutant也被称为互斥体(Mutex),是一种处理资源访问的同步机制
* Port被LPC(Local Procedure Call)作Inter-Processus 通讯。
* Semaphore是限制访问资源的计数器
* Token (Access Token)是安全对象
* WindowStation是桌面对象容器。

这些对象可能类似目录树结构一样组织成:

- \\
- ArcName (symbolic links to harddisk partitions)
- NLS (sections ...)
- Driver (installed drivers)
- WmiGuid
- Device (/dev linux like)
- DmControl
- RawDmVolumes
- HarddiskDmVolumes
- PhysicalDmVolumes
- Windows
- WindowStations
- RPC Control
- BaseNamedObjects
- Restricted
- ?? (current user directory)
- FileSystem (information about installable files system)
- ObjectTypes (contains all avaible object types)
- Security
- Callback
- KnownDlls (Contains sections of most used DLL)

\"??\"目录是当前用户目录,\"Device\"可以被看作跟LINUX上的/dev一样。你可以在Sysinternals网站上
找到这个结构。

----[ 2.2 他们的结构

每个对象都包含两部分:对象头和对象实体。Sven B. Schreiber在\"Windows 2000 Undocumented Secrets\"
一书中定义了多数没公开的头部结构。我们可以来看看这些头结构。

---
from w2k_def.h:

typedef struct _OBJECT_HEADER {
/*000*/ DWORD PointerCount; // number of references
/*004*/ DWORD HandleCount; // number of open handles
/*008*/ POBJECT_TYPE ObjectType; // pointer to object type struct
/*00C*/ BYTE NameOffset; // OBJECT_NAME offset
/*00D*/ BYTE HandleDBOffset; // OBJECT_HANDLE_DB offset
/*00E*/ BYTE QuotaChargesOffset; // OBJECT_QUOTA_CHARGES offset
/*00F*/ BYTE ObjectFlags; // OB_FLAG_*
/*010*/ union
{ // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
/*010*/ PQUOTA_BLOCK QuotaBlock;
/*010*/ POBJECT_CREATE_INFO ObjectCreateInfo;
};
/*014*/ PSECURITY_DESCRIPTOR SecurityDescriptor;
/*018*/ } OBJECT_HEADER, *POBJECT_HEADER;
---

头部中的每个偏移量都是负数偏移量,因此你如果想从头结构中找到OBJECT_NAME结构,你应该这样计算:
address = object_header_address - name_offset

OBJECT_NAME结构允许创建者通过赋一个名字让对象对其他进程可见。
OBJECT_HANDLE_DB结构允许核心跟踪当前谁正在使用该对象。
OBJECT_QUOTA_CHARGES结构用来定义了进程访问对象的配额。
OBJECT_TYPE结构存储关于对象类型的全局信息,比如:默认的安全权限,对象大小,进程使用对象的默
认配额等。

对象绑定的安全描述符可以让核心来限制对象访问。

每一个对象类型的内部程序都十分接近C++对象中的构造和析构:
* dump method -可能是为了调试目的,总为NULL
* open method -当对象句柄打开时被调用
* close method -当对象句柄关闭时被调用
* delete method -当对象句柄删除时被调用
* parse method -查询对象列表时被调用
* security method -读写保护的当前的对象时被调用
* query method -当线程查询对象名时调用
* \"ok to close\" -线程关闭句柄时调用

对象体的结构完全依靠对象类型,在DDK中只有很少部分的对象体结构被公开。如果你对这些结构感兴
趣,你可以使用google  或者查看chapeaux-noirs的主页(参见[4])


--- [ 2.3 对象操作

以用户模式的观点来看,对象操作只要是通过Windows API来执行。比如,为了访问文件对象,可以使
用 fopen()/open(),它们调用 CreateFile(). 我们转化到核心模式 (NtCreateFile())在ntoskrnl.exe
中调用IoCreateFile()。通过反编译IoCreateFile(),可以看见一些函数,比如:ObOpenObjectByName,
ObfDereferenceObject,……

(BTW:如果用在DDK站点(参见[2])下载的win2k symbols,只能看见这些函数,用支持Windows Symbols
文件的反编译器比如IDA/kd/Softice 因为这些函数没有被导出。)

每个函数都以Ob开头,表示同对象管理器相关。基本上,普通的开发者不必去处理这些对象,但我们要
去看看。

对于用户模式,所有的对象管理器相关函数都可以被ntdll.dll输出,这里有一些例子:
NtCreateDirectoryObject, NtCreateSymbolicLinkObject, NtDuplicateObject,
NtMakeTemporaryObject, NtOpenDirectoryObject, ...

有些函数在MSDN中公开了,但是多数没有。

如果你真想理解对象的工作方法,最好看看ntoskrnl.exe中导出的以Ob开头的函数。有21个导出函数,
其中6个是公开的。

如果你想看看其他15个的原型,去ntifs.h的主页(参见[3])或者去chapeaux-noirs站点(参见[4])。


--[ 3 - 介绍\\Device\\PhysicalMemory

为了查看对象信息,我们需要一个类似微软DDK中的核心调试工具。好,让我们现在开始……


Microsoft(R) Windows 2000 Kernel Debugger
Version 5.00.2184.1
Copyright (C) Microsoft Corp. 1981-1999

Symbol search path is: c:\\winnt\\symbols

Loading Dump File [livekd.dmp]
Full Kernel Dump File

Kernel Version 2195 UP Free
Kernel base = 0x80400000 PsLoadedModuleList = 0x8046a4c0
Loaded kdextx86 extension DLL
Loaded userkdx extension DLL
Loaded dbghelp extension DLL
f1919231 eb30 jmp f1919263
kd> !object \\Device\\PhysicalMemory
!object \\Device\\PhysicalMemory
Object: e1001240 Type: (fd038880) Section
ObjectHeader: e1001228
HandleCount: 0 PointerCount: 3
Directory Object: fd038970 Name: PhysicalMemory

从kd(kernel debugger)剖析基本对象告诉我们一些信息。不必解释所有内容的意义,他们中的大多数
都非常清楚只要你读了文章开头,如果没有,请\"jmp dword Introduction_to_Windows_Objects\"。

感兴趣的是,它是一个Section对象,清楚地表明我们要处理内存。现在我们要dump对象的头结构。
kd> dd e1001228 L 6
dd e1001228 L 6
e1001228 00000003 00000000 fd038880 12200010
e1001238 00000001 e1008bf8

details:
--> 00000003 : PointerCount = 3
--> 00000000 : HandleCount = 0
--> fd038880 : pointer to object type = 0xfd038880
--> 12200010 --> 10 : NameOffset
--> 00 : HandleDBOffset
--> 20 : QuotaChargeOffset
--> 12 : ObjectFlags = OB_FLAG_PERMANENT & OB_FLAG_KERNEL_MODE
--> 00000001 : QuotaBlock
--> e1008bf8 : SecurityDescriptor

NameOffset存在,不要惊讶,这个对象有一个名字……,但是没有HandleDBOffset。这意味着这个对象
不跟踪分配的句柄。QuotaChargeOffset并不有意思,ObjectFlags告诉我们这个对象是永久对象,并且被核
心创建。

到现在还没有非常有意思的东西……

dump这个对象的名字结构,只是确信我们没有走错方向 。 (记住偏移量是负数)

kd> dd e1001228-10 L3
dd e1001228-10 L3
e1001218 fd038970 001c001c e1008ae8

--> fd038970 : pointer to object Directory
--> 001c001c --> 001c : UNICODE_STRING.Length
--> 001c : UNICODE_STRING.MaximumLength
--> e1008ae8 : UNICODE_STRING.Buffer (pointer to wide char string)

kd> du e1008ae8
du e1008ae8
e1008ae8 \"PhysicalMemory\"

现在出现有意思的部分了,安全描述符:

kd> !sd e1008bf8
!sd e1008bf8
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8004
SE_DACL_PRESENT
SE_SELF_RELATIVE
->Owner : S-1-5-32-544
->Group : S-1-5-18
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x44
->Dacl : ->AceCount : 0x2
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x14
->Dacl : ->Ace[0]: ->Mask : 0x000f001f
->Dacl : ->Ace[0]: ->SID: S-1-5-18

->Dacl : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[1]: ->AceFlags: 0x0
->Dacl : ->Ace[1]: ->AceSize: 0x18
->Dacl : ->Ace[1]: ->Mask : 0x0002000d
->Dacl : ->Ace[1]: ->SID: S-1-5-32-544

->Sacl : is NULL

总之,这意味着\\Device\\PhysicalMemory对象有下面的权限:

user SYSTEM: Delete, Change Permissions, Change Owner, Query Data,
Query State, Modify State
user Administrator: Query Data, Query State

基本上,管理员用户没有权限写,但是SYSTEM可以,这实际上意味着管理员也可以做到!

一定注意到实际上这不象/dev/kmem!!在LINUX中/dev/kmem映射虚拟内存,\\Device\\PhysicalMemory
映射物理内存,本文更确切的标题应该是\"Playing with Windows /dev/mem\"因为/dev/mem映射物理内存,
但/dev/kmem听起来更熟悉些。

据我所知,在我写这篇文章的时候,Section对象体结构还没有解剖开,因此我们还不能分析它的结构。


----[ 3.2 需要“写”权限?

好,我们是用户administrator,并且打算玩玩感兴趣的对象,该怎么做呢?正如多数Windows管理员
所知,可以用schedule服务运行任何进程作为SYSTEM用户。如果你想确信你可以,只要启动schedule用
“net start schedule”并且去打开一个任务执行regedit.exe

c:\\>at <when> /interactive regedit.exe

之后可以试试看看SAM注册表,如果能查看,那么你SYSTEM用户,如果不能,你就仍旧是administrator
因为只有用户SYSTEM才拥有读的权力。

好,如果我们是administrator用户,但如果我们允许任何人写\\Device\\PhysicalMemory会发生什么
呢?(当然是为了学习的目的)

我们只要给这个对象添加另一个ACL,就可以了。按照下面的步骤:

1、打开\\Device\\PhysicalMemory句柄 (NtOpenSection)
2、找到它的安全描述符 (GetSecurityInfo)
3、在当前ACL中添加Read/Write授权 (SetentriesInAcl)
4、更新安全描述符 (SetSecurityInfo)
5、关闭先前打开的句柄

可以参考示例代码:chmod_mem.c

当运行了chmod_mem.exe,我们再一次dump\\Device\\PhysicalMemory的安全描述符。

kd> !object \\Device\\PhysicalMemory
!object \\Device\\PhysicalMemory
Object: e1001240 Type: (fd038880) Section
ObjectHeader: e1001228
HandleCount: 0 PointerCount: 3
Directory Object: fd038970 Name: PhysicalMemory
kd> dd e1001228+0x14 L1
dd e1001228+0x14 L1
e100123c e226e018
kd> !sd e226e018
!sd e226e018
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8004
SE_DACL_PRESENT
SE_SELF_RELATIVE
->Owner : S-1-5-32-544
->Group : S-1-5-18
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x68
->Dacl : ->AceCount : 0x3
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x24
->Dacl : ->Ace[0]: ->Mask : 0x00000002
->Dacl : ->Ace[0]: ->SID: S-1-5-21-1935655697-436374069-1060284298-500

->Dacl : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[1]: ->AceFlags: 0x0
->Dacl : ->Ace[1]: ->AceSize: 0x14
->Dacl : ->Ace[1]: ->Mask : 0x000f001f
->Dacl : ->Ace[1]: ->SID: S-1-5-18

->Dacl : ->Ace[2]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[2]: ->AceFlags: 0x0
->Dacl : ->Ace[2]: ->AceSize: 0x18
->Dacl : ->Ace[2]: ->Mask : 0x0002000d
->Dacl : ->Ace[2]: ->SID: S-1-5-32-544

->Sacl : is NULL

新的ACE(access-control entry)是Ace[0],拥有0x00000002权限(SECTION_MAP_WRITE)。需要更多
信息,可以查看MSDN中的Security win32 API [9]


--[ 4 - 玩转\\Device\\PhysicalMemory

为什么要来处理\\Device\\PhysicalMemory?我可以说用来读、写、修补内存。这已经足够了。


----[ 4.1 读写内存

我们开始吧……

为了读写\\Device\\PhysicalMemory,必须:

1、打开对象句柄 (NtOpenSection)
2、转化虚拟内存地址为物理地址
3、映射section到物理空间 (NtMapViewOfSection)
4、在被映射的内存中读写数据
5、关闭section的映射 (NtUnmapViewOfSection)
6、关闭对象句柄 (NtClose)

现在我们的主要目的是怎么转化虚拟内存地址为物理地址。我们知道在核心模式(ring0),有一个函
数 MmGetPhysicalAddress (ntoskrnl.exe)可以做到。但是我们现在在ring3,因此必须来“模拟”这个
函数。

---
from ntddk.h
PHYSICAL_ADDRESS MmGetPhysicalAddress(void *BaseAddress);
---

PHYSICAL_ADDRESS是quad-word (64 bits)的。原本打算在文章开头分析一下汇编代码,但是它太长
了。地址转化也很普通,我只想快点进行这个题目。

quad-word的低位被传递给eax,高位传递给edx。要转化虚拟地址到物理地址,可以有两种办法:

* case 0x80000000 <= BaseAddress < 0xA0000000:
我们唯一要做的只是提供一个0x1FFFF000掩码虚拟地址

* case BaseAddress < 0x80000000 && BaseAddress >= 0xA0000000
这种办法对于我们来说有点问题,因为我们并没有办法在这个范围转化地址,因为我们需要读cr3记
录或者运行非ring3可调用的汇编指令。需要更多信息,可参考Intel Software Developer\'s Manual
Volume 3 (see [5]).

EliCZ告诉我,以他的经验可以猜测一个物理地址偏移掩码,保留部分的索引。掩码:0xFFFF000

这是一个轻量级版本的MmGetPhysicalAddress()

PHYSICAL_MEMORY MyGetPhysicalAddress(void *BaseAddress) {
if (BaseAddress < 0x80000000 || BaseAddress >= 0xA0000000) {
return(BaseAddress & 0xFFFF000);
}
return(BaseAddress & 0x1FFFF000);
}

对于限定地址边界为[0x80000000, 0xA0000000]主要是这情况不能更成功地猜测正确。这就是为什么
如果你想更准确最好还是调用实际上的MmGetPhysicalAddress()。我们可以在一些章节中看到怎么做的。

请参考程序:See winkdump.c

使用winkdump之后,我意识到实际上还存在另外的问题。当转化0x877ef000以上的虚拟地址,物理地
址得到的结果是0x00000000077e0000以上,但在我的系统上根本不可能!

kd> dd MmHighestPhysicalPage l1
dd MmHighestPhysicalPage l1
8046a04c 000077ef

从上看出最后的物理页面定位在0x0000000077ef0000。这意味着我们只能dump一小片内存,但总之本
文的目的是为了得到更好的了解关于怎么用\\Device\\PhysicalMemory,而不只是做一个好的memory dumper。
虽然可dump的范围是ntoskrnl.exe 和 HAL.dll (Hardware Abstraction Layer)映射的区域,你仍然可以
做一些工具来dump系统调用表:

kd> ? KeServiceDescriptorTable
? KeServiceDescriptorTable
Evaluate expression: -2142852224 = 8046ab80

0x8046ab80是系统服务表结构,象这样的:

typedef struct _SST {
PDWORD ServiceTable; // array of entry points
PDWORD CounterTable; // array of usage counters
DWORD ServiceLimit; // number of table entries
PBYTE ArgumentTable; // array of byte counts
} SST, *PSST;


C:\\coding\\phrack\\winkdump\\Release>winkdump.exe 0x8046ab80 16
*** win2k memory dumper using \\Device\\PhysicalMemory ***

Virtual Address : 0x8046ab80
Allocation granularity: 65536 bytes
Offset : 0xab80
Physical Address : 0x0000000000460000
Mapped size : 45056 bytes
View size : 16 bytes

d8 04 47 80 00 00 00 00 f8 00 00 00 bc 08 47 80 | ..G...........G.

Array of pointers to syscalls: 0x804704d8 (symbol KiServiceTable)
Counter table : NULL
ServiceLimit : 248 (0xf8) syscalls
Argument table : 0x804708bc (symbol KiArgumentTable)

我们还没有dump248个系统调用地址,只是看了看类似这样的:

C:\\coding\\phrack\\winkdump\\Release>winkdump.exe 0x804704d8 12
*** win2k memory dumper using \\Device\\PhysicalMemory ***

Virtual Address : 0x804704d8
Allocation granularity: 65536 bytes
Offset : 0x4d8
Physical Address : 0x0000000000470000
Mapped size : 4096 bytes
View size : 12 bytes

bf b3 4a 80 6b e8 4a 80 f3 de 4b 80 | ..J.k.J...K.

* 0x804ab3bf (NtAcceptConnectPort)
* 0x804ae86b (NtAccessCheck)
* 0x804bdef3 (NtAccessCheckAndAuditAlarm)

在下面一节,我们会理解什么是callgate,以及我们同\\Device\\PhysicalMemory怎么用它们去解决
刚才地址转化的问题。


----[ 4.2 什么是 callgate

callgate是一种能让程序运行在比它实际权限更高权限下的机制。比如,ring3的程序可以去执行
ring0代码。

要创建一个callgate,必须指定:
1) 需要代码执行在什么ring等级
2) 当跳转到ring0时会被执行的函数地址
3) 传递给函数的参数

当callgate被访问的时候,处理器首先进行权限检查,保存当前的SS,ESP,CS,EIP寄存器,然后
加载segment selector和新的堆栈指针(ring0堆栈),从TSS到SS,EIP寄存器。这个指针就可以指到新
的ring0堆栈。SS和ESP寄存器被PUSH到堆栈中,参数被拷贝。CS和EIP(保存的)PUSH到堆栈中去调用程
序到新的堆栈。新的segment selector被加载用来处理从callgate被加载到CS和EIP中的新的代码片段和
指令指针。最后,它跳转到在创建callgate时候指定的函数地址。

一旦完成后,在ring0执行的函数必须清除自己的堆栈,这就是为什么我们在代码中定义函数的时候
要用_declspec(naked)(MS VC++ 6) (类似GCC中的__attribute__(stdcall))

---
from

--------------------------------------------------------------------------------
相关信息:

如何在windows程序中读取bios内容(物理内存内容) (5千字)(火翼[CCG] 3-2 2:13 阅读 502)
中国的Cracker水平开始提高技术了 !! Toye快放 \"精\" !! (空)(WinDos2K 3-2 6:17 阅读 17)
老兄的写文速度真是惊人!佩服佩服! (空)(夜月 3-2 8:18 阅读 2)
火翼兄强,学习仰慕中 (空)(呆呆豆 3-2 9:37 阅读 1)
好东西,收藏哦! (空)(doskey 3-2 10:53 阅读 2)
98下不知是什么结果?待试。 (空)(ircbox 3-2 11:45 阅读 1)
98下面可以进入ring0去读取 (空)(lllaaa[BCG] 3-2 13:22 阅读 4)
98下没有这几个api(准确地说是只有个空壳),进入ring0读取就好了 (空)(火翼[CCG] 3-2 13:51 阅读 2)
Cool! (空)(Nnewell 3-2 11:54 阅读 0)
以上的代码有毛病,我今天test一天了,MSDN里头说要在passive_level下面才能执行成功! (72字)(夜月 3-2 15:22 阅读 22)
没有什么问题啊, (104字)(pll621 3-2 15:26 阅读 39)
能不能把你的程序发给我?我看看。我用的masm23,OpenSection的时候总是返回80000002h (17字)(夜月 3-2 16:00 阅读 4)
我的是vc写的,你要么? (空)(pll621 3-2 16:43 阅读 0)
读出来的东西确实是f000:0000的内容,在我的机器上好像每次的一样,没仔细比较 (77字)(火翼[CCG] 3-2 16:00 阅读 16)
贴段98下相同功能的代码 (1千字)(pll621 3-2 16:03 阅读 132)
大家通报一声,测试BIOS ID,BIOS DATE是否偏移地址是固定的。 (250字)(ircbox 3-2 16:36 阅读 26)
yes (1千字)(pll621 3-2 16:41 阅读 69)
我的系统:Win2000 Server。 (空)(夜月 3-2 17:20 阅读 0)
我的Win32Asm源代码,死活不正确! (1千字)(夜月 3-2 17:18 阅读 67)
哪位帮忙看看怎么会不对呢?火翼的程序在我机器上执行完全正常。 (空)(夜月 3-2 17:21 阅读 0)
不错 (1千字)(bbbsl 3-2 17:27 阅读 57)
例程和源代码下载见内 (37字)(火翼[CCG] 3-2 16:45 阅读 117)
哪位老大能不能帮忙看看为什么我的ASM代码不正确? (87字)(夜月 3-2 22:31 阅读 13)
我这几天有点忙,不一定有时间,你发个可执行文件过来吧,我找时间看一下 (54字)(火翼[CCG] 3-2 23:43 阅读 5)
一个字“强!!!!!!!!!!”。 (32千字)(柯南[CCG] 昨天13:38 阅读 99)
接! (34千字)(柯南[CCG] 昨天13:40 阅读 49)
接 (18千字)(柯南[CCG] 昨天13:42 阅读 44)
接 (2千字)(柯南[CCG] 昨天13:44 阅读 50)
好文章!收藏研究!火翼兄,我已经把可执行文件发到你的邮箱,用S-ice跟一下即可 (223字)(夜月 昨天14:55 阅读 5)
英文版 http://www.phrack-dont-give-a-shit-about-dmca.org/phrack/59/p59-0x10.txt (空)(WinDos2K 昨天15:44 阅读 17)

--------------------------------------------------------------------------------
发布响应:
  响应信息前,请确认您发表的信息符合中华人民共和国法律法规、本站规定,并符合本论坛的主题。
声明:
小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-04-26 13:08
这个是  火翼[CCG]   的 例子

//write By 火翼[CCG]
// biossave.cpp : 定义应用程序的入口点。
//
#include \"stdafx.h\"
#include \"biossave.h\"
#define MAX_LOADSTRING 100

//write By 火翼[CCG]
typedef struct _UNICODE_STRING {
  USHORT  Length;//长度
  USHORT  MaximumLength;//最大长度
  PWSTR  Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串\"\\device\\physicalmemory\"
} UNICODE_STRING,*PUNICODE_STRING;


//write By 火翼[CCG]
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);


//write By 火翼[CCG]
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名


//write By 火翼[CCG]
// 此代码模块中包含的函数的前向声明:
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  // TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
UNICODE_STRING struniph;
OBJECT_ATTRIBUTES obj_ar;
ZWOS ZWopenS;
ZWMV ZWmapV;
ZWUMV ZWunmapV;
HANDLE hSection;
HMODULE hinstLib;
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\";
FILE *f1;

//write By 火翼[CCG]

// 初始化全局字符串
//变量初始化
    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,(HANDLE)0xffffffff,&ba,0,0xffff,&so,&ssize,1,0,2);
    f1=fopen(\"bios.mem\",\"wb+\");
fwrite((void*)ba,65536,1,f1);
fclose(f1);
MessageBox(NULL,\"Bios saved to bios.mem!\",\"Save OK\",MB_OK);
return 0;

}
//write By 火翼[CCG]


小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-27 14:27
老兄这篇文章是在什么论坛上?
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-27 16:23
                              新来的客人想发言必须注册!请点击此处!  


原有信息:
序 号:257109
标 题:一个字“强!!!!!!!!!!”。 (32千字)
发信人:柯南[CCG]
时 间:2003-3-3 13:38:34
阅读次数:99
详细信息:

朋友的水平,真是另人刮目相待,读了这片文章有醍醐灌顶之感。遗憾的是有写地方我能力有限,没有看透,呵呵(笑..........)。
.....


转错了阿,完全不相干 :)
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-28 09:14
存储CMOS当前状态,然后执行读写操作,最后恢复。地址为0x70,数据为0x71,难道还有比这更简单的吗?
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
游客

返回顶部