Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выполнение функции  (Прочитано 15034 раз)
0 Пользователей и 1 Гость смотрят эту тему.
VetalGAN
Гость
« : 03-05-2007 15:57 » 

Как отследить выполнение функции?
Что, чего, кому передаёт? Куда возвращает результат?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 03-05-2007 16:47 » 

а какая среда программирования ?
Записан

VetalGAN
Гость
« Ответ #2 : 03-05-2007 21:02 » 

OC Windows
c/c++
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 03-05-2007 21:30 » 

VetalGAN, А в каком IDE ты пишеш проги?
Просто окна Watch и трэйсеры чуть по разному работают у Visual C++ и Borland C++ Builder
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
VetalGAN
Гость
« Ответ #4 : 04-05-2007 09:00 » 

Visual C++
как пример надо разобрать функцию close handle
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 04-05-2007 16:00 » 

делай так :

CloseHandle(...); // тут поставить чекпоинт F9
int iii=1;// тут тоже поставить чекпоинт F9

запуск отладки - F5 , когда остановится на функции , жмёшь F11 для входа в функцию (F10 - выполнить, не входя). Второй чекпоинт для того, чтоб находясь в функции, можно было спокойно в любой момент нажать F5 и остановиться как раз после функции (а можно просто шифт+F11)

--------
только по моему тебе не дадут посмотреть , как устроена эта функция )
Записан

VetalGAN
Гость
« Ответ #6 : 04-05-2007 18:16 » 

а никто не занимался вот такой проблемой
написать простую программу которая вызывает простую функцию допустим closehandle
откомпилировать её
запустить в дизассемблере и посмотреть как идет выполнение программы по шагам тоесть в регистр такой то записывается тото в регистр такой тото может в стек что помещается и посмотреть на выполнение проги тоесть что нужно записать  в регистры чтобы вызвать функцию с параметрами и как это сделать
может у кого нибуть есть какая нибуть информация
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 04-05-2007 18:43 » 

VetalGAN,  а зачем ? Пусть винда сама всё делает...

написал я строку
Код:
	CloseHandle((HANDLE)0);

дизассемблер показывает (во время отладки жми alt+8)

Код:
125:      CloseHandle((HANDLE)0);
00404062   mov         esi,esp
00404064   push        0
00404066   call        dword ptr [__imp__CloseHandle@4 (0041c630)]
0040406C   cmp         esi,esp
0040406E   call        _chkesp (00406010)

На строке 00404066 я перехожу  (F11) в функцию , там
Код:
77E77963   mov         eax,fs:[00000018]
77E77969   mov         ecx,dword ptr [eax+30h]
77E7796C   mov         eax,dword ptr [esp+4]
77E77970   cmp         eax,0F4h
77E77973   je          77E72DC5
77E77979   cmp         eax,0F5h
77E7797C   je          77E72DBA
77E77982   cmp         eax,0F6h
77E77985   je          77E9C99A
...
...
...
и много ещё )

  Смотри, разбирайся... У меня лично нету желания )

« Последнее редактирование: 04-05-2007 18:46 от Алексей1153++ » Записан

VetalGAN
Гость
« Ответ #8 : 04-05-2007 19:12 » 

для того что бы зная это можно будет подумать как обратиться к функции напрямую
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 04-05-2007 20:24 » 

VetalGAN,
Код:
125:      CloseHandle((HANDLE)0);
00404062   mov         esi,esp
00404064   push        0
00404066   call        dword ptr [__imp__CloseHandle@4 (0041c630)]
Я думаю, более прямого обрашения, чем это сделал компилятор, ты все равно не придумаеш. Все остальное это пляски с бубном.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 05-05-2007 11:19 » 

VetalGAN, а ты думаешь, что компилятор полностью разворачивает функции API что ли?
Это совсем не так. Чтобы узнать как работает CloseHandle, нужно найти dll-ку, в которой реализована функция (я не помню и искать сейчас мне лень). Потом найти начальный адрес адрес функции (обычно dumpbin помогает), потом дизассемблировать библиотеку и изучать функцию, только так. При этом придется еще идентифицировать довольно много структур.

Можно действительно посмотреть дизассемблированный код во время отладки, но это очень неудобно, еще неудобнее, чем все вышеописанное.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
VetalGAN
Гость
« Ответ #11 : 07-05-2007 10:04 » 

"VetalGAN, а ты думаешь, что компилятор полностью разворачивает функции API что ли?"
нет конечно я так не думаю!
а если просто дизассемблировать программу которая выполняет эту функцию? так нельзя?
И вообще может кто нибуть уже занимался этим и осталась какая нибуть информация(ну например разобрана какая нибуть функция)? Прошу пришлите мне!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 07-05-2007 12:59 » 

VetalGAN, что значит "программу которая выполняет эту функцию" ?  Программа вызывает эту функцию...
Записан

Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 07-05-2007 19:24 » 

а если просто дизассемблировать программу которая выполняет эту функцию? так нельзя?
И вообще может кто нибуть уже занимался этим и осталась какая нибуть информация(ну например разобрана какая нибуть функция)? Прошу пришлите мне!

VetalGAN, так можно Улыбаюсь Я же писал выше... Только "программа, выполняющая эту функцию" - это библиотека Windows. CloseHandle реализована в kernel32.dll
Как ты, я надеюсь, понимаешь, дизассемблировать без особенной надобности (ну или огромного энтузиазма) огромные майкрософтовские библиотеки - это не то занятие, которым каждый второй готов заняться Улыбаюсь.

У меня нет ни одной разобранной библиотеки Windows поэтому и примером я тебе помочь не могу. Не думаю, что у кого-то здесь это хозяйство случайно завалялось. Можешь спросить у маньяков с wasm.ru или найти дизассемблер (лучше всего IDA) и дизассемблировать библиотеку самостоятельно.

Учти, что в процессе выяснится, что CloseHandle вызывает добрую половину всех безымянных внутренних функций библиотеки и тебе придется исследовать и их видимо тоже. Довольно медитативная работа Улыбаюсь причем ее результативность сильно зависит от качества дизассемблера. Но, и в этой работе есть своя прелесть Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Vlaor
Гость
« Ответ #14 : 08-05-2007 12:35 » 

Самое смешное в том, что основная часть (если не вся) происходит на уровне ядра. Я не знаю все ли, но большинство функций API просто вызывают соответствующую функцию ядра. Да и HANDLE это указатель на обьект ядра. В User Mode мало что тут можно сделать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines