一种从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法

文档序号:10534577阅读:846来源:国知局
一种从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法
【专利摘要】本发明的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,包括:a).获取系统版本信息;b).获取lsass.exe进程的CR3寄存器、进程环境块中PEB结构变量的值;c).将动态链接库lsasrv.dll和tspkg.dll的执行样本转储出来;d).获取密钥相关数据;e).从lsasrv.dll中获取用户信息;f).从tspkg.dll的转储文件中获取登录用户主凭证;g).获取密码明文。本发明的获取已登录用户密码明文的方法准确、高效,分析效果不受密码复杂度的影响,是从物理内存镜像文件中获取用户登录信息的重要手段,获取的已登录用户密码明文是计算机在线取证中的一种重要证据。
【专利说明】
—种从64位W i n d ows操作系统的内存镜像文件中获取已登录用户密码明文的方法
技术领域
[0001]本发明涉及一种获取已登录用户密码明文的方法,更具体的说,尤其涉及一种从64位Windows操作系统的内存镜像文件中获取已登陆用户的密码明文的方法。本方法将应用于计算机取证领域,主要用于信息安全事件和各类计算机犯罪案件的调查取证。
【背景技术】
[0002]计算机物理内存中存在某些能描述系统遭受攻击时所处状态的信息,如当前运行的进程信息、进程加载的动态链接库信息、系统当前登录的用户名称及用户密码、打开的文件信息、网络连接信息等。这些信息随着计算机系统的关机而消失,无法作为证据进行保存。因此,对获取计算机物理内存在计算机取证方面尤为重要。为推进物理内存分析技术的发展,DFRWS(Digital Forensic Research Workshop)于2005年推出了名为 “ForensicsChallenge”的活动,活动的主题就是物理内存分析。从此,对于物理内存的分析和获取成为计算机取证研究热点,然而,当用户登录到计算机系统中时,其密码是以密文的方式存储的,我们能够通过内存分析获取其对应的NThash值或者LM哈希值,对于密码明文的获取,需要借助于SamInside等相关解密软件才能完成,但是对于复杂度较高的密码,解密软件所需时间也会相应较长。随着计算机硬件水平的不断发展提高,目前大多数计算机都具备4G以上内存空间,并支持64位操作系统,而且随着目前64位WindowslO系统的免费升级,使用高版本Windows操作系统的用户越来越多,因此对64位windows操作系统的内存镜像文件分析工作迫在眉睫。

【发明内容】

