![](/img/trans.png)
[英]How to run a PE image without linking kernel32.dll and ntdll.dll
[英]Is there a wsprintf()-type function from a low-level library such as kernel32.dll or ntdll.dll?
我正在编写一个低级记录器函数,该函数将文本字符串附加到文本(日志)文件的末尾。 要求是此函数不应从该进程可能尚不可用的DLL 调用任何WinAPI,例如,从DllMain处理程序调用它时。 换句话说,除了保证可以加载到任何用户模式进程中的库之外,它不能使用任何其他库,即kernel32.dll
或ntdll.dll
。
我只能通过kernel32.dll
CreateFile
, WriteFile
, CloseHandle
, HeapAlloc
, HeapFree
等很好地相处。
问题是格式化输出字符串。 例如,我需要添加一些额外的(自动生成的)的详细信息,诸如当前时间,过程ID,会话ID等我通常会使用wsprintf
用于该类型的功能,或StringCchPrintf
准确的说,因为这样:
StringCchPrintf(buffer, buffer_size, L"%04u-%02u-%02u %02u:%02u:%02u pid=0x%x, sessID=%d, %s\r\n", /* parameters */ );
但是这些API违反了我上面提到的规则。
有谁知道是否存在低级别的printf
类型格式化API?
所有版本的ntdll.dll都支持最小的next(来自xp)字符串格式化功能:
_snprintf
_snwprintf
_vsnprintf
_vsnwprintf
sprintf
swprintf
vsprintf
当然,完整的签名与crt中的相同功能匹配。 我们可以免费使用此api。 新版本的ntdll添加了一些新格式的字符串api。 再说win7(和所有最新版本)ntdll.dll导出:
_snprintf
_snprintf_s
_snwprintf
_snwprintf_s
_swprintf
_vscwprintf
_vsnprintf
_vsnprintf_s
_vsnwprintf
_vsnwprintf_s
_vswprintf
swprintf
swprintf_s
vsprintf
vsprintf_s
vswprintf_s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.