Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с CALL   Найти похожие ветки 

 
Хинт ©   (2005-12-03 12:54) [0]

Вот последовательность байт в файле:
E8B9C7FFFF
E8=CALL, а что же идет дальше? Я подумал, что адрес, но оказалось что это не так. Помогите разобраться.


 
Lamer@fools.ua ©   (2005-12-03 13:37) [1]

>E8=CALL, а что же идет дальше?

Дальше идёт смещение относительно следующей инструкции, AFAIR. А вообще читайте мануал (от Intel и AMD сотоварищи), оно рулез.


 
begin...end ©   (2005-12-03 13:41) [2]

ИМХО, если первое в CALL -- это E8, то дальше -- это относительный адрес (смещение) команды, на которую передаётся управление. Задом наперёд, конечно.


 
begin...end ©   (2005-12-03 13:42) [3]

> Lamer@fools.ua ©   (03.12.05 13:37) [1]

Сорри, не видел [1], когда свой ответ писал.


 
Хинт ©   (2005-12-03 14:00) [4]

Что-то я совсем запутался... уже часов 5 пытаюсь разобраться.

В программе пишу TerminateProcess(OpenProcess(...),0), компилирую, открывая IDA"ой.

IDA показывает
CODE:00407D86                 push    0               ; uExitCode
CODE:00407D88                 mov     eax, [ebx]
CODE:00407D8A                 push    eax             ; dwProcessId
CODE:00407D8B                 push    0               ; bInheritHandle
CODE:00407D8D                 push    1               ; dwDesiredAccess
CODE:00407D8F                 call    OpenProcess
CODE:00407D94                 push    eax             ; hProcess
CODE:00407D95                 call    TerminateProcess


Смотрю последнюю строку в HEX"е:
E8 A6 C7 FF FF
Перехожу по CALL (двойной щелчок =):

CODE:00404540 ; BOOL __stdcall TerminateProcess(HANDLE hProcess,UINT uExitCode)
CODE:00404540 TerminateProcess proc near              ; CODE XREF: start+65p
CODE:00404540                 jmp     ds:__imp_TerminateProcess
CODE:00404540 TerminateProcess endp


Перехожу по JMP (опять же двойной щелчок =):
.idata:0040A178 ; BOOL __stdcall __imp_TerminateProcess(HANDLE hProcess,UINT uExitCode)
.idata:0040A178                 extrn __imp_TerminateProcess:dword
.idata:0040A178                                         ; DATA XREF: TerminateProcessr


И в итоге ничего не понимаю. Как же происходит вызов WinAPI функции?


 
Alex Konshin ©   (2005-12-03 14:06) [5]

Так и происходит. А в каком месте непонятно-то?


 
begin...end ©   (2005-12-03 14:11) [6]

> Хинт ©   (03.12.05 14:00) [4]

> Смотрю последнюю строку в HEX"е:
> E8 A6 C7 FF FF

FF FF C7 A6 = - 00 00 38 5A

Вопросы есть?


 
Хинт ©   (2005-12-03 14:15) [7]

