Skip to content

Commit 3efd4ea

Browse files
committed
add security coockies back into PE loader for kernel driver
1 parent f605212 commit 3efd4ea

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

examples/rootfs

qiling/loader/pe.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44
#
55

6-
import os, pefile, pickle, traceback
6+
import os, pefile, pickle, secrets, traceback
77
from typing import Any, MutableMapping, Optional, Mapping, Sequence
88

99
from qiling import Qiling
@@ -608,6 +608,21 @@ def load(self):
608608
self.pe.parse_data_directories()
609609
data = bytearray(self.pe.get_memory_mapped_image())
610610
self.ql.mem.write(self.pe_image_address, bytes(data))
611+
612+
if self.is_driver:
613+
# setup IMAGE_LOAD_CONFIG_DIRECTORY
614+
if self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG']].VirtualAddress != 0:
615+
SecurityCookie_rva = self.pe.DIRECTORY_ENTRY_LOAD_CONFIG.struct.SecurityCookie - self.pe.OPTIONAL_HEADER.ImageBase
616+
SecurityCookie_value = default_security_cookie_value = self.ql.mem.read(self.pe_image_address+SecurityCookie_rva, self.ql.pointersize)
617+
while SecurityCookie_value == default_security_cookie_value:
618+
SecurityCookie_value = secrets.token_bytes(self.ql.pointersize)
619+
# rol rcx, 10h (rcx: cookie)
620+
# test cx, 0FFFFh
621+
SecurityCookie_value_array = bytearray(SecurityCookie_value)
622+
# Sanity question: We are always little endian, right?
623+
SecurityCookie_value_array[-2:] = b'\x00\x00'
624+
SecurityCookie_value = bytes(SecurityCookie_value_array)
625+
self.ql.mem.write(self.pe_image_address+SecurityCookie_rva, SecurityCookie_value)
611626

612627
# Add main PE to ldr_data_table
613628
mod_name = os.path.basename(self.path)

0 commit comments

Comments
 (0)