![]() |
eXeL@B —› Вопросы новичков —› Как внести изменение в программу, исполняемое однократно? |
Посл.ответ | Сообщение |
|
Создано: 24 сентября 2006 02:39 · Личное сообщение · #1 Привет. Я новичок и понимаю вопрос ламерский но... что-то никак не найду решение. Вобщем в Olly надо сделать чтобы CALL ляляля один раз не сработал, а все последующие разы - запускался (иначе виснет). Тоесть я ставлю туда NOP и брекпоинт, запускаю когда программа подходит к этому месту второй раз - убираю NOP и все работает. Но в exe таким же образом не получится сохранить. Вот.. помогите с решением. Еще раз извиняюсь что спрашиваю такую вещь элементарную ![]() Спасибо! ![]() |
|
Создано: 24 сентября 2006 02:42 · Личное сообщение · #2 |
|
Создано: 24 сентября 2006 02:49 · Личное сообщение · #3 |
|
Создано: 24 сентября 2006 02:54 · Личное сообщение · #4 |
|
Создано: 24 сентября 2006 02:54 · Личное сообщение · #5 |
|
Создано: 24 сентября 2006 02:58 · Личное сообщение · #6 |
|
Создано: 24 сентября 2006 03:04 · Личное сообщение · #7 |
|
Создано: 24 сентября 2006 03:10 · Личное сообщение · #8 |
|
Создано: 24 сентября 2006 03:13 · Личное сообщение · #9 |
|
Создано: 24 сентября 2006 03:19 · Личное сообщение · #10 Ура! место свободное нашел, прыгнуть и вернуться получилось ![]() Как бы теперь сделать чтобы он все разы вернулся тудаже, а первый раз на строчку ниже? Поскольку каждый раз программа приходит туда с разными значениями в регистрах, надо както наверное проверить значение регистра и к этому привязать условие джампа? Не поможите с этим? ![]() ![]() |
|
Создано: 24 сентября 2006 03:51 · Поправил: asd · Личное сообщение · #11 Твой код: push ebp
Секция,где будет твой код должна быть доступна на запись. Нули после retn стоит использовать осторожно - они могут оказаться данными ![]() |
|
Создано: 24 сентября 2006 04:09 · Личное сообщение · #12 |
|
Создано: 24 сентября 2006 04:32 · Личное сообщение · #13 |
|
Создано: 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. Что я неправильно делаю? ![]() ![]() |
|
Создано: 24 сентября 2006 05:23 · Личное сообщение · #15 |
|
Создано: 24 сентября 2006 06:08 · Личное сообщение · #16 |
|
Создано: 25 сентября 2006 00:06 · Личное сообщение · #17 |
|
Создано: 25 сентября 2006 00:42 · Поправил: hell · Личное сообщение · #18 У меня была такая же пролема. Я нашел прямо перед call'ом прыжок который не выполняется, запомнил какие когда значения в регистрах и переправил его на свой код: test eax,eax ;Проверяю чему равен eax
Все делал в Olly ![]() |
|
Создано: 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 надо перенести в свой код, потому как черевато что упадет стек ![]() |
|
Создано: 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 ![]() |
|
Создано: 25 сентября 2006 12:05 · Личное сообщение · #21 |
|
Создано: 25 сентября 2006 14:02 · Личное сообщение · #22 |
![]() |
eXeL@B —› Вопросы новичков —› Как внести изменение в программу, исполняемое однократно? |