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

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

Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 15:03
· Личное сообщение · #1

Какой может быть исходный код для вот такого "странного" фрагмента кода в экзешнике, написанном на Дельфи:
Code:
  1. >004DB657    jmp        004DB65E
  2. >004DB659    jmp        004DB911
  3.  004DB65E    mov        edx,dword ptr [ebp-14]
  4.  004DB661    mov        eax,4DB944; ' '
  5.  004DB666    call       @LStrPos
  6.  004DB66B    test       eax,eax
  7. >004DB66D    jg         004DB911
  8. ................................................
  9. 004DB911 -> Выход из процедуры

В пропущенном фрагменте ничего полезного для ответа нет. У меня есть идея, что это какой-то "неправильный" while (два jmp подряд обычно соответствуют двум вложенным циклам while плюс возможная оптимизация, но здесь нет возвратов). Будут какие-то продуктивные идеи?
ЗЫ
Не похоже, чтобы программу патчили, это создал компилятор (Дельфи 7).



Ранг: 85.4 (постоянный), 51thx
Активность: 0.090
Статус: Участник

Создано: 05 июня 2012 15:07 · Поправил: drone
· Личное сообщение · #2

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

ps. CTRL+R стоя на 004DB659 что-нибудь дает?



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

Создано: 05 июня 2012 15:07
· Личное сообщение · #3

crypto
Первое что пришло в голову, асм вставка, использовали goto.



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 15:12
· Личное сообщение · #4

drone
Нет, в таком случае должны быть вызовы обработчиков @IntOver, @BoundErr и переходы будут условными
F_a_u_s_t
Странная вставка, непохоже. GoTo хрен знает, можешь написать исходный код с этим оператором?



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

Создано: 05 июня 2012 15:25 · Поправил: F_a_u_s_t
· Личное сообщение · #5

псевдокод:

label l1, l2;
begin
if тыры = пыры then
goto l1
else
goto l2;

l1:
код:
.....
l2:
код:
end;
Я и не такое наркоманство видел.

Add:
по тому куску что ты привел сложно судить, ибо зависит что там выше.

Add2:
Вкурил:
Проверяем символ если не пробел
То - 004DB657 jmp 004DB65E выходим
004DB659 jmp 004DB911
иначе:
004DB65E mov edx,dword ptr [ebp-14]
004DB661 mov eax,4DB944; ' '
004DB666 call @LStrPos
004DB66B test eax,eax
>004DB66D jg 004DB911 прыгаем на второй jmp а куда он ведет одному богу известно.

repeat

until



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 15:34 · Поправил: crypto
· Личное сообщение · #6

F_a_u_s_t
Если это спасет отца демократии...
81d6_05.06.2012_EXELAB.rU.tgz - 1



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 16:01 · Поправил: vden
· Личное сообщение · #7

Это скорее всего просто не оптимизированный код. От компилятора Delphi такое можно ожидать.
Не смотря на то, что блок if-then-else, компилятор всё равно вставил прыжок на эпилог.

Ещё бывает мёртвый код попросту не выбрасывается из модуля, при определённых условиях вообще никогда.



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

Создано: 05 июня 2012 16:08
· Личное сообщение · #8

Имхо первый jmp это else



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 16:20
· Личное сообщение · #9

vden
Что ты имеешь в виду под "мертвым кодом", поподробнее пожалуйста.



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 16:22 · Поправил: vden
· Личное сообщение · #10

Код который никогда не получит управление.

Прикрепил пример. Функция t1. Блок по адресу 4042BA никогда не выполниться.
Печально, что это release mode с оптимизациями в XE2.

4262_05.06.2012_EXELAB.rU.tgz - test.exe

Хотя в плане декомпиляции это проблем не представляет. В cfg "лишние" блоки всё-равно не попадут.

| Сообщение посчитали полезным: neomant, crypto


Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 05 июня 2012 17:28
· Личное сообщение · #11

Действительно похоже на мёртвый код, else, который никогда не наступает и не выкинут компилятором.

-----
Следуй за белым кроликом




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 05 июня 2012 17:33
· Личное сообщение · #12

Сие должно представляться как SEH-обработчик "по Дельфийски"



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 17:48
· Личное сообщение · #13

vden
А исходник t1?



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 17:52
· Личное сообщение · #14

