☆ pwdump2/samdump.c浅析与改进
samdump.c调用LsaQueryInformationPolicy()获取主机SID,未调用LsaFreeMemory()
释放内存,造成lsass.exe进程空间的内存泄漏。此外,需要引入advapi32.lib。
samdump.c中有一个RegCloseKey()操作,可能最初直接读取注册表,后因LM Hash、
NTLM Hash加密存放,才改用samsrv.dll引出的未公开(文档化)函数。
我重写了pwdump2,主要是配合前段时间samsrv.dll的逆向工程,将一些猜测性结论
加以验证,或推翻或肯定。参getlmhashdll.c源代码,将整个流程减化、抽象一下:
--------------------------------------------------------------------------
SamIConnect
SamrEnumerateDomainsInSamServer
SamrLookupDomainInSamServer
SamrOpenDomain
SamrEnumerateUsersInDomain
SamrOpenUser
SamrQueryInformationUser
SamIFree_SAMPR_USER_INFO_BUFFER
SamrCloseHandle
SamIFree_SAMPR_ENUMERATION_BUFFER
SamrCloseHandle
LocalFree
SamIFree_SAMPR_ENUMERATION_BUFFER
SamrCloseHandle
--------------------------------------------------------------------------
SamrEnumerateDomainsInSamServer、SamrLookupDomainInSamServer是Todd Sabin未
曾用到的samsrv.dll引出函数,用以代替LsaQueryInformationPolicy,其实我演示
的这个方法才是正经的SAM操作方法。我的意思是,要用未文档化的函数,就都用好
了。
使用LsaQueryInformationPolicy的话,就不必使用SamrEnumerateUsersInDomain,
理念换成"尽量使用文档化的函数",用NetUserEnum枚举帐号。
相比samdump.c,没有其它改进,Todd Sabin已经完成了必要的Hacking。
--------------------------------------------------------------------------
/*
* (C) Todd Sabin 1997,1998,2000 All rights reserved.
* -----------------------------------------------------------------------
* Rewrite : scz <scz@nsfocus.com>
* : http://www.nsfocus.com
* Version : 1.10
* Compile : For x86/EWindows XP SP1 & VC 7
* : cl getlmhashdll.c /nologo /Os /G6 /W3 /D "WIN32" /D "NDEBUG" /LD /link /RELEASE
* :
* Create : 2003-12-29 21:42
* Modify : 2004-01-04 17:26
* -----------------------------------------------------------------------
* The only thing they can't take from us are our minds. !H
*/
/************************************************************************
* *
* Head File *
* *
************************************************************************/
/*
* #define _WIN32_WINNT 0x0501
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* for _vsnprintf()
*/
#include <stdarg.h>
#include <windows.h>
/************************************************************************
* *
* Macro *
* *
************************************************************************/
#pragma comment( linker, "/INCREMENTAL:NO" )
#pragma comment( lib, "kernel32.lib" )
#define VERSION "1.10"
/*
* you'll find a list of NTSTATUS status codes in the DDK header
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
*/
typedef LONG NTSTATUS;
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L)
#define SamUserOWFPasswordInformation 0x12
#pragma pack( push, 1 )
/*
* ntdef.h
*/
typedef struct _UNICODE_STRING
{
USHORT Length; // +0x000
USHORT MaximumLength; // +0x002
PWSTR Buffer; // +0x004
// +0x008
} UNICODE_STRING, *PUNICODE_STRING;
/*
* !!!
* from Luke Kenneth Casson Leighton
*/
typedef struct _SAM_DOMAIN_USER
{
DWORD userrid; // +0x000
UNICODE_STRING username; // +0x004,这是一个结构,而非结构指针
// +0x00c,该结构总共占12字节
} SAM_DOMAIN_USER, *PSAM_DOMAIN_USER;
/*
* !!!
* (C) Todd Sabin 1997,1998,2000 All rights reserved.
*/
typedef struct _SAM_DOMAIN_USER_ENUMERATION
{
DWORD DomainUserCount; // +0x000,数组元素个数
PSAM_DOMAIN_USER DomainUser; // +0x004,动态分配空间的结构数组
// +0x008,后面还有没有成员,目前看不出来
/*
* ... ...
*/
} SAM_DOMAIN_USER_ENUMERATION, *PSAM_DOMAIN_USER_ENUMERATION, **PPSAM_DOMAIN_USER_ENUMERATION;
/*
* 自己Hacking得到的结构,不可靠
*/
typedef struct _SAM_USER_OWF_PASSWORD_INFORMATION // Information Class 0x12
{
unsigned char NTLMHash[16]; // +0x000,16字节的NTLM Hash
unsigned char LMHash[16]; // +0x010,16字节的LM Hash
unsigned short int Unknown_020; // +0x020,参samsrv!SampGetCurrentAdminPassword()
unsigned char Unknown_022; // +0x022
// +0x023
} SAM_USER_OWF_PASSWORD_INFORMATION, *PSAM_USER_OWF_PASSWORD_INFORMATION;
typedef struct _SAM_SERVER_DOMAIN
{
DWORD unused; // +0x000,未使用,总为0(猜测)
UNICODE_STRING domainname; // +0x004,这是一个结构,而非结构指针
// +0x00c,该结构总共占12字节
} SAM_SERVER_DOMAIN, *PSAM_SERVER_DOMAIN;
typedef struct _SAM_DOMAIN_ENUMERATION
{
DWORD ServerDomainCount; // +0x000,数组元素个数
PSAM_SERVER_DOMAIN ServerDomain; // +0x004,动态分配空间的结构数组
// +0x008,后面还有没有成员,目前看不出来
/*
* ... ...
*/
} SAM_SERVER_DOMAIN_ENUMERATION, *PSAM_SERVER_DOMAIN_ENUMERATION, **PPSAM_SERVER_DOMAIN_ENUMERATION;
#pragma pack( pop )
/*
* 这些Undocumented Win32 API由samsrv.dll引出(export)
*/
typedef NTSTATUS ( WINAPI *SAMICONNECT )
(
DWORD Unknown_0, // 意义不明,调用时一般为0
PHANDLE pSamHandle, // [out]参数,是指向HANDLE的指针,不是HANDLE
DWORD AccessMask, // Access Mask
DWORD Unknown_1 // 意义不明,调用时一般为1
);
typedef NTSTATUS ( WINAPI *SAMROPENDOMAIN )
(
HANDLE SamHandle, // 源自sam connect操作
DWORD AccessMask, // Access Mask
PSID DomainSid, // 这个域不是通常所说NT域
PHANDLE pDomainHandle // [out]参数,是指向HANDLE的指针,不是HANDLE
);
typedef NTSTATUS ( WINAPI *SAMROPENUSER )
(
HANDLE DomainHandle, // 源自sam open domain操作
DWORD AccessMask, // Access Mask
DWORD Rid, // 比如500,0x1F4,Administrator
PHANDLE pUserHandle // [out]参数,是指向HANDLE的指针,不是HANDLE
);
typedef NTSTATUS ( WINAPI *SAMRQUERYINFORMATIONUSER )
(
HANDLE UserHandle, // 源自sam open user操作
DWORD InfoClass, // 其实是SAM_USER_INFORMATION_CLASS枚举型,为
// 了减少编译难度,换成DWORD型
PVOID UserInfo // 随InfoClass不同,对应不同的结构
);
typedef VOID ( WINAPI *SAMIFREE_SAMPR_USER_INFO_BUFFER )
(
PVOID UserInfo, // 随InfoClass不同,对应不同的结构
DWORD InfoClass // 其实是SAM_USER_INFORMATION_CLASS枚举型,为
// 了减少编译难度,换成DWORD型
);
typedef NTSTATUS ( WINAPI *SAMRCLOSEHANDLE )
(
PHANDLE pHandle // 可以关闭各种sam操作相关的句柄
// 是指向HANDLE的指针,不是HANDLE
);
typedef NTSTATUS ( WINAPI *SAMRENUMERATEUSERSINDOMAIN )
(
HANDLE DomainHandle, // 源自sam open domain操作
PHANDLE pEnumerationHandle, // [in/out]参数,Resume Handle
// 是指向HANDLE的指针,不是HANDLE
pwdump2samdump.c.rar_pwdump_samdump
版权申诉
70 浏览量
2022-09-19
13:08:50
上传
评论
收藏 9KB RAR 举报
邓凌佳
- 粉丝: 65
- 资源: 1万+
最新资源
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
- multiled.zip
- 基于php实现的哈希算法的人脸检索
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