Посл.ответ |
Сообщение |
Ранг: 8.3 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 30 августа 2007 15:37 · Личное сообщение · #1
Необходимо изменить код и занести изменения в исполняемый файл. Нашел информацию про структуру PE-файла, но не знаю как это все практически реализовать. Задача заключается в следующем: необходимо открыть выполняемый фал, занести туда изменения(правка RVA -ссылок), сохранить изменения. Если у кого есть исходникии на Delphi, было бы вообще замечательно. Помогите, пожалуйста, буду очень признателен!
| Сообщение посчитали полезным: |
|
Ранг: 301.4 (мудрец), 194thx Активность: 0.17↘0.01 Статус: Участник
|
Создано: 30 августа 2007 16:02 · Личное сообщение · #2
Если просто патч то не нужно знать структуру РЕ просто открой файл как текстовичек подправь и сохрани
| Сообщение посчитали полезным: |
Ранг: 284.8 (наставник), 6thx Активность: 0.15↘0 Статус: Участник
|
Создано: 30 августа 2007 16:16 · Личное сообщение · #3
woodyfon
А ты именно сам хош его скомпилить?
ИМХО для стандартных патчей лучше юзать стандартные решения, т.е. пользоваться уже готовыми патчерами.
Например DUP - diablo2oo2.di.funpic.de/dup.htm
| Сообщение посчитали полезным: |
Ранг: 1.2 (гость) Активность: 0=0 Статус: Участник
|
Создано: 30 августа 2007 16:57 · Личное сообщение · #4
На дельфи ничего предложить не могу, но я недавно писал простенький патч на с++. Он писался с целью, что бы вспомнить азы этого языка, т.к. я на нем не программил уже года эдак четыре. Поэтому он может содержать не самые оптимальные решения. Но он работает и точно ясно, что именно он делает.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <io.h>
#include <string.h>
int main()
{
printf("Crack for some program...\n");
int handle;
char data = 0xB0; //тут хранится первый байт, что будем вводить.
if ((handle = open("some_program.exe", O_WRONLY | O_BINARY))== -1){ //подаем имя экзешника, т.к. оно нам заведомо известно(патч ведь к конкретной проге)
printf("Can't find the some_program.exe\n");
printf("Please check the directory\n");
return 1;
} else{
lseek(handle, 0xE0E7, SEEK_SET);//тут актуален второй параметр, он указывает куда будем вводить байты
write(handle, &data, sizeof(char));//вводим первый байт
data = 0x01;//второй байт
write(handle, &data, sizeof(char));//вводим
close(handle);
printf("Crack succesfully applied\n");
printf("Press ENTER to exit...\n");
scanf ("%c",&data);
}
return 0;
}
Конечно параметры меняем на свое усмотрение, если нужно изменить больше байтов, то лишь повторяем соответсвующие шаги. Из недостатков - консольный интерфейс
| Сообщение посчитали полезным: |
Ранг: 158.7 (ветеран) Активность: 0.11↘0 Статус: Участник
|
Создано: 30 августа 2007 21:01 · Личное сообщение · #5
[u][/u] woodyfon пишет:
сли у кого есть исходникии на Delphi, было бы вообще замечательно
Вот тут http://team-x.ru/guru-exe/path=Sources%2FCracks%2FDelphi/ есть.
----- Я ещё не волшебник, я только учусь... | Сообщение посчитали полезным: |
Ранг: 6.4 (гость) Активность: 0=0 Статус: Участник
|
Создано: 31 августа 2007 15:47 · Личное сообщение · #6
simple example:
var
F : file of byte;
Address : integer;
Before, After : char;
begin
AssignFile(F, FileName);
Reset(F);
Seek(F, Address);//f.e. Address=$400000
BlockRead(F, Before, 1);
Seek(F, Address);
After:=char(Byt);//f.e. Byt=$90 (nop)
BlockWrite(F, After, 1);
CloseFile(F);
end;
| Сообщение посчитали полезным: |
Ранг: 51.7 (постоянный) Активность: 0.02↘0 Статус: Участник
|
Создано: 08 сентября 2007 11:15 · Личное сообщение · #7
sai_NT пишет:
Seek(F, Address);//f.e. Address=$400000
Ничего себе адресок в файле! Не нужно путать адреса в файле и адреса в памяти!
woodyfon Если не знаешь файловое смешение и сам затрудняешься его вычислить, то воспользуйся готовыми решениями, например в PE tools есть FLC (File Location Calculator), где VA или RVA и получаешь offset в файле.
| Сообщение посчитали полезным: |