Code:
  1. program test;
  2.  
  3. procedure t1;
  4. var
  5.   a: AnsiString;
  6. begin
  7.   a := 'cool';
  8.   exit;
  9.   a := 'cool again';
  10. end;
  11.  
  12. exports
  13.   t1;
  14.  
  15. begin
  16. end.




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 05 июня 2012 17:53
· Личное сообщение · #15

Еще один вопрос. Ассемблерный код:
Code:
  1.  005010CC    push       ebp
  2.  005010CD    mov        ebp,esp
  3.  005010CF    push       0
  4.  005010D1    push       0
  5.  005010D3    push       0
  6.  005010D5    push       ebx
  7.  005010D6    push       esi
  8.  005010D7    push       edi
  9.  005010D8    mov        esi,ecx
  10.  005010DA    mov        dword ptr [ebp-4],edx
  11.  005010DD    mov        ebx,eax
  12.  005010DF    xor        eax,eax
  13.  005010E1    push       ebp
  14.  005010E2    push       5011EA
  15.  005010E7    push       dword ptr fs:[eax]
  16.  005010EA    mov        dword ptr fs:[eax],esp
  17.  005010ED    mov        edi,dword ptr [ebx+6F0]; TForm_confma.WebBrowser1:TWebBrowser
  18.  005010F3    test       edi,edi
  19. >005010F5    jne        005010FF
  20.  005010F7    mov        byte ptr [esi],0
  21. >005010FA    jmp        005011CC
  22.  005010FF    mov        eax,dword ptr [ebp-4]
  23.  00501102    push       eax
  24.  00501103    mov        eax,edi
  25.  00501105    call       TWinControl.GetHandle
  26.  0050110A    push       eax
  27.  0050110B    call       user32.IsDialogMessageA
  28.  00501110    cmp        eax,1
  29.  00501113    sbb        eax,eax
  30.  00501115    inc        eax
  31.  00501116    cmp        al,1
  32.  00501118    sete       byte ptr [esi]
  33.  0050111B    cmp        byte ptr [esi],0
  34. >0050111E    je         005011CC
  35.  00501124    mov        edx,0D4
  36.  00501129    mov        eax,dword ptr [ebx+6F0]; TForm_confma.WebBrowser1:TWebBrowser
  37.  0050112F    call       TOleControl.GetWordBoolProp
  38.  00501134    test       ax,ax
  39. >00501137    jne        005011CC
  40.  0050113D    cmp        dword ptr [ebx+8B8],0; TForm_confma.?f8B8:IOleInPlaceActiveObject
  41. >00501144    jne        00501189
  42.  00501146    lea        ecx,[ebp-0C]
  43.  00501149    mov        edx,0C8
  44.  0050114E    mov        eax,dword ptr [ebx+6F0]; TForm_confma.WebBrowser1:TWebBrowser
  45.  00501154    call       TOleControl.GetIDispatchProp
  46.  00501159    cmp        dword ptr [ebp-0C],0
  47. >0050115D    je         00501189
  48.  0050115F    lea        eax,[ebp-8]
  49.  00501162    call       @IntfClear
  50.  00501167    push       eax
  51.  00501168    push       5011F8
  52.  0050116D    mov        eax,dword ptr [ebp-0C]
  53.  00501170    push       eax
  54.  00501171    mov        eax,dword ptr [eax]
  55.  00501173    call       dword ptr [eax]
  56.  00501175    cmp        dword ptr [ebp-8],0
  57. >00501179    je         00501189
  58.  0050117B    lea        eax,[ebx+8B8]; TForm_confma.?f8B8:IOleInPlaceActiveObject
  59.  00501181    mov        edx,dword ptr [ebp-8]
  60.  00501184    call       @IntfCopy
  61.  00501189    cmp        dword ptr [ebx+8B8],0; TForm_confma.?f8B8:IOleInPlaceActiveObject
  62. >00501190    je         005011CC
  63.  00501192    mov        eax,dword ptr [ebp-4]
  64.  00501195    mov        eax,dword ptr [eax+4]
  65.  00501198    cmp        eax,100
  66. >0050119D    je         005011A9
  67.  0050119F    mov        edx,dword ptr [ebp-4]
  68.  005011A2    cmp        eax,101
  69. >005011A7    jne        005011BC
  70.  005011A9    mov        eax,dword ptr [ebp-4]
  71.  005011AC    mov        eax,dword ptr [eax+8]
  72.  005011AF    sub        eax,8
  73. >005011B2    je         005011CC
  74.  005011B4    add        eax,0FFFFFFE3
  75.  005011B7    sub        eax,4
  76. >005011BA    jb         005011CC
  77.  005011BC    mov        eax,dword ptr [ebp-4]
  78.  005011BF    push       eax
  79.  005011C0    mov        eax,dword ptr [ebx+8B8]; TForm_confma.?f8B8:IOleInPlaceActiveObject
  80.  005011C6    push       eax
  81.  005011C7    mov        eax,dword ptr [eax]
  82.  005011C9    call       dword ptr [eax+14]
  83.  005011CC    xor        eax,eax
  84.  005011CE    pop        edx
  85.  005011CF    pop        ecx
  86.  005011D0    pop        ecx
  87.  005011D1    mov        dword ptr fs:[eax],edx
  88.  005011D4    push       5011F1
  89.  005011D9    lea        eax,[ebp-0C]
  90.  005011DC    call       @IntfClear
  91.  005011E1    lea        eax,[ebp-8]
  92.  005011E4    call       @IntfClear
  93.  005011E9    ret
  94. <005011EA    jmp        @HandleFinally
  95. <005011EF    jmp        005011D9
  96.  005011F1    pop        edi
  97.  005011F2    pop        esi
  98.  005011F3    pop        ebx
  99.  005011F4    mov        esp,ebp
  100.  005011F6    pop        ebp
  101.  005011F7    ret

