Форум: "Потрепаться";
Текущий архив: 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