gpt4 book ai didi

c# - 无法将 C# 字符串从用户态传递到内核模式 C 并使用它来查找特定的 LDR_DATA_TABLE_ENTRY

转载 作者:行者123 更新时间:2023-12-03 15:51:26 25 4
gpt4 key购买 nike

我很难将从用户模式类型 LPWSTR 传递的字符串与 LDR 表条目类型 UNICODE_STRING 进行比较
内核 C:

struct {
int pid;
int user_pid;
int size;
int protection_mode;
int allocation_type;
void* address;
void* write_buffer;
LPWSTR module_name;
}
userland_operation;
该结构通过 deviceiocontrol 传递给内核。对应的用户态结构如下:
public struct MemOperation
{
public int Pid;
public int UserPid;
public int Size;
public int protection_mode;
public int allocation_type;
public IntPtr Addr;
public IntPtr WriteBuffer;
[MarshalAs(UnmanagedType.LPWStr)] public String ModuleName;
}
字符串 ModuleName被编码为 LPWStr。 ModuleName是进程中已加载模块的所需搜索词。现在,这就是事情变得棘手的地方。我可以通过 _LDR_DATA_TABLE_ENTRY 访问的字符串是 UNICODE_STRING .我想将此 UNICODE_STRING 与我的 LPWSTR 进行比较。
我尝试了以下方法,但没有奏效:
{
UNICODE_STRING str;
RtlInitUnicodeString(&str, module_name) // module name is the userland passed string LPWSTR
if (RtlCompareUnicodeString(&str, &module_ldr->BaseDllName, TRUE) {


}
}
我也尝试过 wcscmp 和其他一些东西。我不确定如何正确比较这两者。我在函数中添加了一些次要的伪代码,以提供关于我想要做什么的额外上下文。
NTSTATUS GetModuleList(HANDLE PID, PVOID UserBuffer, LPWSTR module_name) {
KAPC_STATE APC;
__try {
PEPROCESS TargetProcess;

PsLookupProcessByProcessId(PID, &TargetProcess);

PPEB Peb = PsGetProcessPeb(TargetProcess);

if (!Peb)
return STATUS_INVALID_PARAMETER;

KeStackAttachProcess(TargetProcess, &APC);

UINT64 Ldr = (UINT64)Peb + PEBLDR_OFFSET;
ProbeForRead((CONST PVOID)Ldr, 8, 8);

PLIST_ENTRY ModListHead = (PLIST_ENTRY)(*(PULONG64)Ldr + PEBLDR_MEMORYLOADED_OFFSET);
ProbeForRead((CONST PVOID)ModListHead, 8, 8);

PLIST_ENTRY Module = ModListHead->Flink;

while (ModListHead != Module) {
LDR_DATA_TABLE_ENTRY* Module_Ldr = (LDR_DATA_TABLE_ENTRY*)(Module);

//psuedo if (module_name is in Module_Ldr->BaseDllName) // the comparison, where BaseDllName is type UNICODE_STRING

Module = Module->Flink;
}
KeUnstackDetachProcess(&APC);
ObDereferenceObject(TargetProcess);
return STATUS_SUCCESS;

最佳答案

在下面的这个电话中:

if (RtlCompareUnicodeString(&str, &module_ldr->BaseDllName) {

此函数采用您未传递的附加参数。
请引用 https://docs.microsoft.com/en-us/windows/win32/devnotes/rtlcompareunicodestring

关于c# - 无法将 C# 字符串从用户态传递到内核模式 C 并使用它来查找特定的 LDR_DATA_TABLE_ENTRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62208433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com