Объясню свою задачу. Есть приложение, которое запущено на моем компьютере (выполняет определенные нужные мне функции). Разработчик этой программы, непонятно зачем, также встроил функцию, которая каждые 10 секунд просматривает список процессов, и делает TerminateProcess тем, которые ей не нравятся (в этот список входит нужная мне программа).
Получается мне надо запретить программе делать TerminateProcess. Оказалось, что это не так просто. Вот я и хочу разобраться, как происходит вызов API функции. Что надо подправить (какие команды заменить NOP"ами), чтобы программа не утратила своей работоспособности, но при этом не убивала другие приложения.
Такой вариант, как перестать пользоваться этой программой, не подходит.


 
begin...end ©   (2005-12-03 14:17) [8]

00407D95 + 00000005 - 0000385A = 00404540


 
Хинт ©   (2005-12-03 14:22) [9]


> 2begin...end
> 00407D95 + 00000005 - 0000385A = 00404540

Спасибо, с этим разобрался.

Вопрос в том, как найти этот call в АП чужого процесса...
Я наивно пологал, что там будет что-то наподобии CALL TerminateProcess (утрированно)


 
umbra ©   (2005-12-03 14:30) [10]

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

Лучшие отладчики - WinIce (денег стоит) и OllyDbg (бесплатно, http://www.ollydbg.de/)


 
VirEx ©   (2005-12-03 14:30) [11]

вызов API функции происходит (естественно если считать что это Intel 8x инструкции) так:
function primer(первый_параметр, второй_параметр ..., последний_параметр):boolean;
1) в стек заносятся параметры функции в обратном порядке:
pop адрес_последнего_параметра
pop ...
pop адрес_второго_параметра
pop адрес_первого_параметра
call @primer
теперь в eax результат функции primer, в данном случае переменная boolean

в твоём примере адрес функции находится в сегменте данных .idata
это делает компилятор специально для того чтобы при вызове функции просто в jmp или call указать адрес функции который находится во вспомогательном сегменте .idata, типа такая "база функций в одном месте", так удобней вызывать функции не один раз


 
Кефир87 ©   (2005-12-03 18:00) [12]

VirEx, не pop а push 8)


 
VirEx ©   (2005-12-03 18:03) [13]


> Кефир87 ©

ойй ёё :) ну всё, уже совсем не соображаю блин :)


 
Хинт ©   (2005-12-03 19:04) [14]

Нда... Как же определить место вызова TerminateProcess...
Попробую воспользоваться Olly. Подскажите как в этой программе поставить брекпоинт на эту функцию?


 
Kerk ©   (2005-12-03 20:21) [15]

Хинт ©   (03.12.05 19:04) [14]
Как же определить место вызова TerminateProcess...


В общем случае никак. Генерируемый код зависит от компилятора. Лучше поставь брекпоинт на саму TerminateProcess и посмотри стек.


 
DrPass ©   (2005-12-03 22:15) [16]


> Как же определить место вызова TerminateProcess...

В каком она модуле? kernel32.dll? Тогда нужно выяснить адрес, по которому загружен этот модуль, посмотреть его таблицу экспорта... а дальше уже как фантазия подскажет.


 
Kerk ©   (2005-12-03 22:19) [17]

DrPass ©   (03.12.05 22:15) [16]
В каком она модуле? kernel32.dll? Тогда нужно выяснить адрес, по которому загружен этот модуль, посмотреть его таблицу экспорта...


GetModuleHandle + GetProcAddress спасут отца русской демократии :) Если только автор вирус не пишет :)


 
vvvaaa   (2005-12-03 23:41) [18]


> Получается мне надо запретить программе делать TerminateProcess.
>  Оказалось, что это не так просто. Вот я и хочу разобраться,
>  как происходит вызов API функции. Что надо подправить (какие
> команды заменить NOP"ами)

Это можно реализовать только при условии, что файл не запакован (что последнее время встречается редко :((( ). Если пользоваться IDA 4.7 и выше, то там есть встроенный отладчик, который весьма неплохо работает


 
DrPass ©   (2005-12-04 00:01) [19]


> Это можно реализовать только при условии, что файл не запакован

А какая разница? В памяти-то все равно распакуется. Вот там и работать.

> (что последнее время встречается редко

Да прям уж


 
Хинт ©   (2005-12-04 11:04) [20]

Программа запакована, но в любом случае я хотел править АП процесса.
Запускаю OllyDbg, нажимаю Open, выбираю нужную программу, нажимаю Run... а что делать после этого? Как поставить BreakPoint на вызов TerminateProcess?



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1133794086
Витёк####
2005-12-05 17:48
2005.12.25
путь к dll


2-1134208558
wardoc
2005-12-10 12:55
2005.12.25
Проблемы с окном StayOnTop


1-1133163488
Alp
2005-11-28 10:38
2005.12.25
Диаграммы Excel


9-1122456076
Дед с Морковкой
2005-07-27 13:21
2005.12.25
Формат рисунка dds.


6-1126615798
NikNet
2005-09-13 16:49
2005.12.25
Где скачать Locker? и WinLocker?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский