windows_reactor/
ncrypt.rs1use vmi::{
2 Va, VmiContext, VmiError, VmiOs,
3 driver::VmiRead,
4 os::windows::{ArchAdapter, WindowsOs},
5 utils::reactor::Action,
6};
7use zerocopy::{FromBytes, IntoBytes};
8
9const NCRYPTBUFFER_SSL_CLIENT_RANDOM: u32 = 20;
10#[repr(C)]
13#[derive(Debug, Copy, Clone, FromBytes, IntoBytes)]
14struct NCryptBuffer {
15 cbBuffer: u32, BufferType: u32, pvBuffer: u64, }
19
20#[repr(C)]
21#[derive(Debug, Copy, Clone, FromBytes, IntoBytes)]
22struct NCryptBufferDesc {
23 ulVersion: u32, cBuffers: u32, pBuffers: u64, }
27
28#[repr(C)]
29#[derive(Debug, Copy, Clone, FromBytes, IntoBytes)]
30struct SSL_MASTER_KEY {
31 cbLength: u32, dwMagic: u32, dwProtocol: u32, _pad: u32, pCipherSuite: u64, fClient: i32, rgbMasterKey: [u8; 48], cbMasterKey: u32, }
40
41#[repr(C)]
42#[derive(Debug, Copy, Clone, FromBytes, IntoBytes)]
43struct NCRYPT_SSL_KEY {
44 cbLength: u32, dwMagic: u32, dwFlags: u32, RefCount: i32, hSubKey: u64, pProvider: u64, }
51
52pub fn SslGenerateSessionKeys<Driver>(
64 vmi: &VmiContext<WindowsOs<Driver>>,
65) -> Result<Action<<WindowsOs<Driver> as VmiOs>::Architecture>, VmiError>
66where
67 Driver: VmiRead,
68 Driver::Architecture: ArchAdapter<Driver>,
69{
70 let hMasterKey = vmi.os().function_argument(1)?;
84 let pParameterList = vmi.os().function_argument(4)?;
85
86 let mut client_random = vec![0u8; 32];
87
88 let parameter_list = vmi.read_struct::<NCryptBufferDesc>(Va(pParameterList))?;
89 for i in 0..parameter_list.cBuffers {
90 let offset = (i as u64) * size_of::<NCryptBuffer>() as u64;
91 let buffer = vmi.read_struct::<NCryptBuffer>(Va(parameter_list.pBuffers + offset))?;
92
93 if buffer.BufferType == NCRYPTBUFFER_SSL_CLIENT_RANDOM {
94 vmi.read(Va(buffer.pvBuffer), &mut client_random)?;
95 break;
96 }
97 }
98
99 let master_key = vmi.read_struct::<NCRYPT_SSL_KEY>(Va(hMasterKey))?;
100 let subkey = vmi.read_struct::<SSL_MASTER_KEY>(Va(master_key.hSubKey))?;
101
102 tracing::info!(
103 client_random = hex::encode(client_random),
104 secret = hex::encode(subkey.rgbMasterKey),
105 );
106
107 Ok(Action::default())
108}