Сейчас на форуме: _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых)

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

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

Создано: 14 августа 2005 20:45
· Личное сообщение · #1

Как определить на каком языке написана программа? ЕНсли трудно объяснить буду благодарен за помощь. venven@mail.ru




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

Создано: 14 августа 2005 20:46
· Личное сообщение · #2

PeID 0.93 (качать из соотв-го раздела) либо на глаз.

-----
Ни одно доброе дело не должно остаться безнаказанным !!!





Ранг: 260.3 (наставник), 2thx
Активность: 0.120
Статус: Участник
PPC-PROTECT author

Создано: 14 августа 2005 20:50
· Личное сообщение · #3

еще можно посмотреть на секции...

-----
Пиво, сиськи, транс




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

Создано: 14 августа 2005 20:54
· Личное сообщение · #4

можно по сигнатурам

3b2c_Signs.txt




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

Создано: 14 августа 2005 20:55
· Личное сообщение · #5

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



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 15 августа 2005 05:56 · Поправил: Bitfry
· Личное сообщение · #6

ben
Вообще существует явный характер кода.
Допустим, программа не запакована.
Ты лезешь в Олли и смотришь код.
Чаще всего (процентов 60), проги пишут на VC или Delphi (CBuilder и Delphi – один хрен).
VC и Delphi имеют совершенно не похожий код.
У Delphi программ нет оптимизации. Всегда океан лишних команд и куча пустых вызовов (видимо программеры виноваты).
Если ты постоянно встречаешь в коде вот такие вещи:

004076ED |. A3 6866A700 mov dword ptr ds:[A76668], eax ; сохранить EAX в память
004076F2 |. A1 6866A700 mov eax, dword ptr ds:[A76668] ; пустое действие
004076F7 |. A3 DC50A200 mov dword ptr ds:[A250DC], eax ; сохранить EAX в другое место

то это Delphi или Builder.
Так же у Delphi в процедурах есть постоянного вида пролог:

009E2A48 /$ 55 push ebp
009E2A49 |. 8BEC mov ebp, esp
009E2A4B |. 83C4 F4 add esp, сколько-то

И стек всегда выравнивается по ходу процедуры не один раз.

Если же прога написана на VC, тут всё зависит от компилятора и метода.
Но часто бывает, что пролога в функциях нет вообще. Стек по ходу функции не ровный и лишь перед выходом приводится в нужный вид.
Так же код из VC использует оптимизацию по стандартным блокам действий. Часто опознаётся оператор switch (читай на wasme) и переодически блоки вроде:

41DDA2 cmp dword ptr ds:[58C870], 1
41DDA9 sbb eax, eax
41DDAB neg eax
41DDAD test dword ptr ds:[ebx+58], eax

Таких блоков в Delphi просто не бывает. Код Delphi вообще использует значительно меньше команд Асма. Так же оптимизация 4+1+1 (читай о процессоре) и т.п.

Выходит 60% не пакованных прог можно определить сразу.

БОльшая часть оставшихся это:
BAISC (чаще всего p-code)
VC c MFC (тут код тоже видно сразу)
И разного рода C++.

С BAISC’ом по коду сложнее. Если p-code, в Olly он опознаётся как запакованная прога (на чём обламываются некоторые чайники).

Но в целом, пару недель в отладчике на разных примерах – и ты будешь сам всё определять .

А вот пакованные проги определяются по особенностям файла в PE-формате.

-----
Всем привет, я вернулся




Ранг: 45.7 (посетитель)
Активность: 0.050
Статус: Участник
EBFE

Создано: 15 августа 2005 19:17
· Личное сообщение · #7

ну VC на взляд проще можно отличить там пространство между ф-циями заполнено CCh



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 15 августа 2005 19:21
· Личное сообщение · #8

dMNt, не обязательно



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 16 августа 2005 04:34
· Личное сообщение · #9

dMNt пишет:
там пространство между ф-циями заполнено CCh

MS всегда так делает. С++, MASM и т.д.
Так что это не совсем верный признак.

-----
Всем привет, я вернулся




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

Создано: 16 августа 2005 06:16
· Личное сообщение · #10

Bitfry пишет:
Если ты постоянно встречаешь в коде вот такие вещи:

004076ED |. A3 6866A700 mov dword ptr ds:[A76668], eax ; сохранить EAX в память
004076F2 |. A1 6866A700 mov eax, dword ptr ds:[A76668] ; пустое действие
004076F7 |. A3 DC50A200 mov dword ptr ds:[A250DC], eax ; сохранить EAX в другое место

то это Delphi или Builder.


Вовсе не обязательно!
_http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcla ng/html/_langref_volatile.asp



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 17 августа 2005 06:24
· Личное сообщение · #11

