Hooking WinInet 可以通过 Wininet::InternetReadFile(( 方法访问 HTTP 响应,但lpBuffer
不包括 HTTP 响应标头。
虽然我可以读取响应标头(Wininet::HttpQueryInfo(,但我无法修改或删除它们。
是否可以使用 Wininet 钩子修改/删除 HTTP 响应标头?
有一种方法可以从某个 Wininet 钩子访问完整的 HTTP 响应缓冲区?
你不能,cz http 响应标头显然来自服务器回复!
但是如果你的意思是你想让钩子Wininet::HttpQueryInfo函数用假数据填充http头响应,当然你可以用创建一个钩子,
比如BOOLAPI _stdcall HookedHttpQueryInfoW(
_In_ HINTERNET hRequest,
_In_ DWORD dwInfoLevel,
_Inout_updates_bytes_to_opt_(*lpdwBufferLength, *lpdwBufferLength) __out_data_source(NETWORK) LPVOID lpBuffer,
_Inout_ LPDWORD lpdwBufferLength,
_Inout_opt_ LPDWORD lpdwIndex
);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)FuncAddress, FuncOriginalBytes, sizeof(FuncOriginalBytes), &bytesWritten);
HttpQueryInfo使用Handler来检索http头,所以这里你可以对你的web做一个你自定义其返回头的其他请求,并在真实函数的返回中将其设置为常量(用你的请求处理器修改hrequest(
return HttpQueryInfoW(
_In_ HINTERNET MyHandler,
_In_ DWORD dwInfoLevel,
_Inout_updates_bytes_to_opt_(*lpdwBufferLength, *lpdwBufferLength) __out_data_source(NETWORK) LPVOID lpBuffer,
_Inout_ LPDWORD lpdwBufferLength,
_Inout_opt_ LPDWORD lpdwIndex
);
现在,如果你打电话
HttpQueryInfoW(hrequest, HTTP_QUERY_RAW_HEADERS_CRLF, lpOutBuffer,&dwSize,NULL);
这将是
HttpQueryInfoW(MyHandler, HTTP_QUERY_RAW_HEADERS_CRLF, lpOutBuffer,&dwSize,NULL);
顺便说一下,有各种各样的技巧;但这对我来说似乎很容易解释,并且在它的步骤