首页
社区
课程
招聘
破解CMOS密码
发表于: 2006-5-11 21:43 10991

破解CMOS密码

2006-5-11 21:43
10991

想起论坛前段时间讨论过在NT内核下无法用DEBUG的方式破解,把自己知道的一点东西拿出来共享。其实问题的关键是一个Native API的使用。与其我在这里解释一知半解的原理,还不如让大家先看看原文是如何写。

     没有什么技术含量,只是把两篇文章的代码综合一下。


#include<stdio.h>
#include<windows.h>

char passwd[9];
char decode[9];

typedef int NTSTATUS;
typedef enum _SYSDBG_COMMAND
{
	SysDbgSysReadIoSpace = 14,
		SysDbgSysWriteIoSpace = 15
}SYSDBG_COMMAND, *PSYSDBG_COMMAND;

typedef NTSTATUS (NTAPI * PZwSystemDebugControl) 
	(
	SYSDBG_COMMAND ControlCode,
	PVOID InputBuffer,
	ULONG InputBufferLength,
	PVOID OutputBuffer,
	ULONG OutputBufferLength,
	PULONG ReturnLength
	);
PZwSystemDebugControl ZwSystemDebugControl = NULL;

typedef struct _IO_STRUCT
{
	DWORD IoAddr;       // IN: Aligned to NumBYTEs,I/O address
	DWORD Reserved1;    // Never accessed by the kernel
	PVOID pBuffer;      // IN (write) or OUT (read): Ptr to buffer
	DWORD NumBYTEs;     // IN: # BYTEs to read/write. Only use 1, 2, or 4.
	DWORD Reserved4;    // Must be 1
	DWORD Reserved5;    // Must be 0
	DWORD Reserved6;    // Must be 1
	DWORD Reserved7;    // Never accessed by the kernel
}
IO_STRUCT, *PIO_STRUCT;

BOOL EnablePrivilege (PCSTR name)
{
	HANDLE hToken;
	BOOL rv;
	
	TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
	LookupPrivilegeValue (0,name,&priv.Privileges[0].Luid);
	OpenProcessToken(GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES,&hToken);
	AdjustTokenPrivileges (hToken,FALSE,&priv,sizeof priv,0,0);
	rv = GetLastError () == ERROR_SUCCESS; 
	CloseHandle (hToken);
	return rv;
}

BYTE InPortB (int Port)
{
	BYTE Value;
	IO_STRUCT io;
	
	io.IoAddr = Port;
	io.Reserved1 = 0;
	io.pBuffer = (PVOID) (PULONG) & Value;
	io.NumBYTEs = sizeof (BYTE);
	io.Reserved4 = 1;
	io.Reserved5 = 0;
	io.Reserved6 = 1;
	io.Reserved7 = 0;
	
	ZwSystemDebugControl(SysDbgSysReadIoSpace,&io,sizeof(io),NULL,0,NULL);
	return Value;
}

void OutPortB (int Port, BYTE Value)
{
	IO_STRUCT io;
	
	io.IoAddr = Port;
	io.Reserved1 = 0;
	io.pBuffer = (PVOID) (PULONG) & Value;
	io.NumBYTEs = sizeof (BYTE);
	io.Reserved4 = 1;
	io.Reserved5 = 0;
	io.Reserved6 = 1;
	io.Reserved7 = 0;
	
	ZwSystemDebugControl(SysDbgSysWriteIoSpace,&io,sizeof (io),NULL,0,NULL);
}

