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

 eXeL@B —› Вопросы новичков —› Как внести изменение в программу, исполняемое однократно?
Посл.ответ Сообщение

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

Создано: 24 сентября 2006 02:39
· Личное сообщение · #1

Привет.
Я новичок и понимаю вопрос ламерский но... что-то никак не найду решение.

Вобщем в Olly надо сделать чтобы CALL ляляля один раз не сработал, а все последующие разы - запускался (иначе виснет).
Тоесть я ставлю туда NOP и брекпоинт, запускаю когда программа подходит к этому месту второй раз - убираю NOP и все работает. Но в exe таким же образом не получится сохранить.

Вот.. помогите с решением.

Еще раз извиняюсь что спрашиваю такую вещь элементарную
Спасибо!



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

Создано: 24 сентября 2006 02:42
· Личное сообщение · #2

Хм, ну вроде если сделать лоадырь тогда будет так, а по другому чёто на ум нечё не приходит.

Лоадырь вроде при занрузке проги один раз запатчит этот кол и всё.

-----
~ the Power Of Reversing team ~





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 24 сентября 2006 02:49
· Личное сообщение · #3

ну можно в конце файла написать типо:

вместа CALL -> JMP на твой код
который проверяет, это первое выполнение или нет
и если нет, то пишет этот CALL обратно на место...

-----
[nice coder and reverser]




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

Создано: 24 сентября 2006 02:54
· Личное сообщение · #4

Hellspawn спасибо! А нельзя ли привести пример такого кода. И что значит "в конце"? там до самого конца программа, нету места куда написать




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

Создано: 24 сентября 2006 02:54
· Личное сообщение · #5

найти правельнай колл и занопить его а нужные для загрузки проги колы не трогать. ))



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

Создано: 24 сентября 2006 02:58
· Личное сообщение · #6

Red Bar0n, я что-то там все перерыл, только таким образом выходит... Тоесть наверняка и правильнее можно, но теперь уже хочу именно так сделать, просто ради того чтобы узнать можно ли сделать это и как сделать



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

Создано: 24 сентября 2006 03:04
· Личное сообщение · #7

Вот заодно еще хотел спросить... если я нашел в середине где-нибудь десяток NOP'ов после RETN, можно использовать это место для размещения своего кода?



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

Создано: 24 сентября 2006 03:10
· Личное сообщение · #8

Trogi пишет:
Вот заодно еще хотел спросить... если я нашел в середине где-нибудь десяток NOP'ов после RETN, можно использовать это место для размещения своего кода?


Конечно, используй.
Странный у тебя вопрос.




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

Создано: 24 сентября 2006 03:13
· Личное сообщение · #9

Trogi
обычно перед секцией ресурсов много кодеса пустого (а впрогах на делфи его в 3 раза больше) туда вписывай код и прыгай с оеп на это место (или хз откуда там ты прыгаешь) тока незабудь вернуться обратно



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

Создано: 24 сентября 2006 03:19
· Личное сообщение · #10

Ура! место свободное нашел, прыгнуть и вернуться получилось

Как бы теперь сделать чтобы он все разы вернулся тудаже, а первый раз на строчку ниже? Поскольку каждый раз программа приходит туда с разными значениями в регистрах, надо както наверное проверить значение регистра и к этому привязать условие джампа? Не поможите с этим? )



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

Создано: 24 сентября 2006 03:51 · Поправил: asd
· Личное сообщение · #11

Твой код:
push ebp
call get_ip
get_ip:
pop ebp
sub ebp,offset get_ip
cmp num[ebp],0
jne not_first
mov num[ebp],1
add dword ptr [esp+4],chislo ;chislo - на сколько тебе надо изменить адрес возврата.
not_first:
pop ebp
ret
num dd 0

Секция,где будет твой код должна быть доступна на запись.

Нули после retn стоит использовать осторожно - они могут оказаться данными



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

Создано: 24 сентября 2006 04:09
· Личное сообщение · #12

asd, спасибо огромное! Сейчас попробую



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

Создано: 24 сентября 2006 04:32
· Личное сообщение · #13

Не получается нету столько NOP ов нигде. Самое большее 16 подряд, а некоторые команды сразу по несколько занимают...



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

Создано: 24 сентября 2006 04:44
· Личное сообщение · #14

Вот так еще пытаюсь:

Первый раз к тому месту где мне нужно сделать 1разовое исполнение моего кода всегда получается что EAX содержит 0000000B.

Я пытаюсь сделать такое:

