|
|
|
| Есть бинарник, нужно в нем найти такой отрывок (HEX):
F8 AC 2C 9D E3 D4 2B 4D BD 30 91 6E D8 4F 31 DC
|
и определить offset его начала :) | |
|
|
|
|
|
|
|
для: DDK
(18.02.2007 в 06:26)
| | Можно поступить следующим образом
#include <iostream>
using namespace std;
int main()
{
// Шестнадцатеричная последовательность
unsigned char arr[] = {0xF8, 0xAC, 0x2C, 0x9D,
0xE3, 0xD4, 0x2B, 0x4D,
0xBD, 0x30, 0x91, 0x6E,
0xD8, 0x4F, 0x31, 0xDC};
// Открываем файл
FILE *stream;
if((stream = fopen("php.exe", "r+b")) == NULL)
{
fprintf(stderr, "Cannot open file.\n");
return 1;
}
// Определяем размер файла
fseek(stream, 0L, SEEK_END);
int filesize = ftell(stream);
rewind(stream);
// Читаем содержимое файла в буфер content
unsigned char *content = new char[filesize];
fread(content, filesize, 1, stream);
// Закрываем файл
fclose(stream);
unsigned char *p = NULL;
int i = 0, j = 0;
for(p = content, i = 0; i < filesize; p++, i++)
{
if(*p == arr[0])
{
// Если первый символ последовательности
// найден, смотрим чему равны остальные символы
int flag = 1;
for(j = 1; j < sizeof(arr)/sizeof(arr[0]); j++)
{
if(*(p + j) != arr[j])
{
flag = 0;
break;
}
}
if(flag)
{
// Последовательность найдена, выводим
// смещение
cout << "offset: " << i << endl;
break;
}
}
}
// Освобождаем буфер
delete [] content;
return 0;
} |
PS Это если файл не очень большой, так как приведённый выше код его полностью читает в оперативную память. | |
|
|
|
|
|
|
|
для: cheops
(18.02.2007 в 15:16)
| | Файл большой, 50мб :( | |
|
|
|
|
|
|
|
для: DDK
(18.02.2007 в 15:50)
| | Тогда можно поступить следующим образом
#include <iostream>
using namespace std;
int main()
{
// Шестнадцатеричная последовательность
unsigned char arr[] = {0xF8, 0xAC, 0x2C, 0x9D,
0xE3, 0xD4, 0x2B, 0x4D,
0xBD, 0x30, 0x91, 0x6E,
0xD8, 0x4F, 0x31, 0xDC};
// Открываем файл
FILE *stream;
if((stream = fopen("php.exe", "r+b")) == NULL)
{
fprintf(stderr, "Cannot open file.\n");
return 1;
}
unsigned char ch;
int i = 0, j = 0;
do
{
// Читаем один символ из потока stream
ch = fgetc(stream);
if(ch == arr[0])
{
int flag = 1;
for(j = 1; j < sizeof(arr)/sizeof(arr[0]); j++)
{
ch = fgetc(stream);
if(ch != arr[j])
{
// Возвращаемся обратно
fseek(stream, -j, SEEK_CUR);
flag = 0;
break;
}
}
if(flag)
{
// Последовательность найдена, выводим
// смещение
cout << "offset: " << i << endl;
break;
}
}
i++;
} while (ch != EOF);
// Закрываем файл
fclose(stream);
return 0;
} |
| |
|
|
|
|
|
|
|
для: cheops
(18.02.2007 в 16:05)
| | Спасибо, Игорь, попробую ! | |
|
|
|
|
|
|
|
для: DDK
(18.02.2007 в 16:21)
| | Не, не работает... хотя скорее всего это из-за того, что я пень. Значит открываю я CBuilder 6-й (первый раз поотзуюсь), новый файл, Console Wizard, C++. Вставляю туда этот код. Компилируется нормально, только один ворнинг. А вот при сборке екзешника вот че пишет:
[C++ Warning] find2.cpp(50): W8068 Constant out of range in comparison
[Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
|
Простите, если глуплю... только учусь, как видите. | |
|
|
|
|
|
|
|
для: DDK
(18.02.2007 в 16:34)
| | Да просто в консоли откомпилируйте без использования среды разработки
быстрее получится, я сейчас убегаю, вечером попробую прогнать программу через Builder - выложу проект - вообще-то не должно быть проблем.
PS Когда консольный проект создаёте галку VCL убирайте - скорее всего в этом дело. | |
|
|
|
|
2.7 Кб |
|
|
для: DDK
(18.02.2007 в 16:34)
| | В общем, что-то вроде такого.
В аттаче исходники + проект (Borland C++Builder) | |
|
|
|
|
|
|
|
для: pini-pini
(18.02.2007 в 17:04)
| | Спасибо, работает ! | |
|
|
|