[0003]本发明为了克服上述技术问题的缺点,提供了一种从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法。
[0004]本发明的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,通过以下步骤来实现:
a).获取系统版本信息,采用基于KPCR结构的物理内存分析方法,从当前内存镜像文件中获取包括主版本号、次版本号、内部版本号在内的操作系统版本信息;b).获取lsass.exe进程的C R 3寄存器内容,进程环境块中P E B结构变量的值;c ).转储执行样本,获取lsass.exe加载的动态链接库链表,将动态链接库lsasrv.dll和tspkg.dll在内存镜像文件中的执行样本转储出来;d).获取密钥相关数据,从lsasrv.dll的转储文件中获取包括Initialzat1nVector值、hAesKey值、h3DesKey值在内的密钥相关数据;e).获取登录数量和信息,从lsasrv.dll中获取登录会话列表的数量和登录会话列表中用户信息;f).获取主凭证,从tspkg.dll的转储文件中,获取当前登录用户主凭证;g).获取密码明文,加载动态链接库nCryt.dll,借助步骤d)中获取的密钥相关数据,对步骤f)中所获取的主凭证中密文进行解密,获取登录用户密码明文。
[0005]本发明的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,步骤c)所述的转储执行样本通过以下方法来实现:
C-1).获取变量Ldr,从I sasS.exe进程PEB结构体中获取变量Ldr,Ldr变量指向了进程加载的所有动态链接库结构的链表结构;c-2).遍历变量Ldr所指向的链表结构,判断每个动态链接库的名称与需要寻找的lsasrv.dll或tspkg.dll是否相同,如果存在相同,则获得相应动态链接库的起始虚拟地址、长度变量,并根据这两个变量把动态链接库在内存镜像文件中的执行样本转储出来。
[0006]本发明的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,步骤e)所述的获取登录数量和信息通过以下方法来实现:首先对动态链接库进行反汇编,在动态链接库中找到函数LsapCreateLsaLogonSess 1n,查看该函数的反汇编代码,获取变量LogonSess1nListConut和LogonSess1nList的值;然后通过变量LogonSess1nLi stConut获取登录会话列表的数量,从变量LogonSess1nLi st所指向的双向链表结构体中获取登录会话列表中用户信息。
[0007]本发明的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,步骤f)所述的获取主凭证通过以下步骤来实现:
f-Ι).从与内存镜像文件相同操作系统版本的计算机文件夹X:\Windows\System中找出动态链接库tspkg.dll,X表示系统盘,并对动态链接库tspkg.dll进行反汇编,以找到函数TSUnloadCredTable;f_2).在TSUnloadCredTable函数体中找到变量TSGlobalCredTable的存放位置;f-3).查看变量TSGlobalCredTable存放位置所存储的二进制数据,以此二进制数据为特征码,到Isasry.dll转储文件中搜索此特征码;f-4).特征码在Isasry.dll文件中被搜索到后,其存储位置即为变量TSGlobalCredTable在tspkg.dl I内存转储文件中的相对偏移地址,设该偏移地址为TSGlobalTabOffset; f-5).通过如下公式计算变量TSGlobalCredTab Ie 的虚拟地址 TSGlobalTabVa:
TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I)
其中,tspkgVa是动态链接库tspkg.dl I在lsass.exe中加载的动态链接库虚拟地址,sizeof(ULONG)为求取数据类型ULONG的字节数;
然后使用lsassCR3Val对TSGlobalTabVa进行虚拟地址到物理地址转换,得到变量TSGlobalCredTable 在内存镜像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE结构;lsassCR3Val为步骤b)中获取的lsass.exe进程的CR3寄存器的内容;f_6).RTL_AVL_TABLE结构是一个平衡二叉树,定位到TSGlobalCredTable的物理地址,从RTL_AVL_TABLE结构树根的孩子开始遍历该树;f-7).在遍历RTL_AVL_TABLE结构树的过程中,读取树中变量OrderedPoointer的值,该值是KIWI_TS_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,并在内存镜像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL结构;f_8).找到结构KIWI_TS_CREDENTIAL中变量LocallyUniqueIdentif ier的值,该变量存放的是用户的LUID,若已登录用户的LUID与当前KIWI_TS_CREDENTIAL结构中用户LUID相同,则执行步骤f-9),否则回到步骤f-6)继续遍历二叉树的左孩子和右孩子;f-9).找到结构KIWI_TS_CREDENTIAL中变量pTsPrimary ,pTsPrimary指向KIWI_TS_PRMARY_CREDENTIAL,该结构体存放的是用户的主凭证,读取变量pTsPrimary的值,该值是KIWI_TS_PR頂ARY_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,在内存镜像文件中定位到物理地址找到此结构;f-1o).找到结构 KIWI_TS_PRMARY_CREDENTIAL 中变量 credentials ,credentials中存放的是当前用户的用户名、域名和密文;其中,用户名、域名和密文都是以UNICODE方式存放在物理内存镜像文件中的,根据UNICODE结构体的定义,获取出密文当前长度Len、最大长度MaxLen及在物理内存中的虚拟地址,并将虚拟地址转换为物理地址,到内存镜像文件中定位到该物理地址;f-11).根据步骤f-ΙΟ)中获取的物理地址在内存镜像文件中读取长度为Len的数据到存储空间cry P tBuf f er中,对密文解密后即获取已登录用户密码的明文。
[0008]本发明的有益效果是:(I)本发明所公开的64位windows操作系统的内存镜像文件中已登录用户密码明文的获取方法分析方法准确、高效;(2)本发明所公开的64位windows操作系统的内存镜像文件中已登录用户密码明文的获取方法对密码明文的分析效果不受密码复杂度的影响。(3)本发明所公开的64位windows操作系统的内存镜像文件中已登录用户密码明文的获取方法是从物理内存镜像文件中获取用户登录信息的重要手段。(4)本发明所公开的64位windows操作系统的内存镜像文件中已登录用户密码明文的获取方法分析方法获取的已登录用户密码明文是计算机在线取证中的一种重要证据。
【附图说明】
[0009]图1为本发明的内存镜像文件中获取已登录用户密码明文方法的流程图;
图2给出了本发明中获取密钥内容的结构关系图;
图3为本发明中从tspkg.dll中获取主凭证流程图。
[0010]图4为本发明中从tspkg.dll获取主凭证结构关系图;
图5为本发明反汇编出的LsalnitializeProtectedMemory函数的部分截图。
【具体实施方式】
[0011]下面结合附图与实施例对本发明作进一步说明。
[0012]如图1所示,给出了本发明的从64位windows操作系统的内存镜像文件中获取已登录用户密码明文获取方法的流程图,其按照“获取操作系统版本一一获取lsass.exe进程结构体一一获取密钥一一获取凭证一一解密密文”的流程来进行。由于进程通过其加载的动态链接库执行所需功能,因此,可通过分析执行登录认证功能的进程加载的动态链接库进行解密工作。如图1所示,本发明的从64位windows操作系统的内存镜像文件中获取已登录用户密码明文的获取方法,首先要获取操作系统版本,在不同操作系统版本的内存镜像文件中,其密文及解密密文所需的数据在相关动态链接库中存放位置各不相同,因此需要先判断出操作系统版本。然后从内存镜像文件中转储当前运行的lsass.exe进程加载的lsasrv.dll和tspkg.dll链接库的样本文件。最后根据从样本文件中分析出的信息,通过加载动态链接库的方式解密主凭证中存在的密文,从而获取登录用户的密码明文。其具体通过以步骤来实现:
a).获取系统版本信息,采用基于KPCR结构的物理内存分析方法,从当前内存镜像文件中获取包括主版本号、次版本号、内部版本号在内的操作系统版本信息;
b).获取lsass.exe进程的CR3寄存器内容,进程环境块中PEB结构变量的值;
c).转储执行样本,获取lsass.exe加载的动态链接库链表,将动态链接库I sasrv.dl I和tspkg.dll在内存镜像文件中的执行样本转储出来; d)?获取密钥相关数据,从I sasrv.dll的转储文件中获取包括Ini tialzat 1nVector值、hAesKey值、h3DesKey值在内的密钥相关数据;
e).获取登录数量和信息,从lsasrv.dll中获取登录会话列表的数量和登录会话列表中用户信息;
f).获取主凭证,从tspkg.dll的转储文件中,获取当前登录用户主凭证;
g).获取密码明文,加载动态链接库nCryt.dll,借助步骤d)中获取的密钥相关数据,对步骤f)中所获取的主凭证中密文进行解密,获取登录用户密码明文。
[0013]步骤a)中所述的获取系统版本信息的具体步骤为:a_l).根据操作系统kpcr结构体特征,对内存镜像文件进行搜索,找到kpcr结构体在内存镜像文件中的位置;a-2).获取系统进程CR3寄存器内容。CR3寄存器的内容是在系统空间内进行系统转换的基础。对于64位操作系统来说,CR3寄存器的内容在kpcr结构体的偏移OxlDO处,从此处读取8个字节的数据,即是CR3寄存器的内容。a-3).获取当前线程的虚拟地址。对于不同版本操作系统来讲,当前线程的虚拟地址存放在kpcr结构体的偏移值各不相同,对于64位Windows 8以上版本的操作系统来说,该偏移值是0x188,从此处读取8个字节的数据,即是当前线程的虚拟地址。a-4).根据当前线程的结构体,获取当前进程结构体的虚拟地址和物理地址。以64位windows 8.1为例,当前线程的虚拟地址+0xb8,即是当前进程的虚拟地址。使用步骤a_2)所获得的系统进程CR3寄存器的值进行地址转换,将虚拟地址转换为物理地址,定位到该物理地址处,便是当前进程的EPR0CESS结构体的起始位置。a-5).在进程EPR0CESS结构体中,存放了名为Peb的变量,该变量指向_PEB结构体,该结构体中存放了操作系统主版本号、次版本号和内部版本号。以64位windows 8.1为例,在当前进程EPR0CESS结构体的起始位置的偏移0x3e8处是变量peb的值,即结构体_PEB的虚拟地址,将该虚拟地址转换为物理地址,得到_PEB结构体的起始位置,定位到该位置,在偏移0x118处存放的是操作系统主版本号,0x11 c处存放了小版本号,0x120处存放了内部版本号。
[0014]步骤b)中所述获取lsass.exe进程的CR3寄存器内容,进程环境块peb变量的具体步骤是:b-Ι).根据当前进程EPR0CESS结构体,遍历进程链。在步骤a-4)中,获得了当前进程的EPR0CESS结构体的起始位置,EPR0CESS结构体中,存放了指向下一进程的EPR0CESS结构体的指针。b-2).沿着该指针开始遍历进程链,当进程名称为lsass.exe时,获取该进程的peb变量值及CR3寄存器内容(定义为lsassCR3Val) DWeMiwindows 8.1为例,在EPR0CESS结构体偏移0x28处,读取8个字节的数据即是lsassCR3Val的值。
[00?5] 步骤c)中所述获取lsass.exe加载的动态链接库链表,转储lsasrv.dll和tspkg.dll在内存镜像文件中的执行样本的具体步骤是:c-Ι).在I sas s.exe进程_PEB结构体中,存放了变量Ldr,该变量指向了进程加载的所有动态链接库结构的链表结构。c-2).每个动态链接库结构中都保存了指向下一个动态链接库结构的指针、动态链接库名称、起始地址(虚拟地址)、长度等变量。遍历该链表结构,判断每个动态链接库的名称是否与需要寻找的lsasrv.dl I和tspkg.dl I相同,如果满足条件,则获得相应动态链接库的起始地址(虚拟地址)、长度,并根据这两个变量把动态链接库在内存镜像文件中的执行样本转储出来。
[0016]步骤d)中所述从I sasrv.dll的转储文件中,获取密钥相关数据的具体步骤是:d-1).从与内存镜像文件的相同操作系统版本的计算机的C:\Windows\System32文件夹下,复制I sasrv.dl I动态链接库,使用IDA对动态链接库进行反汇编,在动态链接库中找到函数LsalnitializeProtectedMemory,查看该函数的反汇编代码;d_2).在该函数反汇编代码中,找到变量Ini tialzat 1nVector的位置,如图5所示,给出了本发明反汇编出的LsalnitializeProtectedMemory函数的部分截图。(1-3).查看与该位置相关的二进制数据,以此数据为特征码,到lsasrv.dll转储文件搜索此特征码,找到变量Initialzat1nVector在I s a s r V.d I I转储文件中的相对偏移地址,设为I n i t V e c O f f s e t ;变量Ini tialzat 1nVector的虚拟地址InitVecVa可通过以下公式得到:
InitVecVa = IsasrvVa+sizeof(ULONG)+ InitVecOffset0 (2)
其中,IsasrvVa是I sasrv.dll在lsass.exe中加载的动态链接库虚拟地址,sizeof(ULONG)为求取数据类型ULONG的字节数。由于此变量在lsass.exe的进程空间内,因此使用I sassCR3Val对InitVecVa进行虚拟地址到物理地址转换,得到变量Ini tialzat 1nVector在内存镜像文件的位置,从而获得Initialzat1nVector的内容。d-4).获取变量hAesKey的值,然后创建Aes加密的密钥内容。d-5).获取变量h3DeSKey的值,然后创建3Des密钥内容;步骤d-4)所述的创建Aes密钥内容的具体步骤为:d-4-l).获取变量hAesKey的值,具体方法与步骤d-Ι)—d-3)中获得变量Ini tialzat 1nVector的内容步骤类似,如图5所示。d-4-2).变量AesKey的值指向KIWI_BCRYPT_HANDLE_KEY结构。
[00?7]如图2所示,给出了本发明的64位windows内存镜像文件中已登录用户密码明文获取方法的获取密钥内容的结构关系图。以64位Windows8.1为例,定位到AesKey指向的物理地址,获得_KIWI_BCRYPT_HANDLE_KEY结构的内容。从中找到变量key,变量Key是指向的KI WI_BCRYPT_KEY81 结构的指针,从KI WI_BCRYPT_HANDLE_KEY 结构的偏移Ox 1处,读取8个字节的数据,该值就是变量key的虚拟地址,将该虚拟地址转换为物理地址,在物理内存镜像文件中定位到该地址,即找到KIWI_BCRYPT_HANDLE_KEY结构的内容,KIWI_BCRYPT_HANDLE_KEY结构中的HardKey变量存放的就是生成Aes密钥所需的值,使用LoadLibrary加载与内存镜像文件操作系统版本相同的系统里的b c r y P t.d I I,调用其中BCryptGenerateSymmetricKey函数,以HardKey为参数创建Aes密钥。
[0018]步骤d-5)所述的创建3Des密钥内容的具体步骤与步骤d_4)类似。
[0019]步骤e)所述的从lsasrv.dll中获取登录会话列表的数量和登录会话列表中用户信息的方法为:对lsasrv.dll进行反汇编,该动态链接库是来自与内存镜像文件的相同操作系统版本的计算机X:\Windows\System32(其中,X为系统盘)文件夹。找到函数LsapCreateLsaLogonSess1n ,查看该函数的反汇编代码,获取变量LogonSess1nLi stConut以及LogonSess1nLi st的位置及附近特征值,根据特征值对lsasvr.dll在内存镜像文件中的转储文件进行搜索,获取变量LogonSess1nLi stConut以及LogonSess1nLi st在内存镜像文件中的值。变量LogonSess1nLi stCount存储了登录会话列表的数量,变量LogonSess1nLi st指向一个双向链表结构体,该结构体中存放了登录会话列表中用户信息。
[0020]如图3所示,给出了本发明的64位windows操作系统的内存镜像文件中已登录用户密码明文获取方法中步骤f)中所述从tspkg.dll的转储文件中,获取当用户主凭证的流程图,具体步骤是:
f-Ι).从与内存镜像文件相同操作系统版本的计算机文件夹X:\Windows\System中找出动态链接库tspkg.dll,X表示系统盘,并对动态链接库tspkg.dll进行反汇编,以找到函数TSUnloadCredTable;
f-2).在TSUnloadCredTable函数体中找到变量TSGlobalCredTable的存放位置;f_3).查看变量TSGlobalCredTable存放位置所存储的二进制数据,以此二进制数据为特征码,到lsasry.dl I转储文件中搜索此特征码;
f - 4 ).特征码在I s a s r y.d I I文件中被搜索到后,其存储位置即为变量TSGlobalCredTable在tspkg.dll内存转储文件中的相对偏移地址,设该偏移地址为TSGlobalTabOffset;
f-5).通过如下公式计算变量TSGlobalCredTable的虚拟地址TSGlobalTabVa: TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I)
其中,tspkgVa是动态链接库tspkg.dl I在lsass.exe中加载的动态链接库虚拟地址,sizeof(ULONG)为求取数据类型ULONG的字节数;
然后使用lsassCR3Val对TSGlobalTabVa进行虚拟地址到物理地址转换,得到变量TSGlobalCredTable 在内存镜像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE结构;lsassCR3Val为步骤b)中获取的lsass.exe进程的CR3寄存器的内容;
f-6).RTL_AVL_TABLE结构是一个平衡二叉树,定位到TSGlobalCredTable的物理地址,从RTL_AVL_TABLE结构树根的孩子开始遍历该树;
f-7).在遍历RTL_AVL_TABLE结构树的过程中,读取树中变量OrderedPoointer的值,该值是KIWI_TS_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,并在内存镜像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL结构;
f-8).找到结构 KIWI_TS_CREDENTIAL 中变量 LocallyUniqueIdentif ier 的值,该变量存放的是用户的LUID,若已登录用户的LUID与当前KIWI_TS_CREDENTIAL结构中用户LUID相同,则执行步骤f-9),否则回到步骤f-6)继续遍历二叉树的左孩子和右孩子;
f-9).找到结构KIWI_TS_CREDENTIAL中变量pTsPrimary,pTsPrimary所指向的结构体存放的是用户的主凭证,pTsPrimary指向KIWI_TS_PRIMARY_CREDENTIAL,读取变量pTsPrimary的值,该值是KIWI_TS_PR頂ARY_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,在内存镜像文件中定位到物理地址找到此结构;
f-ΙΟ).找到结构 KIWI_TS_PRIMARY_CREDENTIAL 中变量 credentials ,credentials 中存放的是当前用户的用户名、域名和密文;其中,用户名、域名和密文都是以UNICODE方式存放在物理内存镜像文件中的,根据UNICODE结构体的定义,获取出密文当前长度Len、最大长度MaxLen及在物理内存中的虚拟地址,并将虚拟地址转换为物理地址,到内存镜像文件中定位到该物理地址;
f-11).根据步骤f-10)中获取的物理地址在内存镜像文件中读取长度为Len的数据到存储空间cry ptBuffer中,对密文解密后即获取已登录用户密码的明文。
【主权项】
1.一种从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,通过以下步骤来实现: a).获取系统版本信息,采用基于KPCR结构的物理内存分析方法,从当前内存镜像文件中获取包括主版本号、次版本号、内部版本号在内的操作系统版本信息; b).获取lsass.exe进程的CR3寄存器内容,进程环境块中PEB结构变量的值; c).转储执行样本,获取lsass.exe加载的动态链接库链表,将动态链接库lsasrv.dll和tspkg.dll在内存镜像文件中的执行样本转储出来; d).获取密钥相关数据,从lsasrv.dll的转储文件中获取包括Initialzat1nVector值、hAesKey值、h3DesKey值在内的密钥相关数据; e).获取登录数量和信息,从lsasrv.dll中获取登录会话列表的数量和登录会话列表中用户信息; f).获取主凭证,从tspkg.dll的转储文件中,获取当前登录用户主凭证; g).获取密码明文,加载动态链接库nCryt.dll,借助步骤d)中获取的密钥相关数据,对步骤f)中所获取的主凭证中密文进行解密,获取登录用户密码明文。2.根据权利要求1所述的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,步骤c)所述的转储执行样本通过以下方法来实现: c-1).获取变量Ldr,从lsass.exe进程PEB结构体中获取变量Ldr,Ldr变量指向了进程加载的所有动态链接库结构的链表结构; c-2).遍历变量Ldr所指向的链表结构,判断每个动态链接库的名称与需要寻找的lsasrv.dlI或tspkg.dlI是否相同,如果存在相同,则获得相应动态链接库的起始虚拟地址、长度变量,并根据这两个变量把动态链接库在内存镜像文件中的执行样本转储出来。3.根据权利要求1或2所述的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,步骤e)所述的获取登录数量和信息通过以下方法来实现:首先对动态链接库进行反汇编,在动态链接库中找到函数LsapCreateLsaLogonSess 1n,查看该函数的反汇编代码,获取变量LogonSess1nLi stConut和LogonSess1nLi st的值;然后通过变量LogonSess1nLi stConut获取登录会话列表的数量,从变量LogonSess1nLi st所指向的双向链表结构体中获取登录会话列表中用户信息。4.根据权利要求1或2所述的从64位Windows操作系统的内存镜像文件中获取已登录用户密码明文的方法,其特征在于,步骤f)所述的获取主凭证通过以下步骤来实现: f_l).从与内存镜像文件相同操作系统版本的计算机文件夹X:\Windows\System中找出动态链接库tspkg.dll,X表示系统盘,并对动态链接库tspkg.dll进行反汇编,以找到函数TSUnloadCredTable; f-2).在TSUnloadCredTable函数体中找到变量TSGlobalCredTable的存放位置;f_3).查看变量TSGlobalCredTable存放位置所存储的二进制数据,以此二进制数据为特征码,到lsasry.dl I转储文件中搜索此特征码; f - 4 ).特征码在I s a s r y.d I I文件中被搜索到后,其存储位置即为变量TSGlobalCredTable在tspkg.dll内存转储文件中的相对偏移地址,设该偏移地址为TSGlobalTabOffset; f-5).通过如下公式计算变量TSGlobalCredTable的虚拟地址TSGlobalTabVa: TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I) 其中,tspkgVa是动态链接库tspkg.dll在lsass.exe中加载的动态链接库虚拟地址,sizeof(ULONG)为求取数据类型ULONG的字节数; 然后使用lsassCR3Val对TSGlobalTabVa进行虚拟地址到物理地址转换,得到变量TSGlobalCredTable 在内存镜像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE结构;lsassCR3Va为步骤b)中获取的lsass.exe进程的CR3寄存器的内容; f-6).RTL_AVL_TABLE结构是一个平衡二叉树,定位到TSGlobalCredTable的物理地址,从RTL_AVL_TABLE结构树根的孩子开始遍历该树; f-7).在遍历RTL_AVL_TABLE结构树的过程中,读取树中变量OrderedPoointer的值,该值是KIWI_TS_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,并在内存镜像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL结构; f-8).找到结构KIWI_TS_CREDENTIAL中变量LocalIyUniqueIdentif ier的值,该变量存放的是用户的LUID,若已登录用户的LUID与当前KIWI_TS_CREDENTIAL结构中用户LUID相同,则执行步骤f_9),否则回到步骤f_6)继续遍历二叉树的左孩子和右孩子; f-9).找到结构KIWI_TS_CREDENTIAL中变量pTsPrimary,pTsPrimary指向KIWI_TS_PR頂ARY_CREDENTIAL,该结构体存放的是用户的主凭证,读取变量pTsPrimary的值,该值是KIWI_TS_PRMARY_CREDENTIAL结构的虚拟地址,将该虚拟地址转换为物理地址,在内存镜像文件中定位到物理地址找到此结构; f-10).找到结构KIWI_TS_PR頂ARY_CREDENTIAL中变量credentials ,credentials中存放的是当前用户的用户名、域名和密文;其中,用户名、域名和密文都是以UNICODE方式存放在物理内存镜像文件中的,根据UNICODE结构体的定义,获取出密文当前长度Len、最大长度MaxLen及在物理内存中的虚拟地址,并将虚拟地址转换为物理地址,到内存镜像文件中定位到该物理地址; f-11).根据步骤f-10)中获取的物理地址在内存镜像文件中读取长度为Len的数据到存储空间cry ptBuffer中,对密文解密后即获取已登录用户密码的明文。
【文档编号】G06F21/31GK105893107SQ201610276405
【公开日】2016年8月24日
【申请日】2016年4月29日
【发明人】徐丽娟, 王连海, 葛亮, 赵大伟, 周洋, 徐淑奖
【申请人】山东省计算中心(国家超级计算济南中心)
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1