ADD EBP,0B ;заношу в свободный на данный момент (он содержит нули) EBP 0000000B
CMP EAX,EBP (сравниваю) получаю 1цу в Z
JZ (на следующую после ненужного мне CALL'а строчку) ; прыгаю если в Z =1
RETN (возвращаюсь если не сработал JZ)


Проблема только в том, что почле выполнения этого кода через некотрое время это приводит к падению программы с сообщением: Don't know how to step, becouse memory at adress FFFFFFFF is not readable. Try to change EIP or pass execution to program.

Что я неправильно делаю? (((



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

Создано: 24 сентября 2006 05:23
· Личное сообщение · #15

Trogi пишет:
JZ (на следующую после ненужного мне CALL'а строчку) ; прыгаю если в Z =1

а куда адрес возврата из стека деваеш

cmp eax,0bh
jz @f
add [esp],chislo
@@:
retn

Как так места нет? А в конце секций что, вообще нет места? Если нет, то добавь новую секцию.



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

Создано: 24 сентября 2006 06:08
· Личное сообщение · #16

Мне стыдно за свои глупые вопросы но...

jz @f не получается в олли добавить - пишет unknown indentifier при попытке вписать такую строку

Как добавить новую секцию?



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

Создано: 25 сентября 2006 00:06
· Личное сообщение · #17

Так ты ето в оле делаешь. Возьми масм скомпилируй кусок кода и посмотри как он выглядит. На добавление секции пока забей, а если очень хочется изучай pe формат. Свободное место наверняка есть в заголовке.



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

Создано: 25 сентября 2006 00:42 · Поправил: hell
· Личное сообщение · #18

У меня была такая же пролема. Я нашел прямо перед call'ом прыжок который не выполняется, запомнил какие когда значения в регистрах и переправил его на свой код:
test eax,eax ;Проверяю чему равен eax
je адрес ;Если то что мне нужно то прыгаю
mov dword ptr[адрес где заменять],число ;Возвращаем замененные быйты
push адрес2 ;Адрес после прыжка который я заменил
retn


адрес: mov dword ptr[адрес где заменять],число ;На что заменять
push адрес2
retn

Все делал в Olly



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 25 сентября 2006 01:31
· Личное сообщение · #19

Trogi
jz @f не получается в олли добавить
@f это метка. В Olly нужно писать реальный адрес
На сколько я понял call 00XXXXXX не должен выполниться если eax==0Bh
:00000001 push eax (это пример)
:00000002 call 00XXXXXX
:00000007 bla-bla
Делай так
:00000001 jmp 00YYYYYY ; где 00YYYYYY свободное место (куча нолей. Посмотри по адресу :400400 )
:00000006 nop
:00000007 bla-bla
........
По адресу 00YYYYYY пишешь след. код
cmp eax,0Bh
jz metka ; Перепрыгиваем call 00XXXXXX если eax==0Bh
push eax ; если eax не 0Bh выполняем call 00XXXXXX
call 00XXXXXX
metka:
jmp 00000007 ; возврат на выполнение проги
вместо "metka" пиши реальный адрес куда надо\ненадо прыгать (т.е. адрес команды jmp 00000007)
З.Ы. Для добавления новой секции или поиска свободного места пользуй утиль ToPo12 (правда на нее ругаются антивири) или используй плуг к PEiD'у Section Tool
З.Ы. Необходимо учитывать, если перед вызовом call 00XXXXXX что то кладется на стек, то все эти
Push надо перенести в свой код, потому как черевато что упадет стек



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

Создано: 25 сентября 2006 02:32
· Личное сообщение · #20

чтото я со своим кодом накосячил.
Сделай так:
оригинальный код:
call xxxx
меняй на:
call yyyy

по call yyyy попадаем на твой код:

push eax
mov eax,[esp+4] ;адрес возврата
mov [eax-4],xxxx ;меняем уууу на хххх
pop eax
retn ;в зависимости от того сколько параметров принимает call

после выполнения этого кода вместо call yyyy будет call xxxx



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

Создано: 25 сентября 2006 12:05
· Личное сообщение · #21

Сорри что пропал, был без инета.

Всем огромное СПАСИБО за помощь!
Первое место пропатчил, вобщем еще чуть-чуть и думаю все заработает.

Еще раз спасибо большущее за помощь! Теперь не пропаду

P.S. Нули нашел Я оказывается в секции кода их искал...



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

Создано: 25 сентября 2006 14:02
· Личное сообщение · #22

чтоб нули найти - открываешь прогу в хекс редакторе, далее смотришь нули, затем переводишь оффсет места с нулями в RVA - и видишь в памяти место под патч

-----
Само плывет в pуки только то, что не тонет.



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


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