DotFix ::: Software protection portal
 °Начало ° Ответить ° Статистика ° Задать вопрос ° Поиск ° 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-ый пункт);

Кто нибудь, помогите мне. Пожайлуста.

GPcH
Администратор


Дата: 17 Янв 2009 05:51


А зачем так трудно? Считать эти XXX из EXE статически не судьба?

Bonez92
Участник


Дата: 17 Янв 2009 14:01


А если EXE запакован?

ПС: Я знаю как читать XXX обычным способом.

GPcH
Администратор


Дата: 18 Янв 2009 06:26


Quoting: Bonez92

А если EXE запакован?


Распаковать. Мой VB Decompiler именно так и работает.

Bonez92
Участник


Дата: 20 Янв 2009 14:00


[quote=GPcH]Распаковать. Мой VB Decompiler именно так и работает.[/quote]

VB Decompiler - хорошая программа, однако ей невозможно пользоваться (из-за слабых свойств моего ПК).

Я хотел бы узнать XXX без использования других средств (кроме VB и АпиХукс). Но не знаю как. План есть. Но проблемы этого плана не решены.

GPcH
Администратор


Дата: 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.

GPcH
Администратор


Дата: 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){ { 
; } } ReadProcessMemory(hProcess,(LPVOID)(Address-4),&PartSize,4,NULL); ReadProcessMemory(hProcess,(LPVOID)Address,SerialPart,PartSize*sizeof (wchar_t),NULL); wcscat(Serial,SerialPart); //now skip call remains and set result of TestNe to FALSE ThrCtx.Eip+=6; ThrCtx.Esp+=8; ThrCtx.Eax=0; SetThreadContext(hThread,&ThrCtx);



Ну, дальше там ContinueDebugEvent и так далее.
Если ты хочешь перехватить поток на EntryPoint, то делаешь с контекстом потока что надо, потом resumeThread() и далее по коду.
Можешь потом вернуть управление на EP, можешь не возвращать, если не нужно...

PS. Маленько запутано, похоже, вышло.... Как всегда. Если вопросы будут, GPcH в курсе где меня искать

Edit1:
Вся эта тряхомут(д)ь гарантировано работает "из под админа". В иных условиях - не проверял. Но запросто могут не дать PROCESS_ALL_ACCESS.
И еще, перед записью в чужой процесс, лучше бы перепротектить тамошнюю память через VirtualProtectEx.
Адреса в чужом процессе - не то же самое, что адреса в текущем (это на всякий случай).

Bonez92
Участник


Дата: 1 Фев 2009 07:26


entusiast
Я не совсем понял твоё сообщение. Может быть попунктно? А то не понимаю никак.

GPcH
Администратор


Дата: 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); 


Ваш ответ

Bold Style  Italic Style  Underlined Style  Image Link  Insert URL  Email Link  Код 
... Отменить *Что это?


Перед отправкой "нелатинского" текста проверьте кодировку броузера!
 » Логин  » Пароль