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

 eXeL@B —› Основной форум —› Помогите разобраться с Delphi.
Посл.ответ Сообщение

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

Создано: 10 января 2007 18:31
· Личное сообщение · #1

Я новичок. Почитал статьи и топики, но нужной информации не нашел. Хотелось бы разобраться с
кодом который генерирует Delphi. Я декомпильнул экзешник с помощью DeDe. Нашел в нем ButtonClick.
А дальше в этой процедуре вызывается другая следующим способом call dword ptr [ecx+$34]. Я так понимаю это озночает, что либо она виртуальная, либо её адрес определяется серийником.
Целиком выглядит так


0050BD38 A150C45D00 mov eax, dword ptr [$005DC450]
0050BD3D 8B00 mov eax, [eax]
0050BD3F 8B08 mov ecx, [eax]
* Possible reference to virtual method <UnknownType>.OFFS_34
0050BD41 FF5134 call dword ptr [ecx+$34]


Кроме того, хотелось бы понять как мне декомпильнуть уже эту процедуру с помощью DeDe. Почему-то мне её не найти (Я делаю это поиском по сгенерированым с помощью DeDe файлам адреса процедуры или редкой инструкции в ней).

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

Большое спасибо. Ссылки на статьи по работе с кодом Delphi (в том числе английские) тоже привествуются.



Ранг: 123.7 (ветеран)
Активность: 0.10
Статус: Участник
1nn0$/100

Создано: 10 января 2007 18:47 · Поправил: 1nn0cent
· Личное сообщение · #2

tarakan, эта процедура -- метод какого-то класса. Соответственно в ECX указатель на класс, а ECX+$34 -- указатель на процедуру. Судя по
tarakan пишет:
<UnknownType>
,
класс самописный.
Как вариант, можно брякнуться на 0050BD3F и войти в эту процедуру. Посмотреть адрес начала. И его уже искать в DeDe.

-----
Blame the victim!





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 10 января 2007 20:32
· Личное сообщение · #3

tarakan пишет:
* Possible reference to virtual method <UnknownType>.OFFS_34
0050BD41 FF5134 call dword ptr [ecx+$34]

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




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 10 января 2007 22:35
· Личное сообщение · #4

tarakan, что то я не понял судь вопросв... Нужно зайти в нее?

-----
-=истина где-то рядом=-




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

Создано: 11 января 2007 02:24
· Личное сообщение · #5

Спасибо. за ответы.
То, что адрес находится трейсом это понятно. Я этот адрес знаю. Проблема в том, что мне хочется
посмотреть на эту процедуру через DeDe. То есть у меня адрес процедуры есть, и судя
по софтайсу и IDA сама процедура тоже есть, но почему то DeDe её не дампит.
P.S. Хочу посмотреть в DeDe потому, что в этом классе скорей всего используются всякие дельфийские вызовы (типа те которые DeDe возможно сможит зарезолвить).




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 11 января 2007 02:55
· Личное сообщение · #6

tarakan попробуй в PE Explorer-е деассемблировать, может покажет твою процедуру...

-----
-=истина где-то рядом=-




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 11 января 2007 03:00
· Личное сообщение · #7

tarakan пишет:
То, что адрес находится трейсом это понятно. Я этот адрес знаю. Проблема в том, что мне хочется
посмотреть на эту процедуру через DeDe.

Так и ищи этот адрес в файлах, которые DeDe выдает. Только для самописных классов может ничего и не найти.




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

Создано: 11 января 2007 03:08 · Поправил: PE_Kill
· Личное сообщение · #8

tarakan используй сигнатуры для IDA от TQN лежат на wasm.ru, не хуже DeDe помогают.

ЗЫ А DeDe дизасмит только то, что находит по сигнам и референсам, значит понятного ему референса он не нашел

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




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

Создано: 11 января 2007 04:18
· Личное сообщение · #9

А если я заменю в инструкции call dword ptr [ecx+$34] адрес на фактический и сделаю в DeDe дамп
процесса, то он сможет найти эту функцию?



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

Создано: 11 января 2007 04:25
· Личное сообщение · #10

PE_Kill
Что-то я не нашел сигнатуры от TQN на wasm'e




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 07:14
· Личное сообщение · #11

tarakan
В dede есть кнопочка OFFS - Go to VA - ее жмешь и вводишь адрес процедуры.
Все сигнатуры библиотек накладываются обычно правильно, но иногда может вылететь ошибка - cannot read memory - значит что-то не может опознаться. Но в целом все ок.



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