geRC
Спасибо, понял.
Думал, это чистая дурь Борланда и изредка MS.
В языках высокого уровня, я ни хрена не понимаю (только из отладчика .
Значит, получается, что VC даёт возможность назначить переменную для всех потоков, и тогда она будет постоянно обновляться перед действием.

А даёт ли возможность Борланд оптимизировать код?

-----
Всем привет, я вернулся




Ранг: 42.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 18 августа 2005 16:39
· Личное сообщение · #12

Bitfry пишет:
Так же у Delphi в процедурах есть постоянного вида пролог


На самом деле нет, стэковый кадр может генерится только при необходимости и тогда ф-ция может выглядеть так:

0044D94C TForm1.Button1Click:
0044D94C 6A40 push 00000040h
0044D94E 6860D94400 push sz0044D960_lpCaption
0044D953 686CD94400 push sz0044D96C_lpText
0044D958 6A00 push 00000000h
0044D95A E8418BFBFF call jmp_user32.dll!MessageBoxA
0044D95F C3 retn




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 18 августа 2005 16:58
· Личное сообщение · #13

RideX пишет:
стэковый кадр может генерится только при необходимости и тогда ф-ция может выглядеть так

Ведь специально написал, "вид пролога постоянный", а не "пролог есть всегда".
Речь о том, что я не видел разных прологов в Delphi прогах.
А вот на VC оптимизация творит то так, то эдак.

-----
Всем привет, я вернулся




Ранг: 42.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 18 августа 2005 21:26
· Личное сообщение · #14

Bitfry пишет:
Ведь специально написал, "вид пролога постоянный", а не "пролог есть всегда".
Речь о том, что я не видел разных прологов в Delphi прогах.


Если ты этого не видел, то не значит что этого нет.

0044D94C TForm1.Button1Click:
0044D94C 53 push ebx
0044D94D 8BD8 mov ebx,eax
0044D94F 6A40 push 00000040h
0044D951 686CD94400 push sz0044D96C_lpCaption
0044D956 6878D94400 push sz0044D978_lpText
0044D95B 8BC3 mov eax,ebx
0044D95D E88E5CFEFF call SUB_L004335F0
0044D962 50 push eax
0044D963 E8388BFBFF call jmp_user32.dll!MessageBoxA
0044D968 5B pop ebx
0044D969 C3 retn




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

Создано: 19 августа 2005 07:09 · Поправил: S_T_A_S_
· Личное сообщение · #15

А где тут стэковый кадр? Ф-ция не получает параметры через стэк и не использует локальные переменные ;)
Да и вообще, верх оптимизации =) 2, 3, 7 и 11 строки можно убрать.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 19 августа 2005 07:31
· Личное сообщение · #16

Да, пожалуй, слово пролог нужно уточнить. Естественно речь идёт о стеке и его резервировании.

Во! Ещё вспомнил, у MASM’a стандартный способ оформления процедур завершаются в коде командой «leave», опять же если руками не подсуетится.

Offtop:
А вообще, в жизни есть только одно утверждение, которое нельзя опровергнуть (это).


Меня, например, очень удивил такой факт.
Существует совокупность признаков, по которым выделяют живое и неживое.
Так вот оказывается, что каждый из этих признаков по отдельности ничего не означает.
Есть неживое, которое размножается, растёт, короче участвует в открытой системе.
Но мы-то как-то определяем, что есть жизнь.

-----
Всем привет, я вернулся




Ранг: 42.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 20 августа 2005 15:04
· Личное сообщение · #17

S_T_A_S_ пишет:
А где тут стэковый кадр?

Ага, здесь его нет Такой вид принимает ф-ция (см. Дата: Авг 18, 2005 16:39:52), если всего лишь указать HWND (в первом примере он равен 0).


var
Form1: TForm1;

implementation

{$R *.dfm}
{$W-} // Stack frame generation OFF
{$O-} // Optimization OFF

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBoxA(Handle, 'lpText', 'lpCaption', MB_OK + MB_ICONINFORMATION);
end;

end.


S_T_A_S_ пишет:
Да и вообще, верх оптимизации =)

Если отключить оптимизацию, то листинг будет выглядеть так: %)

0044D94C TForm1.Button1Click:
0044D94C 55 push ebp
0044D94D 8BEC mov ebp,esp
0044D94F 83C4F8 add esp,FFFFFFF8h
0044D952 8955F8 mov [ebp-08h],edx
0044D955 8945FC mov [ebp-04h],eax
0044D958 6A40 push 00000040h
0044D95A 6878D94400 push SSZ0044D978_lpCaption
0044D95F 6884D94400 push SSZ0044D984_lpText
0044D964 8B45FC mov eax,[ebp-04h]
0044D967 E8845CFEFF call SUB_L004335F0
0044D96C 50 push eax
0044D96D E82E8BFBFF call jmp_user32.dll!MessageBoxA
0044D972 59 pop ecx
0044D973 59 pop ecx
0044D974 5D pop ebp
0044D975 C3 retn



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


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