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

 eXeL@B —› Вопросы новичков —› Inject - как правильно вставить JMP FAR?
Посл.ответ Сообщение

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

Создано: 05 сентября 2014 19:37 · Поправил: ohos
· Личное сообщение · #1

Привет, имеется такой код функции из программы:

Code:
  1. 0073BDD0  /. 55             PUSH EBP
  2. 0073BDD1  |. 8BEC           MOV EBP,ESP
  3. 0073BDD3  |. 83EC 10        SUB ESP,10
  4. 0073BDD6     894D F0        MOV DWORD PTR SS:[EBP-10],ECX
  5. 0073BDD9     8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
  6. 0073BDDC     E8 9FCCF5FF    CALL zone.00698A80
  7. 0073BDE1  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
  8. 0073BDE4  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
  9. 0073BDE7  |. 50             PUSH EAX                                 ; /Arg1
  10. 0073BDE8  |. 8B0D A8B29300  MOV ECX,DWORD PTR DS:[93B2A8]            ; |
  11. 0073BDEE  |. E8 BD88E5FF    CALL zone.005946B0                       ; \zone.005946B0
  12. 0073BDF3  |. 8945 F4        MOV DWORD PTR SS:[EBP-C],EAX
  13. 0073BDF6  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
  14. 0073BDF9  |. E8 22C8F5FF    CALL zone.00698620
  15. 0073BDFE  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
  16. 0073BE01  |. 837D FC 00     CMP DWORD PTR SS:[EBP-4],0
  17. 0073BE05  |. 74 06          JE SHORT zone.0073BE0D
  18. 0073BE07  |. 837D F4 00     CMP DWORD PTR SS:[EBP-C],0
  19. 0073BE0B  |. 75 05          JNZ SHORT zone.0073BE12
  20. 0073BE0D  |> E9 A0000000    JMP zone.0073BEB2
  21. 0073BE12  |> 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]
  22. 0073BE15  |. 8B91 64010000  MOV EDX,DWORD PTR DS:[ECX+164]
  23. 0073BE1B  |. 52             PUSH EDX                                 ; /Arg1
  24. 0073BE1C  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
  25. 0073BE1F  |. E8 CCF9F0FF    CALL zone.0064B7F0                       ; \zone.0064B7F0
  26. 0073BE24  |. 0FB6C0         MOVZX EAX,AL
  27. 0073BE27  |. 85C0           TEST EAX,EAX
  28. 0073BE29  |. 74 14          JE SHORT zone.0073BE3F
  29. 0073BE2B  |. 6A 01          PUSH 1                                   ; /Arg3 = 00000001
  30. 0073BE2D  |. 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]             ; |
  31. 0073BE30  |. 51             PUSH ECX                                 ; |Arg2
  32. 0073BE31  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]             ; |
  33. 0073BE34  |. 52             PUSH EDX                                 ; |Arg1
  34. 0073BE35  |. E8 F6ECFFFF    CALL zone.0073AB30                       ; \zone.0073AB30
  35. 0073BE3A  |. 83C4 0C        ADD ESP,0C
  36. 0073BE3D  |. EB 73          JMP SHORT zone.0073BEB2
  37. 0073BE3F  |> 6A 20          PUSH 20                                  ; /Arg1 = 00000020
  38. 0073BE41  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
  39. 0073BE44  |. E8 47DCF1FF    CALL zone.00659A90                       ; \zone.00659A90
  40. 0073BE49  |. 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]
  41. 0073BE4C  |. 3B81 78010000  CMP EAX,DWORD PTR DS:[ECX+178]
  42. 0073BE52  |. 7D 14          JGE SHORT zone.0073BE68
  43. 0073BE54  |. 6A 02          PUSH 2                                   ; /Arg3 = 00000002
  44. 0073BE56  |. 8B55 0C        MOV EDX,DWORD PTR SS:[EBP+C]             ; |
  45. 0073BE59  |. 52             PUSH EDX                                 ; |Arg2
  46. 0073BE5A  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]             ; |
  47. 0073BE5D  |. 50             PUSH EAX                                 ; |Arg1
  48. 0073BE5E  |. E8 CDECFFFF    CALL zone.0073AB30                       ; \zone.0073AB30
  49. 0073BE63  |. 83C4 0C        ADD ESP,0C
  50. 0073BE66  |. EB 4A          JMP SHORT zone.0073BEB2
  51. 0073BE68  |> 6A 01          PUSH 1                                   ; /Arg4 = 00000001
  52. 0073BE6A  |. 6A 04          PUSH 4                                   ; |Arg3 = 00000004
  53. 0073BE6C  |. 6A 00          PUSH 0                                   ; |Arg2 = 00000000
  54. 0073BE6E  |. 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]             ; |
  55. 0073BE71  |. 8B91 78010000  MOV EDX,DWORD PTR DS:[ECX+178]           ; |
  56. 0073BE77  |. 6BD2 FF        IMUL EDX,EDX,-1                          ; |
  57. 0073BE7A  |. 52             PUSH EDX                                 ; |Arg1
  58. 0073BE7B  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
  59. 0073BE7E  |. E8 4DDDF0FF    CALL zone.00649BD0                       ; \zone.00649BD0
  60. 0073BE83  |. 68 F9118D00    PUSH zone.008D11F9                       ; /Arg5 = 008D11F9
  61. 0073BE88  |. 6A 00          PUSH 0                                   ; |Arg4 = 00000000
  62. 0073BE8A  |. 6A 04          PUSH 4                                   ; |Arg3 = 00000004
  63. 0073BE8C  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
  64. 0073BE8E  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]             ; |
  65. 0073BE91  |. 8B88 64010000  MOV ECX,DWORD PTR DS:[EAX+164]           ; |
  66. 0073BE97  |. 51             PUSH ECX                                 ; |Arg1
  67. 0073BE98  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
  68. 0073BE9B  |. E8 C0D7F0FF    CALL zone.00649660                       ; \zone.00649660
  69. 0073BEA0  |. 6A 00          PUSH 0                                   ; /Arg3 = 00000000
  70. 0073BEA2  |. 8B55 0C        MOV EDX,DWORD PTR SS:[EBP+C]             ; |
  71. 0073BEA5  |. 52             PUSH EDX                                 ; |Arg2
  72. 0073BEA6  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]             ; |
  73. 0073BEA9  |. 50             PUSH EAX                                 ; |Arg1
  74. 0073BEAA  |. E8 81ECFFFF    CALL zone.0073AB30                       ; \zone.0073AB30
  75. 0073BEAF  |. 83C4 0C        ADD ESP,0C
  76. 0073BEB2  |> 8BE5           MOV ESP,EBP
  77. 0073BEB4  |. 5D             POP EBP
  78. 0073BEB5  \. C2 0800        RETN 8


я пытаюсь сделать проверку значения на строке

Code:
  1. 0073BDD9     8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]


Если DWORD PTR SS:[EBP+8] < 550000 или DWORD PTR SS:[EBP+8] > 560000 то нужно пропустить весь код функции и перейти к её ретурну

Пытался заменить строки

Code:
  1. 0073BDD6     894D F0        MOV DWORD PTR SS:[EBP-10],ECX
  2. 0073BDD9     8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]


на JMP FAR к адресу 8A87CB и в нем выполнить сравнение через cmp и проверку флагов, а так же эти пропущенные строки, если функцию выполнять нужно, возврат полагаю нужно сделать на

Code:
  1. 0073BEAF  |. 83C4 0C        ADD ESP,0C


Но после замены двух выше указанных строк на NOP'ы и вписывания в первые 4 (из 6) значение EACB878A, оставшиеся внизу 2 NOP'а почему-то присоединяются к этой команде JMP FAR и образуют

Code:
  1. 0073BDD6     EA CB878A90 90>JMP FAR E890:908A87CB                    ; Far jump


смещая при этом байты идущие уже на команде call и разбивая её на кучу непонятных команд

Code:
  1. 0073BDD6     EA CB878A90 90>JMP FAR E890:908A87CB                    ; Far jump
  2. 0073BDDD  |? 9F             LAHF
  3. 0073BDDE  |? CC             INT3
  4. 0073BDDF  |? F5             CMC
  5. 0073BDE0  |? FF89 45F88B45  DEC DWORD PTR DS:[ECX+458BF845]
  6. 0073BDE6  |? 0C 50          OR AL,50
  7. 0073BDE8  |. 8B0D A8B29300  MOV ECX,DWORD PTR DS:[93B2A8]            ; |
  8. 0073BDEE  |. E8 BD88E5FF    CALL zone.005946B0                       ; \zone.005946B0
  9.  


в связи с чем возникло несколько вопросов:

1. правильно ли выбраны строки для инжекта и замены их на JMP?
2. если строки выбраны правильно, то как правильно написать JMP FAR на абсолютный адрес 8A87CB?
3. правильно ли выбран адрес возврата, чтобы пропустить весь код функции, но не пропустить команды необходимые для выполнения return из функции?

Псевдокод функции из IDA

Code:
  1. int __stdcall sub_73BDD0(int a1, int a2)
  2. {
  3.   int result; // eax@1
  4.   int v3; // [sp+4h] [bp-Ch]@1
  5.   int v4; // [sp+8h] [bp-8h]@1
  6.   void *v5; // [sp+Ch] [bp-4h]@1
  7.  
  8.   v4 = sub_698A80(a1);
  9.   v3 = sub_5946B0(a2);
  10.   result = unknown_libname_15(a1);
  11.   v5 = (void *)result;
  12.   if ( result && v3 )
  13.   {
  14.     if ( (unsigned __int8)sub_64B7F0(*(_DWORD *)(v3 + 356)) )
  15.     {
  16.       result = sub_73AB30(v4, a2, 1);
  17.     }
  18.     else
  19.     {
  20.       if ( sub_659A90(32) >= *(_DWORD *)(v3 + 376) )
  21.       {
  22.         sub_649BD0(v5, -*(_DWORD *)(v3 + 376), 0, 4, 1);
  23.         sub_649660(*(_DWORD *)(v3 + 356), 1, 4, 0, &unk_8D11F9);
  24.         result = sub_73AB30(v4, a2, 0);
  25.       }
  26.       else
  27.       {
  28.         result = sub_73AB30(v4, a2, 2);
  29.       }
  30.     }
  31.   }
  32.   return result;
  33. }


