Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Точка входа в процедуру...


Автор: kdaemonv 4.2.2006, 16:24
Вопрос в следующем:
имеется какая либо программа (к примеру виндовый сапер), и необходимо найти точку входа в процедуру обработки какого-либо события (к примеру, нажатие на кнопку начала игры, или выбор пункта меню, или срабатывание таймера, или ...).
С помощью каких утилит можно выцепить эту инфу?
И, насколько я понимаю, возможны варианты когда эту инфу можно выцепить напрямую из экзешника, а возможно придется и запускать экзешник (может некоторые объекты будут созданы динамически).

Здесь http://forum.vingrad.ru/index.php?showtopic=82319 я начал этот вопрос, но вразумительного ответа не получил. Я прошу не говорить, что мне нужно дизассемблировать программку. Я смотрел такие утилиты как WinSight32 из Дельфи и Spy++ из С++, но то ли я не догнал, где там можно найти инфу такого рода, то ли ее там нет.
Насколько я понимаю в винде все является окнами: form, button, label - это все графические объекты (а значит - окно, со своими событиями и свойствами; я конечно же могу быть ой как не прав - ну извините, можете по-ходу объяснить и этот вопрос). А значит когда приложение создает какой-то графический объект (окно, кнопку, надпись), оно должно где-то в системе регистрировать этот объект (наверное номер регистрации - хэндл smile) и адреса процедур отвечающих за обработку тех или иных событий. Вот эти адреса мне и нужны. А уж потом с помощью дизассемблеров и отладчиков я узнаю больше.
И еще: таймер в приложении ведь не графический объект (да и он не один такой). Как узнать адрес процедуры обработки срабатывания таймера или других событий неграфических объектов???

Автор: rsm 4.2.2006, 23:53
Цитата(kdaemonv @ 4.2.2006, 18:24 Найти цитируемый пост)
то ли ее там нет

Угадал.

Цитата(kdaemonv @ 4.2.2006, 18:24 Найти цитируемый пост)
Вот эти адреса мне и нужны

Пожалуйста, сколько угодно - перехватывай отладчиком вызов функций CreateWindowEx, DialogBox (и т.д.), а потом перехватывай вызовы оконных функций (см. MSDN). И будешь ты ловить все сообщения от всех контролов всех окон (включая диалоговые). Будет ли от этого польза - тебе виднее (раз уж ты так увлекся именно вызовами). Про таймеры - см. MSDN по SetTimer, SetWaitableTimer, ну и пожалуй плюс еще Sleep.
Для программ на Дельфи, которые по сути представляют собой интепретатор + скрипт формы, хорошо помогают проги типа Source Rescuer и DeDe - обычно, там можно сразу подсмотреть адрес функции, отвечающей за обработку какого-либо события.

Автор: kdaemonv 11.2.2006, 05:46
Спасибо rsm! Ты меня направил на путь истинный ;)

Хоть я и не матерый хакер, но пожалуй имею право тебя немного поправить (тем более, может кому-то понадобится такая же информация - не стоит заставлять его повторять мои поиски).
Я тут почитал установленные с Delphi файлы помощи MS SDK (я бы их не читал, не зная какую функцию мне искать) и выяснил что сначала в приложении заполняется структура WNDCLASS*.
Затем она регистрируется в системе функцией RegisterClass*. И лишь затем создается окно функцией CreateWindow*.
Так вот нужные мне данные это lpfnWndProc в классах WNDCLASS (если искать в стеке - второе двойное слово, начиная с адреса переданного процедуре RegisterClass* - то есть точки останова более результативно и логично ставить на процедуру RegisterClass) и WNDCLASSEX (третье двойное слово).

И пару ласковых относительно Delphi - ну они и намудровали smile.
Немного потанцевав с бубном вокруг простейшего приложения на Delphi (сильно не вникая - ну их), сделал следующее заключение:
при создании любого окна/контрола параметру lpfnWndProc присваивается ссылка на одну и ту же функцию InitWndProc (из модуля VCL/Controls), которая получая управление меняет этот параметр у уже созданного окна при помощи функции SetWindowLong* с параметром nIndex = GWL_WNDPROC. Так что, при отладке приложений, написанных на Delphi, стоит ставить точки останова и на процедуру SetWindowLong*.