Реверсированный
Code:
  1. procedure TForm_confma.ApplicationOnMessageProc(var Msg:TMsg; var Handled:Boolean);
  2. var
  3.   lvar_8:IOleInPlaceActiveObject;
  4.   lvar_C:IDispatch;
  5. begin
  6.   if (WebBrowser1 = nil) then
  7.     Handled := False
  8.   else
  9.   begin
  10.     Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
  11.     if (Handled) And (Word(WebBrowser1.Busy) = 0) then
  12.     begin
  13.       if (f8B8 = nil) then
  14.       begin
  15.         lvar_C := WebBrowser1.Application;
  16.         if (lvar_C <> nil) then
  17.         begin
  18.           lvar_C.QueryInterface(IOleInPlaceActiveObject, lvar_8);
  19.           if (lvar_8 <> nil) then f8B8 := lvar_8;
  20.         end;
  21.       end;
  22.       if (f8B8 <> nil) then
  23.       begin
  24.         if ((Msg.message <> WM_KEYDOWN) And (Msg.message <> WM_KEYUP)) Or ((Msg.wParam <> VK_BACK) And (Msg.wParam >= $29)) then//???
  25.         begin
  26.           f8B8.TranslateAccelerator(Msg);
  27.         end;
  28.       end;
  29.     end;
  30.   end;
  31. end;

Начиная с адреса 005011A9 меня застопорило. Никак не могу добиться совпадения кода после компиляции. Даже идей нет, какая может быть конструкция.



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 17:57 · Поправил: vden
· Личное сообщение · #16

Code:
  1. ; WM_KEYDOWN, WM_KEYUP
  2.  005011A9    mov        eax,dword ptr [Msg]
  3.  005011AC    mov        eax,dword ptr [Msg.wParam]
  4.  005011AF    sub        eax,8
  5. >005011B2    je         ExitFinally_005011CC
  6.  
  7. ; Msg.wParam <> 8
  8.  005011B4    add        eax,0FFFFFFE3 ; -29-8 = -37
  9.  005011B7    sub        eax,4         ; -41
  10. >005011BA    jb         ExitFinally_005011CC

скорее всего case, но не факт
или же что-то вроде
if not msg.wparam in [8 , ... ] ...


Ещё можно упростить:
Code:
  1.  if (Handled) And (Word(WebBrowser1.Busy) = 0) then
  2. ->
  3. т.к. WebBrowser1.Busy 16 битный boolean, то каст не нужен, 0 -> false
  4.  if (Handled) And (WebBrowser1.Busy = {0} false) then
  5. ->
  6.  if (Handled) And (not WebBrowser1.Busy) then




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 06 июня 2012 08:58
· Личное сообщение · #17

vden
скорее всего case
Точно не он! Несколькими инструкциями выше два условных перехода, которые эту версию отметают напрочь.
или же что-то вроде
Хотелось бы знать, вроде чего... Нужна осмысленная конструкция, которая после компиляции совпадет с требуемой. Вообще говоря, это конечно не критично, но меня колбасит от незнания, как такое получить.
Ещё можно упростить
Спасибо, конечно, но это не главная задача.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 06 июня 2012 10:23
· Личное сообщение · #18

Крайне похожи куски сабклассинга
в твоем коде ...

Code:
  1. if (f8B8 = nil) then
  2.       begin
  3.         lvar_C := WebBrowser1.Application;
  4.         if (lvar_C <> nil) then
  5.         begin
  6.           lvar_C.QueryInterface(IOleInPlaceActiveObject, lvar_8);
  7.           if (lvar_8 <> nil) then f8B8 := lvar_8;
  8.         end;
  9.       end;
  10.       if (f8B8 <> nil) then
  11.       begin
  12.         if ((Msg.message <> WM_KEYDOWN) And (Msg.message <> WM_KEYUP)) Or ((Msg.wParam <> VK_BACK) And (Msg.wParam >= $29)) then//???
  13.         begin
  14.           f8B8.TranslateAccelerator(Msg);


В другом варианте ...

Code:
  1. begin
  2.    if form1.FOleInPlaceActiveObject = nil then
  3.    begin
  4.     Dispatch := form1.html.Application;
  5.     if Dispatch <> nil then
  6.     begin
  7.       Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
  8.       if iOIPAO <> nil then
  9.         form1.FOleInPlaceActiveObject := iOIPAO;
  10.     end;
  11.   end;
  12.  
  13.   if form1.FOleInPlaceActiveObject <> nil then
  14.     if ((Msg1.message = WM_KEYDOWN) or (Msg1.message = WM_KEYUP)) and
  15.       not (Msg1.wParam in DialogKeys) then
  16.       form1.FOleInPlaceActiveObject.TranslateAccelerator(Msg1);
  17.  


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: crypto

Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 06 июня 2012 10:47 · Поправил: crypto
· Личное сообщение · #19

mak
Вау! Наверное это то, что нужно.
Откуда код, можешь сказать?




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 06 июня 2012 10:59 · Поправил: neomant
· Личное сообщение · #20

crypto
Попробуй поиграть опциями компиляторов с такой конструкцией:
Code:
  1.   if
  2.     ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
  3.     ((Msg.wParam >= VK_BACK) or (Msg.wParam <= VK_DOWN)) then begin
  4.     f8B8.TranslateAccelerator(Msg);
  5.   end;


-----
Следуй за белым кроликом





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 06 июня 2012 11:01 · Поправил: mak
· Личное сообщение · #21

crypto
Вот тут тема
Ссылка - --> Link <--

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 06 июня 2012 12:27
· Личное сообщение · #22

Ну вот, мозговой штурм привел к следующей правильной конструкции (желающие могут скомпилить и проверить):
Code:
  1. if ((Msg.message <> WM_KEYDOWN) And (Msg.message <> WM_KEYUP)) Or (not (Msg.wParam in [VK_BACK, VK_LEFT..VK_DOWN ]))




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 июня 2012 12:58 · Поправил: vden
· Личное сообщение · #23

отлично

Code:
  1. procedure test(var Msg: tagMSG);
  2. begin
  3.   if ((Msg.message <> WM_KEYDOWN) And (Msg.message <> WM_KEYUP)) Or (not(Msg.wParam in [VK_BACK, VK_LEFT .. VK_DOWN])) then
  4.     asm
  5.       int 3
  6.     end;
  7. end;


-->

Code:
  1. test            proc near
  2.                 mov     edx, [eax+4]
  3.                 cmp     edx, 100h
  4.                 jz      short loc_4042EB
  5.                 cmp     edx, 101h
  6.                 jnz     short loc_4042FB
  7.  
  8. loc_4042EB:                             
  9.                 mov     eax, [eax+8]
  10.                 sub     eax, 8
  11.                 jz      short locret_4042FC
  12.                 add     eax, 0FFFFFFE3h
  13.                 sub     eax, 4
  14.                 jb      short locret_4042FC
  15.  
  16. loc_4042FB:                             
  17.                 int     3               
  18.  
  19. locret_4042FC:                          
  20.                                         
  21.                 retn




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

Создано: 06 июня 2012 16:20
· Личное сообщение · #24

crypto, когда ждать новую версию IDR?


 eXeL@B —› Основной форум —› Реверсерам Дельфи
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати