Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2013, 15:04   #1
CyberBiber
 
Регистрация: 24.09.2013
Сообщений: 6
По умолчанию Не получается создать поток (CreateRemoteThread)

Здравствуйте.

Имеем код:
Код:
DWORD WINAPI my_func(LPVOID lpParam)
{
    MessageBoxA(0, "тест", "тест", MB_OK);
    ExitThread(0);
}
 
void main(void)
{
    HMODULE hModule;
    DWORD dwPid;
    DWORD dwBytesWritten;
    DWORD dwTid;
    LPVOID newMod;
    HWND targ;
    HANDLE hProcess;
    DWORD err;
    WCHAR errt[20];
 
    DWORD dwSize;
    IMAGE_DOS_HEADER dosHeader;
    IMAGE_OPTIONAL_HEADER dosOpHeader;
    IMAGE_FILE_HEADER fHeader;
 
    hModule = GetModuleHandle(NULL);
    targ = FindWindowA("Notepad", 0);
    GetWindowThreadProcessId(targ, &dwPid);
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
 
    memcpy(&dosHeader, hModule, sizeof(dosHeader));
    memcpy(&dosOpHeader, (hModule + dosHeader.e_lfanew + 4 + sizeof(fHeader)), sizeof(dosOpHeader));
    dwSize = dosOpHeader.SizeOfImage;
 
    VirtualFreeEx(hProcess, newMod, 0, MEM_RELEASE);
    newMod = VirtualAllocEx(hProcess, hModule, dwSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProcess, newMod, hModule, dwSize, &dwBytesWritten);
    CreateRemoteThread(hProcess, 0, 0, &my_func, hModule, 0, &dwTid);
 
 
    err = GetLastError();
    wsprintfW(errt, L"%d", err);
    MessageBoxW(0,errt,0,0);
 
    ExitProcess(0);
}
Начиная с вызова VirtualFreeEx, возвращается 87-й код, и дальше полный крах.. хотя с виду, код рабочий. Помогите найти и исправить ошибку
CyberBiber вне форума Ответить с цитированием
Старый 24.09.2013, 15:13   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от CyberBiber Посмотреть сообщение
Здравствуйте.
Начиная с вызова VirtualFreeEx, возвращается 87-й код, и дальше полный крах.. хотя с виду, код рабочий. Помогите найти и исправить ошибку
Очевидно же:
Цитата:
ERROR_INVALID_PARAMETER
87 (0x57)
The parameter is incorrect.
Человек_Борща вне форума Ответить с цитированием
Старый 24.09.2013, 15:16   #3
CyberBiber
 
Регистрация: 24.09.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Очевидно же:
Благодарю за внимание к теме.

Копирнул неправильно, правильно в той строчке так:
Код:
VirtualFreeEx(hProcess, hModule, 0, MEM_RELEASE);
одинаково не арбайтен, тот самый 87-й код..(
CyberBiber вне форума Ответить с цитированием
Старый 24.09.2013, 15:54   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Копирнул неправильно, правильно в той строчке так:
VirtualFreeEx(hProcess, hModule, 0, MEM_RELEASE);
Из msdn
lpAddress [in]

A pointer to the starting address of the region of memory to be freed.

И что же тут правильного? Какое отношение имеет hModule к адресу в памяти?
northener вне форума Ответить с цитированием
Старый 24.09.2013, 16:00   #5
CyberBiber
 
Регистрация: 24.09.2013
Сообщений: 6
По умолчанию

Это была попытка перевести следующий код с masm'а:
Код:
.386
.model flat, stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib

.data
szTarget byte 'Notepad', 0

.data?
hModule dword ?
hNewModule dword ?
hProcess dword ?
dwSize dword ?
dwPid dword ?
dwBytesWritten dword ?
dwTid dword ?
.code

HijackedThread proc
invoke MessageBox, 0, addr szTarget, addr szTarget, 0
invoke ExitThread, 0
ret
HijackedThread endp

_entrypoint:
invoke GetModuleHandle, 0
mov hModule, eax
mov edi, eax 
assume edi:ptr IMAGE_DOS_HEADER 
add edi, [edi].e_lfanew
add edi, sizeof dword
add edi, sizeof IMAGE_FILE_HEADER
assume edi:ptr IMAGE_OPTIONAL_HEADER32 
mov eax, [edi].SizeOfImage
mov dwSize, eax
assume edi:NOTHING
invoke FindWindow, addr szTarget, 0
invoke GetWindowThreadProcessId, eax, addr dwPid
invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, dwPid
mov hProcess, eax
invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE
invoke VirtualAllocEx, hProcess, hModule, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE 
mov hNewModule, eax
invoke WriteProcessMemory, hProcess, hNewModule, hModule, dwSize, addr dwBytesWritten
invoke CreateRemoteThread, hProcess, 0, 0, addr HijackedThread, hModule, 0, addr dwTid
invoke ExitProcess, 0
end _entrypoint
invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE <= работает ведь.
CyberBiber вне форума Ответить с цитированием
Старый 24.09.2013, 17:31   #6
CyberBiber
 
Регистрация: 24.09.2013
Сообщений: 6
По умолчанию

Помогите пожалуйста перевести правильно код, в упор не вижу ошибки
CyberBiber вне форума Ответить с цитированием
Старый 24.09.2013, 17:49   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А вы уверены, что исходный ASM вариант рабочий?
Далее, аргументы вызова VirtualFreeEx в том коде отличаются от ваших - у вас неинициализированный указатель.
Неплохо проверять коды ошибок при вызове системных функций.
waleri вне форума Ответить с цитированием
Старый 24.09.2013, 17:53   #8
CyberBiber
 
Регистрация: 24.09.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А вы уверены, что исходный ASM вариант рабочий?
Далее, аргументы вызова VirtualFreeEx в том коде отличаются от ваших - у вас неинициализированный указатель.
CyberBiber вне форума Ответить с цитированием
Старый 24.09.2013, 20:33   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

CyberBiber, код на ассемблере 100% не рабочий. Откуда уверенность, что у блокнота выделена память по тому же адресу, что и у Вашей программы? И потом, внедряемый код должен быть базонезависимым.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать поток rostik123 Win Api 3 13.10.2012 07:36
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Динамически создать поток Человек_Борща Общие вопросы Delphi 6 26.08.2010 13:11
Как создать поток record222 Помощь студентам 1 07.04.2010 01:09
Как в VS 2008 создать поток? MaxDDT Общие вопросы C/C++ 0 11.12.2009 21:53