Сейчас на форуме: r0lka, yashechka (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Опкод EBFE в начало системной функции
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 29 июля 2005 18:08
· Личное сообщение · #1

Господа,прошу помочь мне разобраться в следующей ситуации:
необходимо разместить опкод EBFE в начало системной функции LoadLibraryA в чужом процессе,чтобы таким образом отследить обращение чужого процесса к данной функции и получить тем самым некоторую информацию (имя загружаемой библиотеки,обратный адрес функции).Собственно в чём проблема...

const
Code : WORD = $FEEB;
var
ProcAddress : Pointer;
Temp_Protect : Cardinal;
OriginalData : WORD;
nBytesRead, nBytesWritten : Cardinal;
begin
ProcAddress := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');

VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, PAGE_EXECUTE_READWRITE, Temp_Protect);
ReadProcessMemory(processInfo.hProcess, ProcAddress, @OriginalData, 2, nBytesRead);
WriteProcessMemory(processInfo.hProcess, ProcAddress, @Code, SizeOf(WORD), nBytesWritten);
VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, Temp_Protect, Temp_Protect);
...
end;

...так вот функция VirtualProtectEx возвращает C0000018 (STATUS_CONFLICTING_ADDRESSES) и естесственно вся остальная констукция кода тоже рушится .
Хотелось бы узнать,почему так происходит ?
Т.к. такая же кодовая операция только с адресом,к примеру,точки входа проходит без проблем,т.е. на EP размещается необходимый опкод.
Читал в статьях Ms-Rem'а про "сплайсинг" API-функций,в которых он говорит,что перехват API,находящихся в чужом процессе, - весьма неудобная штука.Следовательно любознательный вопрос - почему это так (неудобно) ?
Далее он приводит просто монструозные коды внедрения собственных библиотек в чужой процесс путём создания удалённого процесса...
Собственно у меня дилемма - как поступить,если мне всего лишь необходимо узнать имя загружаемой библиотеки и обратный адрес функции LoadLibraryA,загружающей эту библиотеку .
Или как всё-таки заставить вышеприведённый код работать без ошибок ?

Весьма надеюсь на любые предложения,советы,вопросы с вашей,господа,стороны...

-----
the Power of Reversing team




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

Создано: 29 июля 2005 18:39
· Личное сообщение · #2

DillerInc пишет:
разместить опкод EBFE в начало системной функции LoadLibraryA в чужом процессе,чтобы таким образом отследить обращение чужого процесса к данной функции и получить тем самым некоторую информацию (имя загружаемой библиотеки,обратный адрес функции)

бред какой-то, с таким-же успехом там можно размещать и 90h (тоже весьма информативная комманда) и т.д.



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 29 июля 2005 18:44
· Личное сообщение · #3

DillerInc пишет:
EBFE в начало системной функции LoadLibraryA

Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции. Т. е или нужно писать драйвер ring-0 либо искать альтернативные пути.

-----
Research is my purpose




Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 29 июля 2005 18:49
· Личное сообщение · #4

P. S. Не вкуре зачем это тебе понадобилось, но идея патчить системные ф-ции не самая хорошая
Поищи альтернативный способ

-----
Research is my purpose




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 29 июля 2005 19:05 · Поправил: AlexZ
· Личное сообщение · #5

DillerInc пишет:
VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, PAGE_EXECUTE_READWRITE, @Temp_Protect);
ReadProcessMemory(processInfo.hProcess, ProcAddress, @OriginalData, 2, @nBytesRead);
WriteProcessMemory(processInfo.hProcess, ProcAddress, @Code, SizeOf(WORD), @nBytesWritten);
VirtualProtectEx(processInfo.hProcess, ProcAddress, 2, Temp_Protect, @Temp_Protect);

Или вместо @ поставь ptr(). Возможно в этом причина.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 29 июля 2005 19:33
· Личное сообщение · #6

Error_Log пишет:
Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции

...примерно подобное объяснение я и собирался услышать...
AlexZ пишет:
Или вместо @ поставь ptr(). Возможно в этом причина

...наврядли - я же писал выше,что подобный код,только использующий другой адрес,к примеру, $41CCD8B (секция кода чужого процесса), выполняется на ура.
Error_Log пишет:
Поищи альтернативный способ

...да,а что делать - придётся думать...
Однако хочется услышать ещё какие-нибудь мнения (в частности по поводу возможного альтернативного способа).

-----
the Power of Reversing team




Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 29 июля 2005 20:33
· Личное сообщение · #7

DillerInc пишет:
в частности по поводу возможного альтернативного способа

ну допустим можно изменить таблицу импортов нужного процесса




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 29 июля 2005 20:57
· Личное сообщение · #8

Error_Log пишет:
Патчить системные функции можно только из Ring-0, а так как прога работает в Ring-3, то винда не позволит проге из Ring-3 патчить системные ф-ции

Бред сивой кобылы.

Error_Log пишет:
Не вкуре зачем это тебе понадобилось, но идея патчить системные ф-ции не самая хорошая

Идея достаточно хорошая.

DillerInc
Почитай это www.rsdn.ru/article/baseserv/IntercetionAPI.xml




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 30 июля 2005 00:07
· Личное сообщение · #9

Ara
Спасибо за ссылку (я,кстати,с этим материалом уже встречался как-то).
Я заметил,что во всех этих статьях делается упор именно на внедрение своего кода через подгружаемую библиотеку,которая размещается в создаваемом удалённом потоке целевого процесса, т.е. делается упор на единственно возможный вариант сплайсинга API-функций.
Это походу значит,что мой код,приведённый выше,в принципе неработоспособен...а жаль.Поправьте меня,если я ошибаюсь.
Я,кстати,начинаю прикидывать,а не попробовать бы этак динамически собрать необходимую информацию при помощи функции GetThreadContext...

-----
the Power of Reversing team





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 30 июля 2005 00:23
· Личное сообщение · #10

DillerInc
Если не хочешь подгружать длл, то воспользуйся средствами DebugAPI к примеру.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 30 июля 2005 00:45
· Личное сообщение · #11

Ara пишет:
то воспользуйся средствами DebugAPI

А можно тут подробнее...
Ты имеешь в виду использование точек останова,установленных с помощью API-функций ?

-----
the Power of Reversing team




Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 30 июля 2005 00:58
· Личное сообщение · #12

В винде есть такие средства для отладки. Вот ссылка в мсдн на пример главного отладочного цикла:
[url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ debug/base/writing_the_debugger_s_main_loop.asp][/url]
Установка/снятие бряков - через WriteProcessMemory. По отладочным событиям будешь ловить исключения и делать все что тебе нужно.

Метод с лоадером куда удобнее, т.к. исчезает рутина с коммуникациями между процессами, не все процессы хотят так отлаживаться, и вообще, находясь в адресном пространстве нужного процесса ты - бог.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 30 июля 2005 00:59
· Личное сообщение · #13

DillerInc пишет:
Ты имеешь в виду использование точек останова,установленных с помощью API-функций ?

Да, именно.
Посмотри еще ЭТУ статью, довольно доступно все изложено и сорсы с комментариями.



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 30 июля 2005 12:06
· Личное сообщение · #14

ну и тут я импользовал эту технику, если хочешь смотри, код на С++:
http://www.exelab.ru/f/files/9805_unGHF.zip




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 31 июля 2005 17:08 · Поправил: DillerInc
· Личное сообщение · #15

arnix
Э...а можно,пожалуйста,исходник ?

Ara
Весьма познавательная между прочим статья - спасибо...но я думаю,что придётся побрезговать использованием опкода CC, т.к. я имею дело с протектором,который вполне может применять какие-нибудь антиотладочные приёмы.

А вообще я сейчас в полном смятении с этим делом .
Нашёл типа временный способ нахождения команды CALL [_LoadLibraryA] :

const
Opcode : DWORD = $F00015FF;
EntryPoint : DWORD = $41CBF90;
var
Result : Boolean;
EIPValue : Integer;
EIPPtr : DWORD;
SomeThing : DWORD;
nBytesRead : Cardinal;
begin
result := False;
EIPValue := EntryPoint;
repeat
ReadProcessMemory(processInfo.hProcess, PPointer(EIPValue), @Something, SizeOf(DWORD), nBytesRead);
EIPPtr := EIPValue;
InterlockedIncrement(EIPValue);
if Something = Opcode then
// тут я размещаю по адресу EIPPtr опкод EBFE, далее ResumeThread,чтобы процесс подошёл к этому
// смещению и сразу SuspendThread.Затем я пытаюсь с помощью GetThreadContext получить значение
// регистра ESP, т.к. на
// вершине стека должно находится имя загружаемой библиотеки,но тут и происходит какая-то дрянь -
// GetThreadContext возвращает всё что угодно,но только не то значение,которое реально существует в
// данный момент в регистре ESP чужого процесса ...

Собственно как же функционирует эта GetThreadContext ?
Такое чувство,что она возвращает контекст какого-то другого потока целевого процесса .

-----
the Power of Reversing team





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 31 июля 2005 20:39
· Личное сообщение · #16

DillerInc
Ну вот, оказывается, у тебя уже протектор Опиши попонятней и поподробней, что именно ты хочешь получить, что неполучилось и приаттач полный сорс (или полностью нужный кусок).



Ранг: 156.1 (ветеран), 5thx
Активность: 0.020
Статус: Участник
Капрал

Создано: 31 июля 2005 21:26
· Личное сообщение · #17

А АЙСе посмотреть нельзя имя либы, если конечно это единственный раз нужно.Иначе Имхо самый простой способ - это замена адреса в ИТ на свой.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 31 июля 2005 21:26
· Личное сообщение · #18

Вот еще статейка неплохая.

54c8_Методы перехвата API_вызовов в Win32.rar




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 31 июля 2005 22:48
· Личное сообщение · #19

Прежде всего спасибо за участие .
Ara пишет:
что именно ты хочешь получить

...значит,распаковка программы,защищённой протектором,происходит в адресном пространстве определённой подгружаемой DLL,поэтому для того,чтобымы были в состоянии влиять на ход распаковки,нам необходимо знать адрес,по которому эта DLL загрузилась.А так как адрес загрузки DLL - вещь непостоянная (по крайней мере в данном случае), то нам необходимо узнавать его динамически.
Следовательно сейчас я стараюсь найти в коде конструкции типа:

push XXXXXXXX ; имя библиотеки
call [_LoadLibraryA] ; у меня опкод FF1500F01C04 ... возможно,что только у меня
mov dword ptr [XXXXXXXX], eax ; искомый адрес загрузки

Найдя по опкоду такое место (команда call [_LoadLibraryA] ),надо как-то на него "встать", чтобы функция GetThreadContext нормально прочитала значение регистра ESP, на вершине которого должна быть строка с именем актуальной библиотеки,ну а далее можно будет и адрес загрузки узнать таким же макаром.

Приложил проблемные места кода - надеюсь общий ход мыслей будет ясен.

64fc_Source.txt

-----
the Power of Reversing team





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 31 июля 2005 23:07
· Личное сообщение · #20

DillerInc
Хм, вот теперь мне эта идея тоже кажется бредовой... А что ты хочешь получить В ЦЕЛОМ?




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 01 августа 2005 00:41
· Личное сообщение · #21

Ara пишет:
Хм, вот теперь мне эта идея тоже кажется бредовой...

...обоснуй,пожалуйста ...
Ara пишет:
А что ты хочешь получить В ЦЕЛОМ?

...ну,а что здесь можно вообще получить - распакованный исполняемый файл.

P.S. Может ты что-то неправильно понял из моих объяснений ?
Протектор использует подгружаемую DLL, чтобы по мере надобности распаковывать исполняемый файл (в основном идёт декриптование названий функций).

-----
the Power of Reversing team





Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 01 августа 2005 00:50
· Личное сообщение · #22

я вообще не понял зачем такое нужно делать %) почему просто под отладчиком не поймать загрузку библы ?
ты лучше скажи для чего тебе это нужно (ну поймаешь програмно загрузку, дальше-то что ?) и что за прот.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 01 августа 2005 00:56
· Личное сообщение · #23

DillerInc пишет:
...обоснуй,пожалуйста

Марио обосновал вперед.
Mario555 пишет:
ты лучше скажи для чего тебе это нужно (ну поймаешь програмно загрузку, дальше-то что ?)




Ранг: 156.1 (ветеран), 5thx
Активность: 0.020
Статус: Участник
Капрал

Создано: 01 августа 2005 11:30
· Личное сообщение · #24

DillerInc пишет:
нам необходимо знать адрес,по которому эта DLL загрузилась.