В строке v4 = sub_698A80(a1); a1 и есть проверяемое значение



Ранг: 27.8 (посетитель), 13thx
Активность: 0.030
Статус: Участник

Создано: 05 сентября 2014 19:58 · Поправил: microxa
· Личное сообщение · #2

зачем FAR, вставить NEAR JMP и делов то


а так любимый (в узких кругах) ЁB - это SHORT JMP, вообщето




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 05 сентября 2014 21:22
· Личное сообщение · #3

ohos
near = EB, оно нинада. EA замени на E9. и это будет относительный jump между адресами. если нужны абсолютные - пользуй push <addr> retn (68 xx xx xx xx C3)

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 06 сентября 2014 00:48 · Поправил: dosprog
· Личное сообщение · #4

Позволю себе уточнить.

<JMP FAR> в программах WIN32 не используется, поскольку нет нужды применять межсегментные вызовы, разрядности регистра адреса хватает для работы во флат-модели памяти.

Прыжки в 32-бит программах бывают:

Code:
  1. EA = JMP   SEG:ADDR     = <JMP FAR>  межсегментный дальний переход по абсолютному адресу в указанном сегменте -> Итого кода 1+4+2 = 7 байт;
  2. E9 = JMP   OFFSET       =  внутрисегментный относительный переход на дельту адреса (дельта 32-битная) -> Итого кода 1+4 = 5 байт;
  3. EB = JMP   SHORT OFFSET = внутрисегментный относительный переход на дельту адреса (дельта 8-битная) -> Итого кода 1+1 = 2 байта.

То-есть, в вашем случае код ЕА не нужен, а код EB не подходит, так как одним байтом не удастся закодировать требуемую дельту адреса перехода.
Подходит код Е9, но тогда нужно вычислить эту самую разность адресов (дельту), на сколько прыгать.
(Это можно сделать с помощью симпатичной утилитки, которую TryAga1n выложил в следующем посте).

Поэтому и удобнее просто запихнуть (PUSH) желаемый абсолютный адрес в стек и выполнить ближний возврат (RETN).
Как и порекомендовал ajax.

Длины инструкций нужно учитывать. Если прыжок вставляется вместо более длинной инструкции, то остальные байты этой прежней инструкции в дизассемблере будут грязью, но это и не важно.
Важно прыгнуть потом обратно не в эту грязь, а на адрес следующей за нею осмысленной инструкции.

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

Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 06 сентября 2014 01:12
· Личное сообщение · #5

А еще для этого дела есть вот такой вот source included калькулятор прыгов, может оказаться полезным

c03d_06.09.2014_EXELAB.rU.tgz - Jumpgen 0.4 b.zip

| Сообщение посчитали полезным: dosprog, elch, Abraham, ohos

Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 06 сентября 2014 03:59
· Личное сообщение · #6

dosprog пишет:
Поэтому и удобнее просто запихнуть (PUSH) желаемый абсолютный адрес в стек и выполнить ближний возврат (RETN).

И жестоко обломаться, когда сработает ASLR.



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

Создано: 06 сентября 2014 04:34 · Поправил: dosprog
· Личное сообщение · #7

GroundHog пишет:
И жестоко обломаться, когда сработает ASLR.


Справедливое замечание.
В новых системах возможно и такое.
Поэтому лучше всёже использовать прыг.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 06 сентября 2014 04:45 · Поправил: ajax
· Личное сообщение · #8

GroundHog
просто релоки занулить. прога дельфовая, похоже. будет валиться - тс будет вникать и спросит

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 06 сентября 2014 06:40
· Личное сообщение · #9

dosprog пишет:
<JMP FAR> в программах WIN32 не используется

Это не значит, что его нельзя юзать. iret в р3-кодесе тоже не нужен, но иногда встречается



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

Создано: 08 сентября 2014 12:27 · Поправил: ohos
· Личное сообщение · #10

Благодарю за советы и калькулятор, еще не раз пригодится. В начале я думал придется все забивать опкодами, но забыл, что в ольке есть assemble (по дефолту на пробеле), в нем оказалось достаточно забить jmp адрес, а олька сама его в подходящий джамп конвертнет




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

Создано: 08 сентября 2014 14:15
· Личное сообщение · #11

TryAga1n пишет:
А еще для этого дела есть вот такой вот source included калькулятор прыгов, может оказаться полезным


ohos пишет:
Благодарю за советы и калькулятор, еще не раз пригодится.


HIEW отлично с этим справляется, в режиме редактирования кода, по крайней мере для x86...


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


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