Если кто-то хочет что-то уточнить - пишите, с удовольствием почитаю. А относительно таймеров еще не разбирался - скоро разберусь. Еще возникли вопросы вокруг DialogBox и MessageBox - но попробую сам разобраться - теперь хоть знаю в какую сторону рыть.

* - значит что я имею ввиду и родственные структуры и процедуры (WNDCLASSEX, CreateWindowsEx etc.)

Автор: rsm 12.2.2006, 00:00
Цитата(kdaemonv @ 11.2.2006, 07:46 Найти цитируемый пост)
сначала в приложении заполняется структура WNDCLASS

Не всегда smile Для окон стандартных классов ("static", "button" и т.д.) регистрация класса не требуется.

Цитата(kdaemonv @ 11.2.2006, 07:46 Найти цитируемый пост)
стоит ставить точки останова и на процедуру SetWindowLong

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

Автор: Maha 8.3.2006, 12:59
pohojay problema nahoju proceduri kotorie otve4ayt sa kakoeto deistvie w 4yjom processe i ho4y ih udaleno wisiwaty tak wot injecty etot process dopisiway tyda swoi code no wot wiswaty mne te proceduri ne udaetza proishodit ckrashe proceduri wot code:

Код

.386
.model flat,stdcall
option casemap:none

find_PID PROTO
myInject PROTO

include \masm32\include\windows.inc

include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

.const

.data?
hSnapshot dd ?
hProcess HANDLE ?
lpMemory HANDLE ?
dwTid HANDLE ?
need_memory dd ?


.data
pid HANDLE 0
szProcessName db "calc.exe",0
p_entry PROCESSENTRY32 <>


.code
start:
invoke find_PID
.if pid==0

.else
invoke myInject
.endif
invoke ExitProcess,0
find_PID proc
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
inc eax
test eax,eax
jz exit
dec eax
mov hSnapshot,eax
mov p_entry.dwSize,sizeof PROCESSENTRY32
invoke Process32First,hSnapshot,addr p_entry

test eax,eax
jz exit
jmp cmp__ 
p_next__:
mov p_entry.dwSize,sizeof PROCESSENTRY32
invoke Process32Next,hSnapshot,addr p_entry
test eax,eax
jz exit
cmp__:
invoke lstrcmp,addr szProcessName,addr p_entry.szExeFile 
test eax,eax
jz find_it__
jmp p_next__
find_it__:
mov eax,p_entry.th32ProcessID
mov pid,eax
invoke CloseHandle,hSnapshot
exit: 
ret
find_PID endp
myInject proc
jmp backdoor_code_end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
backdoor_code:
pushad


lea eax,dword ptr [0101247Ch]
call eax



popad
xor eax,eax
ret
backdoor_code_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lea eax,backdoor_code_end
lea ecx,backdoor_code
sub eax,ecx
mov need_memory,eax

invoke OpenProcess,PROCESS_ALL_ACCESS or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD or PROCESS_CREATE_PROCESS,FALSE,pid
test eax,eax
jz exit__
mov hProcess,eax
invoke VirtualAllocEx,hProcess,0,need_memory,MEM_COMMIT,PAGE_EXECUTE
test eax,eax
jz exit__
mov lpMemory,eax

invoke WriteProcessMemory,hProcess,lpMemory,addr backdoor_code,need_memory,0
dec eax
test eax,eax
jnz exit__
inc eax


invoke CreateRemoteThread,hProcess,0,0,lpMemory,lpMemory,0,0
exit__:
invoke CloseHandle,hProcess
ret
myInject endp
End start



4ital 4to mojno eshe DLL , no kakto prosto tupo wresaty w virtualku swoi code mne bolshe nrawitza

problema w tom kak prawelno wisiwaty eti proceduri smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)