Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите с программой IDA... (http://forum.oszone.net/showthread.php?t=257814)

by_gangster 03-04-2013 23:41 2125332

Помогите с программой IDA...
 
Здравствуйте уважаемые программисты помогите разобраться с одним вопросом по программе IDA.. Писал тут

Delirium 04-04-2013 05:53 2125401

А здесь продублировать нельзя? Нет желания копаться в ru board'овской свалке.

yurfed 04-04-2013 06:09 2125402

Цитата:

Цитата by_gangster
помогите разобраться с одним вопросом по программе IDA »

Может стоит задать этот вопрос здесь, а не отфутболивать по разным ссылкам?
Скажите хотя бы версию IDA, которой пользуетесь. Там столько вариантов, что достаточно трудно понять про что вы говорите. И если можно, ссылку на ваш вариант. Так будет легче понять.
Посмотрите здесь, думаю найдёте всё, что вам нужно.

by_gangster 04-04-2013 18:59 2125787

Имеется .dll файл который я открыл в программе IDA (v6.1) и отредактировал. Как мне теперь сохранить обратно в dll формате ?

deviance 04-04-2013 19:30 2125808

by_gangster, IDA, насколько я знаю, умеет только генерировать .diff файлы, в которых различия между оригинальным файлом и измененным записаны в формате:
Код:

offset: old-byte new-byte
Патч нужно делать самому - руками в hex-редакторе. Или напишите утилиту.

SharkyUA 05-04-2013 01:20 2126005

Создание патчей (dif) в IDA (Англ.)

deviance 05-04-2013 16:12 2126321

by_gangster, можете использовать следующий код:
Код:

#include <stdio.h>
#include <Windows.h>
#include <ImageHlp.h>

#define MAX_BIN_PATCHES 100
#define MAX_LINE        17
#define CHUNK_FORMAT    "%08x: %02x %02x"

typedef struct patch_chunk_s{
        unsigned int  offset;
        unsigned char old_byte;
        unsigned char new_byte;
} patch_chunk_t;

int read_chunks(char* from_file, patch_chunk_t* chunks){
        char  buf[MAX_LINE] = {0};
        FILE* f = NULL;
        int  cnt = 0;

        f = fopen(from_file, "r");
        if ( f == NULL )
                return -1;

        while ( cnt < MAX_BIN_PATCHES ){
                if ( fgets(buf, MAX_LINE, f) == NULL){
                        break;
                } else if ( *buf == '\n' || buf[8] != ':' || buf[9] != ' ' || buf[12] != ' '){
                        continue;
                } else
                        sscanf(buf, CHUNK_FORMAT, &chunks[cnt].offset, &chunks[cnt].old_byte, &chunks[cnt].new_byte);
                        cnt++;
        }
        return cnt;
}

void write_chunks(LOADED_IMAGE* image, patch_chunk_t* chunks, unsigned nchunks){
        unsigned idx = 0;
        while ( idx < nchunks )
        {
                if ( chunks[idx].offset > image->SizeOfImage ){
                        printf("0x%08X: invalid offset\n", chunks[idx].offset);
                }
                else if ( image->MappedAddress[chunks[idx].offset] != chunks[idx].old_byte ){
                        printf("0x%08X: %02X -> %02X err\n", chunks[idx].offset, chunks[idx].old_byte, chunks[idx].new_byte);
                }
                else {
                        image->MappedAddress[chunks[idx].offset] = chunks[idx].new_byte;
                        printf("0x%08X: %02X -> %02X ok\n", chunks[idx].offset, chunks[idx].old_byte, chunks[idx].new_byte);
                }
                idx++;
        }
}

int main(int argc, char* argv[])
{
        patch_chunk_t chunks[MAX_BIN_PATCHES] = {0};
        char  usage[] = {"usage: [file-to-patch] [ida-diff]\n"};
        int  ret = -1;
        char* image_path = NULL;
        char* diff_file = NULL;
        unsigned nchunks = 0;

        LOADED_IMAGE li;

        if (argc < 3){
                printf(usage);
                return -1;
        }
        else {
                image_path = argv[1];
                diff_file = argv[2];
        }

        ret = MapAndLoad(image_path, NULL, &li, 0 /*.exe default ext.*/, 0 /*readwrite access*/ );
        if ( ret == 0 ){
                printf("Unable to load %s\n", image_path);
                return -1;
        }
        else {
                printf("Image %s loaded.\n",image_path);
        }
        ret = read_chunks(diff_file, chunks);

        if ( ret > 0 ){
                nchunks = ret;
                printf("File %s loaded. %d chunks read.\n", diff_file, nchunks );
        }
        else {
                printf("Unable to load %s: ", diff_file);
                if ( ret == 0 )
                        printf("file is empty.\n");
                else
                        printf("no access.\n");
                return -1;
        }

        write_chunks(&li, chunks, nchunks);
        ret = UnMapAndLoad(&li);
        return ret;
}


by_gangster 06-04-2013 09:34 2126712

deviance, Я извеняюсь конечно, но это что за язык программирования ? Я просто в программировании вобще 0.

deviance 06-04-2013 21:07 2127094

by_gangster, что же Вы изменяете в .dll файле, если не знаете программирования? Текстовые строки?
SharkyUA дал отличную ссылку на статью. Ознакомьтесь.

by_gangster 11-04-2013 17:57 2130529

deviance, Можете пожалуйста помочь, я в той статье которую дал SharkyUA, не понял... Извеняюсь...

P.S Да меняю
Цитата:

Цитата deviance
Текстовые строки »


deviance 11-04-2013 19:54 2130602

by_gangster, для редактирования текстовых строк Вам будет достаточно шестнадцатеричного редактора. Например, 010 Editor.
Откройте свой файл этим (или любым другим) редактором, найдите ненужную строку и замените на нужную.

by_gangster 11-04-2013 21:07 2130661

deviance, Можно ли сделать пробел ? В этой программе т.е если там текст text а я пишу texting нужно что бы остальной текст не удалялся

deviance 12-04-2013 00:01 2130738

by_gangster, то есть, Вы хотите дописать что-то к слову "text"? И чтобы при этом весь текст, который правее, съехал? Этого сделать не получится.


Время: 21:07.

Время: 21:07.
© OSzone.net 2001-