Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Базонезависимый код
Посл.ответ Сообщение

Ранг: 13.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 07 февраля 2007 15:34
· Личное сообщение · #1

здр.
Делаю инжект в процесс, всё по стандарту, резервирую память (VirtualAllocEx) пишу в неё (WriteProcessMemory) и вызываю CreateRemoteThread всё нормально поток стартует.
Олькой подрубаюсь к процессу, процесс падает при старте нового потока, адрес старта потока равен адресу моей функции которую я указал в CreateRemoteThread , но там ничего нет, просто нули в памяти процесса, вопрос как может такое произойти если WriteProcessMemory возвращяет (dwWritten) количество записанных байт равное размеру моего EXE. А в памяти у процесса куда внедряюсь ничего нет
www.everfall.com/paste/id.php?37xpw0ltonov код



Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2007 03:28 · Поправил: NetSpider
· Личное сообщение · #2

Я функцией CreateRemoteThread пока не баловался, но есть предположения:
1. Компилятор мог разместить функции RemoteMain RemoteMainEnd в разных местах и тогда DWORD(&RemoteMainEnd)-DWORD(&RemoteMain) будет неверно. Проверить можно только в отладчике.
2. Каким образом организован выход из потока, созданного CreateRemoteThread?
3. Немного не понял это ret = WriteProcessMemory(Process,dwNewModule,EntryPoint, DWORD(&RemoteMainEnd)-DWORD(&RemoteMain), &dwWritten);
Делается инженкт кода в функции RemoteMain? Тогда почему адрес с которого будем переписывать код явл-ся EntryPoint?
Правильнее тогда ret = WriteProcessMemory(Process,dwNewModule,&RemoteMain, DWORD(&RemoteMainEnd)-DWORD(&RemoteMain), &dwWritten);



Ранг: 13.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 февраля 2007 04:00
· Личное сообщение · #3

1. В компиляторе смотрел по поводу адресов функций, всё норм.
2. Выход из CreateRemoteThread ? Функция которая стартует просто делает return 0; фактически базонезависимый код
3. ну смотри выше в коде bool ret=false; ret = WriteProcess.. return ret;
EntryPoint это и есть RemoteMain :
меня беспокоет то что dwWritten возвращяет 150 кб ( размер EXEшника моего ) а в процессе куд инжекчусь ничего нет по адресу куда инжектил




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 08 февраля 2007 04:17
· Личное сообщение · #4

Так ты же аллокируешь произвольную память, а запускаешь поток по EntryPoint.
Запускай с параметром, возвращенным виртуал аллок.



Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2007 04:20
· Личное сообщение · #5

HoBleen
В точку. А я и не заметил...



Ранг: 13.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 февраля 2007 05:22
· Личное сообщение · #6

HoBleen дык VirtualAlloc возвращяет LPVOID , как мне его переделать в 'unsigned long (__stdcall*)(void*)' ?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 08 февраля 2007 05:29
· Личное сообщение · #7

Называется приведение типов
CreateRemoteThread(...(LPTHREAD_START_ROUTINE)lpMem...)



Ранг: 13.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 февраля 2007 05:44
· Личное сообщение · #8

HoBleen Спасибо !


 eXeL@B —› Программирование —› Базонезависимый код
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати