Сборка Абсолютный JMP / CALL к Относительному JMP / CALL Tool / Plugin? - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть эта программа, которую я пытаюсь реконструировать. Я не знаю, был ли это оптимизатор компилятора или обфускация, но теперь некоторые части кода, которые вызывают другие функции, вычисляются с помощью математики, а затем называются, например,

CALL EAX 

Работает правильно, пока не загрузится как DLL в другую программу. Смещения базовых адресов изменены, поэтому теперь все относительные коды работают правильно, но все математические вычисления / jmps не попадают в нужные области.

Итак, я решил, что это легко исправить, превратив все абсолютные вызовы в относительные.

Шагая по коду и позволяя вычислить всю математику, я получаю правильное смещение jmp / call.

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

Абсолютный вызов, это где математика заканчивается:

seg000:0044F7D1                 add     eax, 3B882683h
seg000:0044F7D6                 call    eax

для преобразования в

seg000:0044F7D1                 call     3B882683h

Ну, конечно, вышесказанное не сработает, так как eax уже был чем-то, но это просто пример псевдокода

Ну, мой вопрос не в том, как это сделать, но есть ли плагин, который автоматически делает это для меня в OllyDbg или IDA Pro?

Ответы [ 2 ]

1 голос
/ 30 июля 2015

вы можете использовать LoadLibrary

использовать KERNEL32.LoadLibraryA

KERNEL32.GetProcAddress

вызывать eax

KERNEL32.FreeLibrary

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

вы можете видеть адрес функций dll в некоторых программах, таких как "pe explorer".enter image description here

Вы всегда вызываете 00402008h, но 00402008h не является адресом вашей функции.значение 00402008 является адресом вашей функции.

  • FF25 08204000 вызовет значение 00402008
  • E8 05000000 вызовет eip + 00000005
0 голосов
/ 09 октября 2011

вы хотите получить рассчитанный адрес вызовов переменных, это действительно сложно понять, потому что они не равны, как вы объяснили это в этой части

seg000: 0044F7D1 add eax, 3B882683h seg000: 0044F7D6С помощью eax

сделать такой плагин было бы действительно легко, но его никогда не бывает так.EAX может измениться в этой части кода, поэтому вызов является «переменной».Представьте себе, часть кода управляет дверью в игре или чем-то еще, если вам не разрешено передавать EAX или любой другой регистр изменится на вызов функции, которая не пропускает вас, в противном случае вам разрешено, потому что у вас есть ключ иличто-то вроде этого, и код изменит EAX на адрес, по которому вызов выполняет код, чтобы открыть дверь.Это был просто пример, потому что есть вызовы с переменными.Плагин, о котором вы думаете, должен прослушивать все возможные вызовы, которые могут быть действительно гигантской массой и приводить к ошибкам или отсутствию общего обзора.

Так что самый простой способ для вас - прервать этот вызов и прочитатьрегистр.Я надеюсь, что это может помочь вам понять, или я не ответил правильно, ваш вопрос немного вводит в заблуждение, потому что вы сказали что-то о JMP и инъекции DLL, которая раздражает меня.Вы можете рассказать мне это более подробно в личном сообщении или здесь.

...