Создано: 11 января 2007 07:32 · Поправил: tarakan
· Личное сообщение · #12

HoBleen
Большое спасибо. сегодня попробую. Только не понимаю, почему, если он знает о существовании данного кода, он не хочет его дампить. Из-за того, что не указывается явный адрес функции и типа соответственно нет на него референса? Тогда если я заменю вызов call dword ptr [ecx+$34] на что-нить типа call $00474634 он сможет его определить?

P.S. Дело в том, что процедура располагающаяся по данному адресу содержит ещё кучу разных вызывов и вообще сложную логику. Глупо задавать вопрос, что мне делать. Но может быть есть какие-нибудь способы как-нибудь облегчить себе жизнь. Судя по тому, что вызывается эта функция методом описанным выше, то это целый класс, занимающийся проверкой валидности серийного номера. Кроме того, даже если я узнаю алгоритм проверки, мне ещё придется вычислить обратныю функцию. Мне страшно. Скажите что-нибудь воодушевляющее.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 07:47
· Личное сообщение · #13

tarakan пишет:
Тогда если я заменю вызов call dword ptr [ecx+$34] на что-нить типа call $00474634 он сможет его определить?

Конечно. Просто дело в том что метод - виртуальный, до его вызова неизвестно на какой адрес будет указывать указатель (простите за тавтологию =) ).

tarakan пишет:
Дело в том, что процедура располагающаяся по данному адресу содержит ещё кучу разных вызывов и вообще сложную логику.

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

tarakan пишет:
Кроме того, даже если я узнаю алгоритм проверки, мне ещё придется вычислить обратныю функцию.

Если это самопальная проверка - сделать кейген не составит труда =). Если используется криптография, причем руки у разработчиков не кривые, и ключ довольно длинный - мб даже и не удастся.

tarakan пишет:
Скажите что-нибудь воодушевляющее.

Удачи в начинании!



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

Создано: 11 января 2007 08:10
· Личное сообщение · #14

HoBleen Спасибо.
Если есть ещё какие-нибудь советы. Буду рад услышать.

P.S. Не закрывайте пока топик. Как попробую вышесказанное - отпишусь и может задам ещё какой-нить
вопросец.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 11 января 2007 09:13
· Личное сообщение · #15

tarakan пишет:
А если я заменю в инструкции call dword ptr [ecx+$34] адрес на фактический и сделаю в DeDe дамп
процесса, то он сможет найти эту функцию?

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

-----
Я медленно снимаю с неё UPX... *FF_User*





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

Создано: 11 января 2007 09:57
· Личное сообщение · #16

Забей. Это не то, что тебе надо. Это может быть все, что угодно, но не проверка ключа.
И еще, посмотри в ольке лэйбы в файле. Правой крысой, view all name in current module. Олька тебе выдаст список всех названий и меток. Далее ставиш бряк на call dword ptr [ecx+$34], смотришь - твой колл или нет. Если твой, то как его олька обзывает. Для этого в настройках ставишь галку ... Упс, забыл какую. Может кто напомнит, чота там аргументы или типа этого. Кароч, пощелкай в настройках разные галки, чтоб олька показывала не call 473526, a call System@CreteTread@CreateTreadWrapper.Типа этого.
Потом смотриш название своей call dword ptr [ecx+$34] и ищешь ее в ДеДе.
Дерзай.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 10:01
· Личное сообщение · #17

stahh пишет:
Забей. Это не то, что тебе надо. Это может быть все, что угодно, но не проверка ключа.

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

stahh пишет:
Кароч, пощелкай в настройках разные галки, чтоб олька показывала не call 473526, a call System@CreteTread@CreateTreadWrapper.Типа этого.

Эээ.. мб сигнатуры? =)

stahh пишет:
Потом смотриш название своей call dword ptr [ecx+$34] и ищешь ее в ДеДе.

Это виртуальный метод, ни в каком дизассемблере адрес не показывается.



Ранг: 13.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 января 2007 10:23 · Поправил: =Usacha=
· Личное сообщение · #18

PE_Kill пишет:
tarakan используй сигнатуры для IDA от TQN лежат на wasm.ru, не хуже DeDe помогают

Выложите плз куда-нто сигны. На васме их невидать..
з.ы. Изв что не в тему...



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

Создано: 12 января 2007 14:52
· Личное сообщение · #19

Всем спасибо. Все получилось.


 eXeL@B —› Основной форум —› Помогите разобраться с Delphi.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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