*Начало * Ответить * Статистика * Задать вопрос * Поиск * FAQ * * |
DotFix Forum / Вопросы программирования и исследования защит / Нахождение VBHeader |
Автор | Сообщение |
Bonez92 Участник |
Дата: 15 Янв 2009 14:36 Привет всем! Я хочу создать программу для нахождения адреса VBHeader т.е. например: У каждой программы на ВБ есть такой код: PUSH XXX CALL ThunRTMain И моя программа должна найти значение XXX Вот план моей программы (МП): 1. МП запускает жертву с помощью CreateProccess с параметром CREATE_SUSPENDED; 2. "Втиривает" ApiHooks в этот процесс; 3. Устанавливаем хук на ThunRTMain с помощью ApiHooks; 4. Запускаем жертву на выполнение (Типа ResumeThread); 5. Как только дошли на установленного хука (ThunRTMain), узнаем последнее значение стека. Это и будет нащ XXX Теперь вот мои проблемы: - Я не знаю как пользоваться ApiHooks-ом; - Как втырить "ApiHooks.dll" НЕ с помощью ApiHooks.exe; - Я не знаю как узнать последнее значение стека (ИЛИ как выполнить 5-ый пункт); Кто нибудь, помогите мне. Пожайлуста. |
Admin Администратор |
Дата: 17 Янв 2009 05:51 А зачем так трудно? Считать эти XXX из EXE статически не судьба? |
Bonez92 Участник |
Дата: 17 Янв 2009 14:01 А если EXE запакован? ПС: Я знаю как читать XXX обычным способом. |
Admin Администратор |
Дата: 18 Янв 2009 06:26 Quoting: Bonez92 А если EXE запакован? Распаковать. Мой VB Decompiler именно так и работает. |
Bonez92 Участник |
Дата: 20 Янв 2009 14:00 [quote=GPcH]Распаковать. Мой VB Decompiler именно так и работает.[/quote] VB Decompiler - хорошая программа, однако ей невозможно пользоваться (из-за слабых свойств моего ПК). Я хотел бы узнать XXX без использования других средств (кроме VB и АпиХукс). Но не знаю как. План есть. Но проблемы этого плана не решены. |
Admin Администратор |
Дата: 21 Янв 2009 03:43 Quoting: Bonez92 VB Decompiler - хорошая программа, однако ей невозможно пользоваться (из-за слабых свойств моего ПК). Поподробнее пожалуйста. В принципе даже на первом пне должно все работать. |
entusiast Участник |
Дата: 22 Янв 2009 22:01 * Поправил: entusiast А вот интересно, кстати. Если пакованной проге превентивно прикрутить msvbvm60.dll, поймается ли она пакером. Т.е. CreateProcess(...,CREATE_SUSPENDED,..); VirtualAllocEx()/WriteProcessMemory()/CreateRemoteThread (bonez92, это один из методов внедрения кода) а в этом треде кроме всего прочего вписать: LoadLibrary("msvbvm60.dll"); LoadLibrary("ApiHooks.dll"); то потом пакер/прот возмется же за LoadLibrary(), а та вернет существующий хендл. Ну и хукай сколько влезет, хоть стаб на всю дллку пиши и грузи вместо реальной, если не лень А вот если не хочешь готовый хукер юзать, то вариантов множество может быть от дебага, до своей дллки и инлайнового перехвата. Узнать стек "своего" потока - регистр esp. Чужого - OpenThread(); GetThreadContext(); из полученной структуры взять esp, потом прочитать 4 байта с нужного смещения относительно esp. Так, например, если у тебя "стоп" на входе в ThunRTMain, то тебе надо взять dword ptr [esp+4] ( [esp] будет адрес возврата - OEP+(кажется)0Ah). В своем процессе не проблема, в чужом - ReadProcessMemory(). |
Bonez92 Участник |
Дата: 23 Янв 2009 14:24 GPcH Pentium 2, ~330MHz, 64 Mb RAM открывается медленно и закрывать лучше через Ctrl+Alt+Del. А так свое дело делает. (Я про Лайт версию). entusiast OpenThread(); GetThreadContext(). Можно подробнее. Если можно на VB. |
Admin Администратор |
Дата: 25 Янв 2009 00:06 Bonez92 Если добавить памяти до 128 мегабайт и использовать Pro версию - все будет гораздо приятнее. Хотя это мое мнение. Quoting: Bonez92 OpenThread(); GetThreadContext(). Можно подробнее. http://www.google.com/codesearch?hl=en&lr=&q=OpenThread+lang%3A%22basi c%22&sbtn=Search |
Bonez92 Участник |
Дата: 25 Янв 2009 08:08 [quote=GPcH]http://www.google.com/codesearch?hl=en&lr=&q=OpenThread+la ng%3A%22basi c%22&sbtn=Search[/quote] Спасибо, попробую. Остались следующие проблемы: [quote=Bonez92] - Я не знаю как пользоваться ApiHooks-ом; - Как втырить "ApiHooks.dll" НЕ с помощью ApiHooks.exe;[/quote] |
entusiast Участник |
Дата: 29 Янв 2009 02:48 * Поправил: entusiast Ну, как пользоваться именно ApiHooks.dll я тоже не знаю - в глаза ее не видел Как самому хучить - это пожалуйста. Насчет внедрения: 0. Проще всего это дело пишется на С + асм, тем более, что MSVC разрешает использовать асмовые вставки и объявлять функции как naked - без обвязки в виде стекового фрейма и SEH, т.е. пишешь как на "чистом" асме. Пример слишком здоровый, чтобы вставить его сюда, а аттачи я не нашел как тут приделать. Задача его вот какая - найти пару LoadLibrary & GetProcAddress (это дешевле всего, ибо ручной маппинг дллки требует много чего из Kernel32. Определить имя дллки (я кладу его в блок данных, но можно и пофиксить) Вызвать LoadLibrary на свою дллку. Дальше зависит от длл, если там все делается в пределах DllMain (и/или инициализации глобальных переменных/объектов), то на этом и все. Если же инициализация вынесена в отдельную экспортированную функцию, то через GetProcAddress (ну, или если нравится долго и муторно писать на асме, то ручным поиском) получить ее адрес. А потом вызвать. Все. Длл загружена и инициализирована. 1. CreateProcess отдает хендлы процесса и первичного треда - OPenThread в этом случае - не нужен. Иначе - смотри в MSDN, там подробно и понятно написано. VirtualAllocEx, ReadProcessMemory, WriteProcessMemory - смотри в MSDN. 2. Что такое базонезависимый код, знаешь? Тебе нужен именно такой кусок, который в какое место ни воткни - разберется с переходами внутри себя. Если не разберешься, напиши, скину пример. Хотя, лучше разберись сам - полезнее на порядок. 3. В комплекте с кодом надо передать шмат данных, если тебе нужно пользоваться API. В ХП базы kernel32.dll & ntdll.dll в любом процессе системы одинаковы. Следовательно, одинаковы и адреса функций. Как в Висте - не знаю, не смотрел. Соответственно, забрасываешь либо вместе с кодом, либо так же как код. Если все параметры жестко фиксированы и можешь их прописать сразу в код - данные не понадобятся. Мне проще было передать, бо лень патчить себя лишний раз. 4. В код надо передать адрес шмата из п.3 - проще всего, параметром в CreateRemoteThread. Если не хочется использовать CreateRemoteThread, придется извращаться с потоком. Условие первое - первичный поток нельзя завершать, завершится процесс-жертва. С передачей параметров тоже сложнее. Хотя, в этом случае, прототип внедряемой функции может быть любым, не только DWORD __stdcall ThreadFunc(LPVOID). Вариантов -масса на самом деле. Пример - вычитывание данных из жертвы. Окружение куска - запуск процесса "на отладку", расстановка где надо int 3 и при срабатывании WaitForDebugEvent(), после проверки евента и еще кучи параметров. CONTEXT ThrCtx; ...... //Get part of serialNumber /* eax->VariantBstrByRef [eax]+8->Bstr */ wchar_t SerialPart[100];// заведомо меньше 99 байт memset(SerialPart,0,sizeof(wchar_t)*100); DWORD Address,PartSize; ReadProcessMemory(hProcess,(LPVOID)(ThrCtx.Eax+8),&Address,4,NULL){ { Ну, дальше там ContinueDebugEvent и так далее. Если ты хочешь перехватить поток на EntryPoint, то делаешь с контекстом потока что надо, потом resumeThread() и далее по коду. Можешь потом вернуть управление на EP, можешь не возвращать, если не нужно... PS. Маленько запутано, похоже, вышло.... Как всегда. Если вопросы будут, GPcH в курсе где меня искать Edit1: Вся эта тряхомут(д)ь гарантировано работает "из под админа". В иных условиях - не проверял. Но запросто могут не дать PROCESS_ALL_ACCESS. И еще, перед записью в чужой процесс, лучше бы перепротектить тамошнюю память через VirtualProtectEx. Адреса в чужом процессе - не то же самое, что адреса в текущем (это на всякий случай). |
Bonez92 Участник |
Дата: 1 Фев 2009 07:26 entusiast Я не совсем понял твоё сообщение. Может быть попунктно? А то не понимаю никак. |
Admin Администратор |
Дата: 3 Фев 2009 00:40 Quoting: Bonez92 Я не совсем понял твоё сообщение. Может быть попунктно? А то не понимаю никак. Разжевано от и до. Если непонятно - значит пока рано тебе заниматься такими вещами. |
entusiast Участник |
Дата: 10 Фев 2009 19:05 Bonez92, а что именно не понятно? По пунктам. Мне не влом рассказать, только я тут нечасто бываю. |
Bonez92 Участник |
Дата: 15 Фев 2009 07:30 Есть хэндл процесса и треда. Теперь как вытащить последнее значение стека? И зачем SetThreadContext(hThread,&ThrCtx)? |
entusiast Участник |
Дата: 21 Фев 2009 19:43 Значение стека (регистра esp) берется из переменной типа CONTEXT, заполненной вызовом GetThreadContext(,) Если надо взять значение, которое в стеке лежит - дополнительно ReadProcessMemory() SetThreadContext() позволяет заместить существующий контекст на заданный. Например, для замены eip, esp, или других регистров. В примере мне надо было вычистить остатки перехвата, поправить регистры, очистить стек от параметров, которые там не нужны стали, ну и пропустить, собственно, ненужный мне код. Вот и все. Да, теперь вижу, прозевал скопировать вызов GetThreadContext().... Там вот так: ThrCtx.ContextFlags=CONTEXT_ALL; GetThreadContext(hThread,&ThrCtx); |