Сейчас на форуме: Adler, asfa, bartolomeo (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Компиляция куска asm кода с последующей вставкой в exe
Посл.ответ Сообщение

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

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

Всем доброго времени суток!
Столкнулся со следующим заданием.
Имеется два exe файла разных версий.
exe первой версии уже пропатчен(имеется и оригинальный первой версии).
exe второй версии чист.
Необходимо перенести патч с первой версии на вторую.

Немного поработав:
Собрал все адреса заменяемых байт в первой версии.
(4 байта заменено),(41 дописано в пустую область).

Сравнил оригиналы первой версии и второй версии - адреса и сами значения частично различаются.
После перевода обеих файлов в asm через IDA стало ясно, что процедуры различаются лишь разными адресами и адресами следующих переходов (jmp).
Перевел в asm так же пропатченный exe(первой версии который).
(4 байта) - ссылка на действия (41 байта) - которые после отсылаются на адрес последующий 4 байтам(после них).

Я переписал часть кода(где 4 байта) под новую версию(сменил адрес, так как пустая область смещена в новой версии), и (41 байт) - в новой версии тоже переписал пару ссылок, так как их адреса были смещены в новой версии.

По сути, код сам адаптирован и готов для работы в новой версии.
Но вот я никогда раньше не работал со вставками в готовый код.
Как мне получить из первой части кода - 4 байта и из второй части кода - 41 байт.

Может нужно выделить необходимую часть, сохранить в asm... а дальше?
Заранее спасибо!



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

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

залей два файла и выложи сюда или в личку кинь!
попробуй сделать Search and Replace Patch со смещением байт! может поможет)

Vovan666
может просто я не понял что он хочет)
Vovan666 пишет:
Задолбал уже своими "выложи"

ты задолбал уже это писать после моего поста! тебе в кайф?



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 14 июня 2012 16:20 · Поправил: Vovan666
· Личное сообщение · #3

schokk_m4ks1k пишет:
попробуй сделать Search and Replace Patch со смещением байт! может поможет)

чё за бред.
Fileschokk_m4ks1k пишет:
залей два файла и выложи сюда или в личку кинь!

Задолбал уже своими "выложи", один хрен не поможешь! Да и человеку больше теория нужна.

Firex4
берешь OllyDbg и в ней пишешь свой код. после чего пкм->Copy to Executable->All Modifications->пкм-Save File
Если код уже написан, то поможет плагин Multilmate Assembler.
Так же любители досовских мордочек используют Hiew.

| Сообщение посчитали полезным: Firex4, hlmadip, ZaZa, TLN, plutos

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

Создано: 14 июня 2012 17:19 · Поправил: Firex4
· Личное сообщение · #4

Vovan666, Не могу я разобраться в интерфейсе OllyDbg
Установил плагин, открываю свой exe, открываю плагин Multilmate Assembler, вставляю в него измененный код с IDA, жму Assemble - результата нет, лишь ошибка(ожидался адрес).
Вот код с IDA:
Code:
  1. .text:00468700 sub_468700      proc near               ; CODE XREF: sub_42AA50+1Ep
  2. .text:00468700                                         ; sub_449A00+9Fp ...
  3. .text:00468700                 jmp     sub_690430
  4. .text:00468700 sub_468700      endp
  5. .text:00468700
  6. .text:00468705 ; ---------------------------------------------------------------------------
  7. .text:00468705
  8. .text:00468705 loc_468705:
  9. .text:00468705                 mov     ecx, eax
  10. .text:00468707                 sub     ecx, ds:8F4E18h
  11. .text:0046870D                 cmp     ecx, 80h
  12. .text:00468713                 jle     short loc_468729
  13. .text:00468715                 push    offset aExe_err_client ; "EXE_ERR_CLIENT_CMD_OVERFLOW"
  14. .text:0046871A                 push    1
  15. .text:0046871C                 call    loc_4FD330
  16. .text:00468721                 mov     eax, ds:8F4E14h
  17. .text:00468726                 add     esp, 8
  18. .text:00468729
  19. .text:00468729 loc_468729:                             ; CODE XREF: .text:00468713j
  20. .text:00468729                 add     eax, 1
  21. .text:0046872C                 mov     ds:8F4E14h, eax
  22. .text:00468731                 and     eax, 7Fh
  23. .text:00468734                 shl     eax, 0Ah
  24. .text:00468737                 add     eax, 8F4E1Ch
  25. .text:0046873C                 push    eax
  26. .text:0046873D                 mov     eax, [esp+8]
  27. .text:00468741                 call    sub_509100
  28. .text:00468746                 pop     ecx
  29. .text:00468747                 retn
  30. .text:00468747 ; ---------------------------------------------------------------------------
  31. .text:00468748                 align 10h
  32. .text:00468750
  33. .text:00468750 ; --------------- S U B R O U T I N E ---------------------------------------


00468700 - 00468704 - измененный код, который должен быть равным 4 байта.
Как это дело правильно подгрузить в Multilmate Assembler?

P.S. Также чувствую я, что заменить придется не 4 байта, а около 5.
Пришлось добавить метку loc_468705, а в дефолтном коде последующий код начинался вроде как с 468704.



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

Создано: 14 июня 2012 17:26 · Поправил: hlmadip
· Личное сообщение · #5

как я понимаю, адреса уже адаптированны под непатченный exe.
Тогда грузишь в Olly свой exe, вбиваешь ручками это
Code:
  1. .text:00468700                 jmp     sub_690430

Проходишь по адресу джампа, ручками вбиваешь необходимый код, а потом
Vovan666 пишет:
после чего пкм->Copy to Executable->All Modifications->пкм-Save File


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

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

Создано: 14 июня 2012 19:34
· Личное сообщение · #6

hlmadip, Сделал все как и сказали, но выходит небольшая помеха.
Во первых - работы exe нарушается.
Во вторых - при открытии exe в IDA замененные куски куда имеют немного другой вид.
Вот примеры:
v1.0
Первый кусок(4 байта).
Code:
  1. .text:00468660
  2. .text:00468660 ; --------------- S U B R O U T I N E ---------------------------------------
  3. .text:00468660
  4. .text:00468660 ; Attributes: thunk
  5. .text:00468660
  6. .text:00468660 sub_468660      proc near               ; CODE XREF: sub_42AAC0+1Ep
  7. .text:00468660                                         ; sub_4499D0+9Fp ...
  8. .text:00468660                 jmp     sub_68F100
  9. .text:00468660 sub_468660      endp
  10. .text:00468660
  11. .text:00468665 ; ---------------------------------------------------------------------------
  12. .text:00468665 ; START OF FUNCTION CHUNK FOR sub_68F100
  13. .text:00468665

Второй кусок(41 байт).
Code:
  1. .text:0068F100
  2. .text:0068F100 ; --------------- S U B R O U T I N E ---------------------------------------
  3. .text:0068F100
  4. .text:0068F100
  5. .text:0068F100 sub_68F100      proc near               ; CODE XREF: sub_468660j
  6. .text:0068F100
  7. .text:0068F100 arg_0           = dword ptr  8
  8. .text:0068F100
  9. .text:0068F100 ; FUNCTION CHUNK AT .text:00468665 SIZE 00000043 BYTES
  10. .text:0068F100
  11. .text:0068F100                 nop
  12. .text:0068F101                 nop
  13. .text:0068F102                 nop
  14. .text:0068F103                 nop
  15. .text:0068F104                 nop
  16. .text:0068F105                 push    eax
  17. .text:0068F106                 mov     eax, [esp+8]
  18. .text:0068F10A
  19. .text:0068F10A loc_68F10A:                             ; CODE XREF: sub_68F100+18j
  20. .text:0068F10A                 cmp     byte ptr [eax], 0
  21. .text:0068F10D                 jz      short loc_68F11A
  22. .text:0068F10F                 cmp     byte ptr [eax], 3Bh
  23. .text:0068F112                 jnz     short loc_68F117
  24. .text:0068F114                 mov     byte ptr [eax], 0Dh
  25. .text:0068F117
  26. .text:0068F117 loc_68F117:                             ; CODE XREF: sub_68F100+12j
  27. .text:0068F117                 inc     eax
  28. .text:0068F118                 jmp     short loc_68F10A
  29. .text:0068F11A ; ---------------------------------------------------------------------------
  30. .text:0068F11A
  31. .text:0068F11A loc_68F11A:                             ; CODE XREF: sub_68F100+Dj
  32. .text:0068F11A                 pop     eax
  33. .text:0068F11B                 mov     eax, ds:8F3D8Ch
  34. .text:0068F120                 jmp     loc_468665
  35. .text:0068F120 sub_68F100      endp
  36. .text:0068F120


v2.0(после моих вставок)
Вставлял построчно.

Первый кусок кода(4 байта).
Code:
  1. .text:00468700 ; --------------- S U B R O U T I N E ---------------------------------------
  2. .text:00468700
  3. .text:00468700 ; Attributes: thunk
  4. .text:00468700
  5. .text:00468700 sub_468700      proc near               ; CODE XREF: sub_42AA50+1Ep
  6. .text:00468700                                         ; sub_449A00+9Fp ...
  7. .text:00468700                 jmp     sub_690430
  8. .text:00468700 sub_468700      endp
  9. .text:00468700
  10. .text:00468705 ; ---------------------------------------------------------------------------
  11. .text:00468705                 mov     ecx, eax

Прошу заметить, метка loc_468705 - отсутствует, а идет продолжение кода(в отличии от v1.0 - там метка есть, на которую потом и возвращается).

Второй кусок кода(41 байт).
Code:
  1. .text:00690430 ; --------------- S U B R O U T I N E ---------------------------------------
  2. .text:00690430
  3. .text:00690430
  4. .text:00690430 sub_690430      proc near               ; CODE XREF: sub_468700j
  5. .text:00690430
  6. .text:00690430 arg_0           = dword ptr  8
  7. .text:00690430
  8. .text:00690430                 nop
  9. .text:00690431                 nop
  10. .text:00690432                 nop
  11. .text:00690433                 nop
  12. .text:00690434                 nop
  13. .text:00690435                 push    eax
  14. .text:00690436                 mov     eax, [esp+arg_0]
  15. .text:0069043A
  16. .text:0069043A loc_69043A:                             ; CODE XREF: sub_690430+18j
  17. .text:0069043A                 cmp     byte ptr [eax], 0
  18. .text:0069043D                 jz      short loc_69044A
  19. .text:0069043F                 cmp     byte ptr [eax], 3Bh
  20. .text:00690442                 jnz     short loc_690447
  21. .text:00690444                 mov     byte ptr [eax], 0Dh
  22. .text:00690447
  23. .text:00690447 loc_690447:                             ; CODE XREF: sub_690430+12j
  24. .text:00690447                 inc     eax
  25. .text:00690448                 jmp     short loc_69043A
  26. .text:0069044A ; ---------------------------------------------------------------------------
  27. .text:0069044A
  28. .text:0069044A loc_69044A:                             ; CODE XREF: sub_690430+Dj
  29. .text:0069044A                 pop     eax
  30. .text:0069044B                 mov     eax, ds:8F3D8Ch
  31. .text:00690450                 jmp     sub_468700
  32. .text:00690450 sub_690430      endp
  33. .text:00690450
  34. .text:00690450 ; --

Тут по сути различий нет.

P.S. Может я что нибудь опять забыл?
заранее спасибо.



Ранг: 15.5 (новичок), 6thx
Активность: 0.01=0.01
Статус: Участник

