Сейчас на форуме: bartolomeo (+3 невидимых)

 eXeL@B —› Вопросы новичков —› Точка входа в Win Api функцию
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 08:15
· Личное сообщение · #1

Привет All, такой вопрос родился.
Есть у меня ехе, я туда дописывал функционал. Лечил с помощью OllyDbg, под ХР профессионал, вызов делал, типа.

PUSH 0
PUSH 0
PUSH 2222222222
PUSH 0
call MessageBoxA

так вот, на компах где стоит профессионал это все работает, а тут вчера кинул прогу на ХР Home edition и win 98, она быренько загнулась. Посмотрел, а адреса то оказывается у Win Api функций там другие. Как это можно лечить, получить этот адрес динамически? Каким образом? Или придется писать патч на каждую ось?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 09:04 · Поправил: Hellspawn
· Личное сообщение · #2

да можно, воспользуйся:

he GetProcAddress function returns the address of the specified exported dynamic-link library (DLL) function.
FARPROC GetProcAddress(

HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);

Parameters

hModule
Identifies the DLL module that contains the function. The LoadLibrary or GetModuleHandle function returns this handle.

lpProcName
Points to a null-terminated string containing the function name, or specifies the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the high-order word must be zero.

Return Values
If the function succeeds, the return value is the address of the DLL's exported function.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.


-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 27 марта 2006 09:39
· Личное сообщение · #3

Скорее всего адрес MessageBoxA уже есть в программе. Брать его нужно из IAT. А вот как, это тебе лучше почитать про IAT или какую нибудь мануалу по написанию вируса под Win32. Все доки есть на wasm'е.

-----
Yann Tiersen best and do not fuck




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 09:49
· Личное сообщение · #4

Да есть, а так же и CreateFileA, WriteFile, CloseHandle

Все доки есть на wasm'е.
Вот смотрю




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 19:31 · Поправил: Hellspawn
· Личное сообщение · #5

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

конечно тебе решать

-----
[nice coder and reverser]




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 19:44
· Личное сообщение · #6

я это и ковыряю, нашел кернел, ща разбираюсь с самими функциями




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 20:25
· Личное сообщение · #7

да чё там копать то?

s1:='MessageBoxA';
d1:=GetModuleHandle('KERNEL32.dll');
asm
PUSH s1
PUSH d1
CALL GetProcAddress
end;

вот и усё, не пойму в чём сложность

-----
[nice coder and reverser]




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 20:42
· Личное сообщение · #8

Ну во первых MessageBoxA относится к USER32, а во вторых, ты первый пост читал? Я ж скал, что работаю уже с готовым ехе, дорисовываю туда функционал и что у меня на других виндах, другие вызовы API и как ты предлагаешь воспользоваться ЭТОЙ API функцией, если адреса на которых они живут, ведут в некуда?????
Вот для того чтоб воспользоваться этой функцией мне нуно сначала вичислить где она живет, чем щас и занимаюсь. Вот что я нашел

wasm.ru/article.php?article=searchapi
forum.pascal.net.ru/showtopic=3679




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 20:50 · Поправил: Hellspawn
· Личное сообщение · #9

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

смотри есть ехе, в стандартном импотре почти всегда есть GetProcAddress...
так двигаемся дальше, как выглядит импотр в ехе

004132D6 |. FF15 30604100 CALL DWORD PTR DS:[004XXXXX]
где по адрессу 004XXXXX:
00416030 >86A858D8 Thunk to KERNEL32.GetModuleHandleA
86A858D8 - этот адресс в кажой винде будет разный...

просто пример!

надеюсь мысль ясна? или ещё разжевать?

-----
[nice coder and reverser]




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 21:01
· Личное сообщение · #10

не, ты помог и сильно твой код мне тоже нужен, но прежде чем я смогу им воспользоваться мне нужно получить адреса этих функций ))))), а то я уже замутил с фиксированными адресами, за что и поплатился, сегодня вечером мне сказали, что и на ХР професионал не везде работает.

ЗЫ. По первому линку сходи может поймешь очем я



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

Создано: 27 марта 2006 21:05 · Поправил: Klajnor
· Личное сообщение · #11

Попробуй в Olly поискать вызов интересующей тебя функции
Они могут быть в виде

call dword ptr ds:[401008]
(это 004020AA . FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarList>] ; MSVBVM60.__vbaFreeVarList )

или:
004596F2 |. E8 D3580000 call d3_.0045EFCA ; \MessageBoxA

0045EFCA $- FF25 00BA4600 jmp dword ptr ds:[46BA00] ; USER32.MessageBoxA



Gydvin пишет:
call MessageBoxA


И вместо такого вызова скармливаешь Olly вызов в подобном виде

PS А если прога эту функцию не использует, то нужно использовать метод Hellspawn/ Больше на ум ничё не приходит



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 21:09
· Личное сообщение · #12

Дата: Мар 27, 2006 20:50:19 · Поправил: Hellspawn New!

Вот чесно не понял о чем ты, можно подробнее

004132D6


Это что за адрес



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 21:12
· Личное сообщение · #13

Klajnor

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




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 21:33 · Поправил: Hellspawn
· Личное сообщение · #14