int main()
{
	HMODULE	hNtdll;
	int	count = 0;
	UINT	uData  = 0;

	EnablePrivilege (SE_DEBUG_NAME);	
	hNtdll = LoadLibrary ("ntdll.dll");
	if(hNtdll == NULL)
		{
		printf("Load ntdll.dll error!!\n");
		return 0;
		}

	ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl");
	if(ZwSystemDebugControl == NULL)
		{
		printf("Load ZwSystemDebugControl function error!\n");
		return 0;
		}
	//读写端口
	OutPortB(0x70,29);
	uData = InPortB(0x71);
	OutPortB(0x70,28);
	uData = (uData<<8)+InPortB(0x71);
	//计算hash值
	while (uData>0)   //将原始数据转换为有效数据
		{      
		if(uData<0x80)
			{
			passwd[count]=uData;
			break;
			}
		else	{
			unsigned char temp=uData&0x3f;
			if(temp<=0x20)	
				temp|=0x30;	
			passwd[count++]=temp;
			uData-=temp;
			uData>>=2;
			}
		}
	for(int i=0;count>=0;i++)      //将得到的CMOS密码输出
		decode[i]=passwd[count--];
	//输出密码
	printf("The CMOS's password:%s\n",decode);
	return 1;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果不知道cmos password.根本启动不了。
请讲该代码运行的条件。
2006-5-11 22:07
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
关键是是否能得到设定好的CMOS密码?
2006-5-11 22:31
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
最初由 sixL 发布
如果不知道cmos password.根本启动不了。
请讲该代码运行的条件。

现在所说的破解CMOS密码都在在本机启动以后,运行查看。我想这个是默认的条件吧...
2006-5-11 22:36
0
雪    币: 221
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
在我的电脑上面运行结果不正确...


我的CMOS密码为iambest,但是程序输出为上图所示
2006-5-11 22:39
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
最初由 gdimk 发布
关键是是否能得到设定好的CMOS密码?

我想这个不太可能,因为在CMOS中只是保存了密码的HASH值,能得到一样的HASH值是这个代码的目标,而不是说一定要找到原密码...这几乎是不可能的。
2006-5-11 22:39
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
最初由 vlit 发布
在我的电脑上面运行结果不正确...


我的CMOS密码为iambest,但是程序输出为上图所示

你可以去看看用这个密码能不能进入计算机
2006-5-11 22:40
0
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
偶尔看到用已知的覆盖原密码。
2006-5-11 22:46
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
最初由 sixL 发布
偶尔看到用已知的覆盖原密码。

不太理解... 没有覆盖呀
2006-5-11 22:50
0
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
著名厂家的主板有缺省的密码。
有篇E文的PDF文件,讲这方面的内容,如果有权限我会贴上来。
2006-5-11 23:13
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
我的意思好象完全被曲解了....
2006-5-12 10:12
0
雪    币: 221
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 Lenus 发布
你可以去看看用这个密码能不能进入计算机


我去试试
明天再来答复
2006-5-12 13:25
0
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 Lenus 发布
我的意思好象完全被曲解了....

我没有表达清楚。
1. 如果忘记CMOS密码,要么用缺省的密码进入;要么到厂家重新写入BIOS。(系统未启动)
2. <<Guide to Award BIOS Patching>>PDF文件讲的是如何用已知的密码覆盖原密码。(系统已启动,原密码为别人设。当然针对已知BIOS,不能统吃。)

该摊子不能附加文件,多有不便。
2006-5-12 20:07
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
最初由 sixL 发布
要么到厂家重新写入BIOS。(系统未启动)
2. <<Guide to Award BIOS Patching>>PDF文件讲的是如何用已知的密码覆盖原密码。(系统已启动,原密码为别人设。当然针对已知BIOS,不能统吃。)

还是不明白,厂家重新写入BIOS?!我的做法一般是放电

既然,已经启动了,那么就用这个程序。把密码得到,如果你觉得这个密码不好记忆,你再去修改就行了。还那么麻烦干什么呢?
2006-5-12 20:57
0
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
1."放电"能统吃?
2.解自己知道的密码好玩吗?

我猜:如果能覆盖密码,也是远程执行(expliot),悄悄地。
2006-5-12 21:21
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 sixL 发布
我没有表达清楚。
1. 如果忘记CMOS密码,要么用缺省的密码进入;要么到厂家重新写入BIOS。(系统未启动)
2. <<Guide to Award BIOS Patching>>PDF文件讲的是如何用已知的密码覆盖原密码。(系统已启动,原密码为别人设。当然针对已知BIOS,不能统吃。)

该摊子不能附加文件,多有不便。


你还是没能理解楼主的意思呀
呵呵
2006-5-12 21:22
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
最初由 sixL 发布
1."放电"能统吃?
2.解自己知道的密码好玩吗?

1.虽然我不很了解,但是我武断的说,能通吃。
2.解自己的密码还行,至少比解别人的安全。我这篇文章关键是要提醒大家能用api访问端口....
2006-5-12 21:45
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
放电都不能通吃的话要怎么搞才算是通吃?
2006-5-13 15:27
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习了..................
2006-5-15 23:44
0
游客
登录 | 注册 方可回帖
返回
//