受到这个关于 RE-ing IOCTL 的回答的启发,我试图从NtDeviceIoControlFile()系统调用中获取 IOCTL
。这是文件中Beep()函数中该系统调用的示例KernelBase.dll:
- 在 x86_64 (__fastcall) 汇编语言中:
and [rsp+72], ebx ; OutputBufferLength
and [rsp+64], rbx ; OutputBuffer
mov dword ptr [rsp+56], 8 ; InputBufferLength
lea rax, [rsp+152]
mov [rsp+48], rax ; InputBuffer
mov dword ptr [rsp+40], 10000h ; IoControlCode
lea rax, [rsp+78h+var_18]
mov [rsp+32], rax ; IoStatusBlock
xor r9d, r9d ; ApcContext
xor r8d, r8d ; ApcRoutine
xor edx, edx ; Event
mov rcx, [rsp+144] ; FileHandle
call cs:__imp_NtDeviceIoControlFile
test eax, eax
- 在 C 语言中:
NTSTATUS Status;
Status = NtDeviceIoControlFile(FileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
0x10000u,
&InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength);
我在 IDA Python 中尝试了这段代码来列出该系统调用的所有交叉引用:
# Global arrays
XrefList = []
# Get imported function address
FuncAddr = LocByName("__imp_NtDeviceIoControlFile")
print "NtDeviceIoControlFile found at 0x%08x" % FuncAddr
# Iterate over all call references
for xref in XrefsTo(FuncAddr, True):
if xref.frm not in XrefList:
XrefList.append(xref.frm)
print "xref @ 0x%08x (%s)" % (xref.frm, GetFunctionName(xref.frm))
else:
continue
此代码可以成功列出列表中的所有系统调用。但我想列出RSP+40偏移量处的所有 IOCTL 值,即第 6 个参数。我应该添加什么代码?如果您对 IDC 代码有任何建议,我也将不胜感激。