у меня такой вопрос. Как можно изменить несколько инструкций в ехе файле(исходников нет),не ужели для этого надо искать их в нех редакторе и править на уровне машинного кода ,нет ли для этого более удобных инструментов
В зависимости от того, каких именно инструкций... Верно заметили, Многим нравится PEBrowser(мне в том числе). Если хочешь изменить картинки, иконки, текстовые строчки и прочую ерунду(которая по существу не явл. инструкциями) - тут уже те редакторы ресурсов нужны. Restorator к примеру. На сайте полно отличных утилок ))) А если что-то в PE-заголовке поковырять хочешь, то без PETools не обойтись (или аналога)... )))
В общем я бы хотел редактировать команды типа Jcc ну если надо исправить логику в программе. Для начала я подумал ведь надо найти начало инструкций в книге Румянцева (РАБОТА С ФАЙЛАМИ В WIN 32 API) прочитал что сначала в файле расположен ДОС заголовок из него надо узнать где расположен НТ заголовок и дальше в книге много всего, но каким образом вычислить начало инструкций если и написано то не очень понятно(автор пишет что это тема не для этой книги), и дойти получается только до определения начала НТ заголовка #include <windows.h> #include <winNT.rh> #include <winNT.h> #include <stdio.h> FILE *crack; _IMAGE_DOS_HEADER boxD; _IMAGE_NT_HEADERS boxNT; _IMAGE_OPTIONAL_HEADER adrNT; void main() { crack=fopen("exe.exe","r+b"); fread(&boxD,sizeof(boxD),1,crack); /* грузим заголовок ДОСа из него узнаём нчало НТ fseek(crack,boxD.e_lfanew,SEEK_SET); /* выставляем начало НТ fread(&boxNT,sizeof(boxNT),1,crack); //printf(" Signature NT %xh\n",boxNT.Signature); if(boxNT.Signature==IMAGE_NT_SIGNATURE){ MessageBox(NULL,"ok","nt",MB_OK); } adrNT=boxNT.OptionalHeader; /* printf(" AddressOfEntryPoint %xh\n",adrNT.AddressOfEntryPoint); printf(" BaseOfCode %xh\n",adrNT.BaseOfCode); printf(" BaseOfData %xh\n",adrNT.BaseOfData); printf(" SizeOfCode %xh\n",adrNT.SizeOfCode); // дальше незнаю ?????????????????? fclose(crack); } Если кто то знает как вычислить начало инструкций в исполняемом файле относительно его начала подскажите. Да и вот ещё что в книге я прочитал что код должен быть в секции .техт или .СОДЕ в зависимости от компилятора но почему в нех редакторе например .техт примерно в нычале файла а иструкции ближе к концу непонятно ??????? может в секции есть адрес кода ??!!??
jimiforce Ещё в формате PE32 не до конца разобрались, а уже сели писать свой дизассемблер. Возьмите любой приличный дизасм (HIEW, IDA, ...) и посмотрите на его размер. Таким косвенным образом можно заметить, что пары десятков строк сишного кода не хватит для воплощения логики хорошего дизассемблирующего движка. Там слишком много ньюансов. Да и зачем вам писать свой дизасм, когда в сети полно готовых и даже бесплатных? Для начала рекомендую поиграться с RTA (на этом сайте лежит в секции "Инструменты - Дизассемблеры"). Когда инструкции (осмысленный код) в самом конце файла - это верный признак заражения вирусом
Надеюсь на меня никто не обидится, если я немного поделюсь своим опытом. Нужно было установить программу, а она как всегда отказывалась. На диске вместе с ней были какие-то немецкие взломщики, но они не работали. Тогда я решил сам взломать её(в первый раз). Я приблизительно знал, что мне нужно делать(программа выдавала сообщение), и для поиска и подправления нужного участка кода программы решил использовать ИДУ(IDA Pro). Найдя его, я увидел, что всё дело в паре команд(N - константа): CMP REGMEM, N Jxx Label Проблема была в N. Я не стал возиться с Jxx и решил заменить N на M(другая константа). Дело происходило в Windows95 на P54C, DOS-сеанс, Norton Commander. В ИДЕ я только занимался дизассемблированием, а патчил программу непосредственно в NC(F3-F4-F2-Patch). Для того чтобы найти в NC нужное мне место программы и заменить байты, я запомнил эти две команды + 3 до них и 3 после них, ввёл их в Турбо Дебаггере, чтобы получить машинный код, запомнил его. Далее в NC, воспользовавшись поиском строки шестнадцатеричных чисел, нашёл нужный участок кода, убедился(запустив поиск ещё раз), что других таких же участков кода больше нет(именно поэтому искались 8 команд, а не 2), наконец изменил нужные байты в команде CMP REGMEM, N. P.S. Я почти не знаю возможностей ИДЫ. Наверно после того как была найдена команда CMP REGMEM, N, произвести замену N на M можно было непосредственно в самой ИДЕ.