使用 WinInet 修改/删除 HTTP 响应标头



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);

顺便说一下,有各种各样的技巧;但这对我来说似乎很容易解释,并且在它的步骤

最新更新