Создано: 14 июня 2012 19:42 · Поправил: Vintersorg
· Личное сообщение · #7

Code:
  1. .text:00690450                 jmp     sub_468700

разве не на 468705 переход должен быть?

Кстати, я для вставки своего кода в экзешники использую FASM с макросами Grom PE. Крайне удобно даже для очень больших вставок. Рекомендую.

http://board.flatassembler.net/topic.php?t=8876
http://board.flatassembler.net/topic.php?t=8744

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

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

Создано: 14 июня 2012 19:48
· Личное сообщение · #8

Vintersorg, Вот черт! Спасибо вам огромное!



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

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

Было бы неплохо сами файлы увидеть, а то я что-то запутался
Не правильно я посоветовал.
.text:00468700 jmp sub_690430
ведет к отдельной процедуре, никак не связанной с text:00468705 loc_468705:
Поэтому вопервых меняете в оригинальном exe этот переход:
.text:00468700 jmp sub_690430
Потом ищете, где должна быть процедура text:00468705 loc_468705:
и меняете её в соответствии с вашим патчем



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

Создано: 14 июня 2012 19:55
· Личное сообщение · #10

hlmadip, Там получается интересная вещь.
Самой таковой процедуры в оригинале text:00468705 loc_468705 нету.
Строка jmp sub_690430 заменяет некоторую функцию и ведет к дописанной процедуре, которая в свою очередь выполняет замененное действие и выполняет еще несколько, а затем вызывает процедуру, которая должна была образоваться сразу за окончанием вызывающей.
Подправил адрес, пойду проверю :3



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

Создано: 14 июня 2012 20:02 · Поправил: hlmadip
· Личное сообщение · #11

Тоесть код sub_690430 тоже дописанный/изменённый, раз он ссылается на добавленную loc_468705, и вам следует это учесть при патче



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

Создано: 14 июня 2012 20:33 · Поправил: Firex4
· Личное сообщение · #12

hlmadip, В результате все получилось верно, в IDA код идентичен(конечно за исключением адресов).
Но есть пару вопросов:
1)Почему в первом exe IDA добавляет этот комментарий, а у меня нет:
Code:
  1. .text:00468665 ; ---------------------------------------------------------------------------
  2. .text:00468665 ; START OF FUNCTION CHUNK FOR sub_68F100


2) За что отвечает в OllyDbg(asm)(вторая функция(41 байт)) эта строка? Ничего случаем в ней портировать не нужно было?
Code:
  1. MOV EAX,DWORD PTR DS:[8F3D8C]




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

Создано: 14 июня 2012 20:36 · Поправил: hlmadip
· Личное сообщение · #13

первый вопрос - не знаю
второй вопрос
в случае MOV EAX,DWORD PTR DS:[8F3D8C], это пересылка dword'а лежащего по адресу 8F3D8C в eax
Для разъяснений комманд ассемблера пользуйся гуглом



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

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

hlmadip, Насколько хватило моего английского - это идет некая запись в указанное место памяти?
Видимо и для этого нужно искать новое подходящее место.
Надеюсь я не несу сейчас чушь?



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

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

hlmadip, Спасибо большое! Буду корректировать адрес, хотя по правде говоря не могу понять, где его искать. Смещение около 40 байтов, метод тыка надеюсь выручит ;3
P.S.
Это случайно не оно?
Code:
  1. .text:004F3D8C                 fsub    dword ptr [ebx]

Так в том и проблема, что адреса 8F3D8C не существует в помине, границы кода - 68F129, после этого ничего нет.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

Да какие нахрен смещения, школьник херню написал, а ты и повелся.
Открываешь старый файл в olly, Search for->All constants->8F3D8C, найдутся все ссылки на 8F3D8C. После чего смотришь их и ищешь похожий код в новом файле.

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

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

Создано: 16 июня 2012 01:09
· Личное сообщение · #17

Vovan666, Все получилось! Спасибо за разъяснения.


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


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