Что ты нам всем мозги т..ешь, GetModuleHandle("name_of_Dll.dll");



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 01 августа 2005 14:40 · Поправил: arnix
· Личное сообщение · #25

DillerInc пишет:
Э...а можно,пожалуйста,исходник ?


хм, я дyмал он там есть... вот держи:

2a00_unGHF_0.3_with_src.rar




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 02 августа 2005 16:32
· Личное сообщение · #26

В общем,есть задумка создать некое подобие универсального распаковщика.
Mario555 пишет:
что за прот

... Visual Protect http://www.visagesoft.com/products/vp/index.php .
Mario555 пишет:
ну поймаешь програмно загрузку, дальше-то что ?

...как я уже говорил,восстановление названий системных функций происходит в специальной библиотеке протектора.Узнав базовый адрес её загрузки,мы сможем использовать его как стартовую точку для поиска определённых байт,в районе которых мы будем влиять на ход распаковки.
freeExec пишет:
GetModuleHandle("name_of_Dll.dll");

...да,кстати,действительно .
Только если я не ошибаюсь,данная функция возвращает дескрипторы тех модулей,которые загружены в вызывающий процесс,а как же поступить с чужим процессом ?

-----
the Power of Reversing team





Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 02 августа 2005 19:13
· Личное сообщение · #27

DillerInc пишет:
Только если я не ошибаюсь,данная функция возвращает дескрипторы тех модулей,которые загружены в вызывающий процесс,а как же поступить с чужим процессом ?

дык про внедрение в чужой процесс написано много, читай ;) а в твоём случае (написание динамического унпакера) я вообще не понимаю в чём проблема, ведь загрузка библы в отлаживаемый процесс является отладочным событием.



Ранг: 156.1 (ветеран), 5thx
Активность: 0.020
Статус: Участник
Капрал

Создано: 02 августа 2005 20:45
· Личное сообщение · #28

Тогда используй NtQuerySystemInformation из NTDLL.DLL




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 05 августа 2005 00:21
· Личное сообщение · #29

Ну и задолбался же я с этим кодом...
Ближе к делу - по совету Mario555 я стал использовать наиболее подходящий,на мой взгляд,вариант.
А именно:

var
sInfo : TStartupInfo;
pInfo : TProcessInformation;
dEvent : _DEBUG_EVENT;
Base : Cardinal;
dll_Name : array [0..MAX_PATH - 1] of Char;
begin
if CreateProcess(OpenFileName.lpstrFile, NIL, NIL, NIL, False,
DEBUG_ONLY_THIS_PROCESS, NIL, NIL, sInfo, pInfo) then
begin
repeat // начинаем бесконечный цикл ожидания отладочного события
WaitForDebugEvent(dEvent, INFINITE);
if dEvent.dwDebugEventCode = LOAD_DLL_DEBUG_EVENT then
{ Если отладочное событие - загрузка библиотеки,то... }
begin
PPointer(Base) := dEvent.LoadDll.lpBaseOfDll; // ...получаем базовый адрес загруженной библиотеки
if GetModuleBaseName(pInfo.hProcess, Base,
@dll_Name, SizeOf(dll_Name)) <> 0 then // Пытаемся получить имя библиотеки по её модулю...
begin
Break; // Если предыдущая функция удалась,то выходим из бесконечного цикла
end else MessageBox(Handle, 'Function failed', NIL, MB_OK);
DoExit; // Типа убиваем всё наповал :]
end;
ContinueDebugEvent(dEvent.dwProcessId, dEvent.dwThreadId, DBG_CONTINUE);
until False;

...так вот эта долбаная функция GetModuleBaseName ни под каким соусом не хочет возвращать мне имя модуля,возвращая всё время нуль .
В чём может быть проблема ?

-----
the Power of Reversing team




Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 05 августа 2005 16:43
· Личное сообщение · #30

Ara пишет:
Бред сивой кобылы

Гм... Вот прикольно было бы если любая прога могла в ядро что попало писать... Кста есть такая прога Chameleon Clock, так там прикол как раз в том, что прога умышленно делает попытку записи в ядро, при этом управление передается SEH-обработчику, а он передает его той ветке программы, которая работает в незареганой версии. Теперь обоснуй свое мнение... ИМХО писать что либо в область ядра не так просто...

-----
Research is my purpose



. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Опкод EBFE в начало системной функции
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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