我正在尝试通过系统插件和netapi32
库从 Windows 获取一些信息。
我尝试NetWkstaGetInfo()
在分配一个适合作为WKSTA_INFO_100
.
MSDN 中的NetWkstaGetInfo()
原型状态:
NET_API_STATUS NetWkstaGetInfo(
_In_ LPWSTR servername,
_In_ DWORD level,
_Out_ LPBYTE *bufptr
);
虽然WKSTA_INFO_100
是
typedef struct _WKSTA_INFO_100 {
DWORD wki100_platform_id;
LMSTR wki100_computername;
LMSTR wki100_langroup;
DWORD wki100_ver_major;
DWORD wki100_ver_minor;
} WKSTA_INFO_100, *PWKSTA_INFO_100, *LPWKSTA_INFO_100;
对于初步测试,我尝试在消息框中显示结构成员。我首先使用虚拟信息初始化结构,以检查 api 调用是否替换了我分配的块的内容。
但是直到现在我在第一个结构成员之后几乎什么都没有,我想结构没有正确定义,或者我有结构对齐问题。不幸的是,系统插件的怪异文档让我发疯,对我没有多大帮助。
这是我的测试脚本:
outfile "hello.exe"
section
System::Call /NOUNLOAD "*(*i11,t 'some',t 'thing',i22,i44)i .r0"
Dumpstate::debug
System::Call /NOUNLOAD "netapi32::NetWkstaGetInfo(i0, i100, i r0) i.r6"
Dumpstate::debug
System::Call /NOUNLOAD "*$0(*i.r1, t.r2, t.r3, i.r4, i.r5)"
Dumpstate::debug
messagebox MB_OK "Hello, to $2 $3 domain (win $1 - $4.$5) !"
System::Free $0
sectionEnd
第一个检索到的值 (500) 是正确的。但其他成员保持其初始值。我错过了什么?
(编辑)推论问题:
- 似乎按照文档和MSDN,结构的第一个成员应该是
i
而不是*i
但我没有设法获得正确的返回值*
(Dumpstate插件倾向于显示它作为地址返回) /NOUNLOAD
插件的参数是强制性的吗?我找到了几个例子,但没有找到确切的原因。我担心如果没有参数,分配的结构可能会被过早释放。你能确认/确认吗?