PDA

Просмотр полной версии : Чем выдирать строки из бинарников


fire64
12.12.2008, 00:16
подскажите чем выдрать строки из бинарников ( dll, exe etc ) написанных на C++

я пользуюсь ida но она слишком громоздкая для таких целей.

уточняю речь идет о строках вшитых в бинарник, а не хранящихся в ресурсах

0verbreaK
12.12.2008, 00:30
Что подразумевается под словом "выдирать"?

уточняю речь идет о строках вшитых в бинарник, а не хранящихся в ресурсах

Строки и хранятся в PE файле, в секции рессурсов

desTiny
12.12.2008, 00:31
ну, к примеру, оля -> прав кнопка -> search for -> all referenced text strings
или W32dasm знаменитый - string references... вообще это все программки вроде умеют делать...

ртуть
12.12.2008, 00:34
strings *.exe *.dll | grep aj00nigga

BlackSun
12.12.2008, 00:38
OllyDbg как вариант

De-visible
12.12.2008, 00:53
OllyDbg как вариант
OllyDbg согласен.

0x0c0de
12.12.2008, 00:53
>> Строки и хранятся в PE файле, в секции рессурсов

да ну.то есть я не могу их положить в секцию кода?)

ии это самое, господа, не повторяйтесь. один раз сказали, что оля хорошо, думаю товарищ понял. 2 ТС кстати в иде это удобней всего делать, не знаю что уж там такого громоздкого. другое дело, что файл мб быть пакованным чем-либо/строки расшифровываются в процессе выполнения кодеса. тогда конечно непосредственно под отладчиком надо рипать (и в иде кстати тоже отладчик есть).

Hellsp@wn
12.12.2008, 01:03
не знаю что уж там такого громоздкого ну зачем же микроскопом гвозди забивать? (с)

для строк можешь и HDasm заюзать, очень шустрая штука и даже русские буковки ищет :)

procedure
12.12.2008, 10:59
Если .net, то IL dasm || Reflector.

izlesa
12.12.2008, 11:25
а можно написать что-то своё ^____--



#include <stdio.h>
#include <conio.h>
#include <string.h>

#define BUFFSIZE 100

int main(int argc, char *argv[])
{
FILE *in_file;
char buffer[BUFFSIZE];
char word[BUFFSIZE];
int counter = 0;
int wordflag = 0;
int offset = 0;

if(argc != 2)
{
printf("USAGE : filter file");
return 1;
}

in_file = fopen(argv[1], "rb");
if(in_file == NULL)
{
printf("Error : unable to open file %s", argv[1]);
getch();
return 2;
}
else
printf("File %s is open\n", argv[1]);

while(fread(buffer, 1, 1, in_file) > 0)
{
if(buffer[0] >= ' ' && buffer[0] <= '~')
{
if(wordflag != 1)
wordflag = 1;

word[counter] = buffer[0];
counter++;

}
else
{
if(counter != 0)
{
word[counter + 1] = '\0';
if(strlen(word) > 5)
printf("%8.8X : %s\n", offset, word);
}
counter = 0;
wordflag = 0;
}
offset++;
}

getch();
return 0;
}



но это лирика ... и к Юникоду не подходит ...

fire64
12.12.2008, 12:07
Ладно с этим понятно

теперь вопрос

возможно ли изменять длину строк ?
и существуют ли вообще какие-либо редакторы строк ?

ProTeuS
12.12.2008, 13:55
restorator

fire64
12.12.2008, 15:24
restorator
я уже говорил что речь идет о строках находящихся в сегменте с данными, а не в ресурсах

izlesa
12.12.2008, 17:12
шиздец ... а не судьба про приведенные выше инструменты прочитать?
В Олли, ИДЕ и в любом hex редакторе это можно сделать. При некоторых ограничениях конечно (или при некоторых знаниях ^____^ которых у мну нет). А можно просто в секции данных найти пустое место, вписать туда нужную строку и помять указатели при выводе. А можно ... а много чего можно.

0verbreaK
14.12.2008, 00:41
вы меня утомили все,

20x0code да если хочешь можешь я даю добро
;)

0verbreaK
14.12.2008, 00:43
.data

sz0xcode db "0x0code",0

Где будет хранится строка?

ProTeuS
14.12.2008, 03:07
если длпустим фасмом будешь компилить, хранится будет в секции данных .data, а не ресурсах. открывай хекс-едитором да правь как захо4ешь

fromRIDDER
16.12.2008, 22:40
TC, в С строки (если не ресурсах) заканчиваются нулём, сколько от начала строки до нуля, такая и длина строки. Т.е. если в середине строки (можно и в другом месте) заменить имеющийся байт на ноль, длина строки уменьшится. Чтобы увеличить длину строку, нужно смотреть по обстоятельствам. Если после строки есть ничем не занятое пространство, заканчивающий строку ноль сместить насколько возможно. Можно найти все ссылки на данную строку и подменить её (ссылку) на не занятое пространство, длина строки варьируется от размеров этого самого пространства, если его мало, можно создать новую секцию нужного размера.

Совет всем пишущим ответы на вопросы: читать их (вопросы) внимательнее.

Sunzer
17.12.2008, 19:24
Строки еще можно смотреть плагином для PEID, плагин называется String Viewer
Вот ссылка: http://www.rapidshare.ru/861276 (24 КБ)

neprovad
17.12.2008, 21:36
Применительно к строкам приложений сделанных в delphi, надо не забывать о числе (длине строки) перед искомой строкой и менять его соответственно в нужную сторону.

ProTeuS
17.12.2008, 23:18
не понимаю о 4ем ты, в слу4ае с VCL или в формах строках?

вот пример приложения на делфе

0040A9E4 |. 68 84634400 PUSH lol.00446384 ; /ProcNameOrOrdinal = "BackupRead"
Foolow in dump
->
00446374 00 00 00 00 ....
00446384 42 61 63 6B 75 70 52 65 61 64 00 00 BackupRead..

neprovad
18.12.2008, 01:51
00452AFF B8 A42C4500 MOV EAX, 00452CA4 ; ASCII "ffset"
...........
00452C94 6E 73 77 65 72 00 00 00 FF FF FF FF 05 00 00 00
00452CA4 66 66 73 65 74 00 00 00 FF FF FF FF 05 00 00 00


Как раз показана длина строки - 5 байт. та самая длина без которой функция Length(строка) не выдала бы верного результата.
p.s. не спорю, есть множество строк оканчивающихся нулем

desTiny
19.12.2008, 00:39
в делфе строка это ещё более хитрая структура, чем длина+массив символов. Ещё хранится счётчик обращений - так что, пока это не надо, строчки не копируются.