ты ничего не понял или не понял я...

(пример на реальной проге, у тебя другие адреса будут)
смотри тебе нужно вызвать ф-ию MessageBoxА, беру любую программу...
смотрю импорт, такой ф-ии нет! что делаю? ищу в импорте KERNEL32.GetProcAddress
опа нашёл! (как правило она есть) дальше смотрю как программ её вызывает!

0040D91E |. FF15 28604100 CALL DWORD PTR DS:[00416028]; \GetProcAddress
а что по адресу 00416028 ?
00416028 Thunk to KERNEL32.GetProcAddress
переходник на нужную нам функцию

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

-----
[nice coder and reverser]




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

Создано: 27 марта 2006 22:04
· Личное сообщение · #15

Gydvin

Если тебе нужен именно MessageBoxA, то он есть в любой проге на дельфи( у меня Delphi 7).
Даже в проге, которая абсолютно ничего не делает.

00402DD8 |. /75 13 jnz short Project2.00402DED
00402DDA |. |6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00402DDC |. |68 4C404000 push Project2.0040404C ; |Title = "Error"
00402DE1 |. |68 54404000 push Project2.00404054 ; |Text = "Runtime error at 00000000"
00402DE6 |. |6A 00 push 0 ; |hOwner = NULL
00402DE8 |. |E8 43E2FFFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00402DED |> \5A pop edx
00402DEE \. C3 retn


Для поиска вызова MessageBoxA используй RMB->Search for->All intermodular calls

В аттаче исходники и сама прога

Hellspawn пишет:
ищу в импорте KERNEL32.GetProcAddress
опа нашёл! (как правило она есть)
- а вот GetProcAddress там как раз и нету=)


f80e_Test2.rar.zip



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 марта 2006 22:15
· Личное сообщение · #16

ок, въехал спасибо

кстати можешь проследить последовательность, правильно ли я делаю.

поставил на вход GetProcAddress брейкпоинт GetProcAddress (77E7B332)
вывалился в оллу, посмотрел адрес возврата, там оказалось нечто подобное
004051DF |. E8 F4C0FFFF call <jmp.&kernel32.GetProcAddress> ; \GetProcAddress
при ближнем расмотрении это оказалось call 004012D8, переходим, там

004012D8 $-FF25 BC11A900 jmp dword ptr ds:[<&kernel32.GetProcAddr>; kernel32.GetProcAddress,
которое оказывается jmp dword ptr ds:[A911BC]
Все дальше не лезет. Вопрос насколько будет верным использовать call 004012D8 ?
И это должно работать везде?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 марта 2006 22:24 · Поправил: Hellspawn
· Личное сообщение · #17

Klajnor пишет:
а вот GetProcAddress там как раз и нету=)


а у меня прога на си была там не было... я привёл более сложный случай

Gydvin пишет:
Вопрос насколько будет верным использовать call 004012D8 ?


да вроде верно... можно конечно и jmp намутить...
Ос сама заполнит "ячейки" с импортом нужными адресами (для конкретной ос)
а ты просто переходишь на прыжок jmp dword ptr ds:[A911BC] - который дальше прыгнет,
куда надо

-----
[nice coder and reverser]




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

Создано: 27 марта 2006 23:16
· Личное сообщение · #18

Hellspawn пишет:
да вроде верно... можно конечно и jmp намутить...
Ос сама заполнит "ячейки" с импортом нужными адресами (для конкретной ос)
а ты просто переходишь на прыжок jmp dword ptr ds:[A911BC] - который дальше прыгнет,
куда надо
- call нужен, чтобы потом в прогу вернуться
Можно сделать call dword ptr ds:[A911BC]

Hellspawn пишет:
а у меня прога на си была там не было... я привёл более сложный случай
- чё-то мой уставший мозг сильно тупит... Никак не воткну в эту фразу =(

А вообще можно через LordPe добавить в импорт то что тебе нужно.
Ща сделал на WinXP Pro запустил на WinME - всё работает

Или можно сделать так, как это сделанно в аттаче( scr - оригинал, scr2 - мой вариант вообще без импорта)
И то и другое тестил на XP и на Me - работает



2ea7_Kernel.rar.zip



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 27 марта 2006 23:22
· Личное сообщение · #19

Все эти поиски в IAT - рулетка, имхо
Всё просто www.wasm.ru/article.php?article=vgw04



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 27 марта 2006 23:27
· Личное сообщение · #20

Klajnor
Sory, аттач не заметил.



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

Создано: 27 марта 2006 23:57
· Личное сообщение · #21

asd пишет:
Всё просто
- не мог осилить статью... Куча кода и там-же коменты...
Хотя принцип работы проги (качал с WASM'a вроде) понял

asd пишет:
Sory, аттач не заметил.
- ничего страшного. Может быть кому-то будет понятнее статья



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 марта 2006 00:15
· Личное сообщение · #22

Всем боооольшое спасибо, все заработало и на 98 тоже, оказывается все нужные функции были в импорте, я просто неумел его готовить А что делать первый опыт


 eXeL@B —› Вопросы новичков —› Точка входа в Win Api функцию
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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