最近我试图从 iscflashx64.sys 驱动程序中获取 OICTL 代码,我在 DispatchDeviceControl 函数中找到了它。安装驱动程序并使用 SCM 启动后,它会显示在 WinObj 中。当我在用户端应用程序中使用此代码调用 DeviceIOControl 函数时,它返回“1”错误代码。这意味着我的代码无效。
下一个:
lea rdx, cs:10000h
movzx eax, ds:(byte_1C9C8 - 10000h)[rdx+rsi]
mov ecx, ds:(off_1C988 - 10000h)[rdx+rax*4]
add rcx, rdx
jmp rcx ; switch jump
和函数调用:
lea rcx, [rsp+188h+PhysicalAddress]
call MSR_read1
jmp short loc_1C2BC
在用户应用程序中:
#define IOCTL_READ_MSR\
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x2237134, METHOD_BUFFERED, FILE_ANY_ACCESS)
...
bool msr_get(unsigned int reg, unsigned long long *val)
{
if (hHandle == NULL)
{
printf("## ERROR: Not initialized\n");
return false;
}
DWORD dwBytes = 0;
UCHAR Request[0x100];
ZeroMemory(&Request, sizeof(Request));
*(PDWORD)(Request + 0x08) = reg;
// send request to the driver
if (DeviceIoControl(
hHandle, IOCTL_READ_MSR,
&Request, sizeof(Request), &Request, sizeof(Request),
&dwBytes, NULL))
{
LARGE_INTEGER Val;
Val.HighPart = *(PDWORD)(Request + 0x0c);
Val.LowPart = *(PDWORD)(Request + 0x00);
*val = Val.QuadPart;
return true;
}
else
{
printf("## ERROR DeviceIoControl() %d\n", GetLastError());
}
return false;
}
谷歌搜索后我找到了这个答案。所以这个循序渐进的解决方案对我不起作用。在 switch case 表中可能有问题,但 IDA 得到的注释看起来像这样的代码:
loc_1C55A:
sub esi, 222406h
jz loc_1C6E7
出了什么问题?将非常感谢任何建议或只是使用 IOCTL 的常用技术。
PS对不起我的英语。
