Форум: Форум C++Разное
Новые темы: 00
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск кода и определение его позиции в бинарнике
 
 автор: DDK   (18.02.2007 в 06:26)   письмо автору
 
 

Есть бинарник, нужно в нем найти такой отрывок (HEX):

F8 AC 2C 9D E3 D4 2B 4D BD 30 91 6E D8 4F 31 DC

и определить offset его начала :)

  Ответить  
 
 автор: cheops   (18.02.2007 в 15:16)   письмо автору
 
   для: 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 Это если файл не очень большой, так как приведённый выше код его полностью читает в оперативную память.

  Ответить  
 
 автор: DDK   (18.02.2007 в 15:50)   письмо автору
 
   для: cheops   (18.02.2007 в 15:16)
 

Файл большой, 50мб :(

  Ответить  
 
 автор: cheops   (18.02.2007 в 16:05)   письмо автору
 
   для: 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;
}

  Ответить  
 
 автор: DDK   (18.02.2007 в 16:21)   письмо автору
 
   для: cheops   (18.02.2007 в 16:05)
 

Спасибо, Игорь, попробую !

  Ответить  
 
 автор: DDK   (18.02.2007 в 16:34)   письмо автору
 
   для: 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


Простите, если глуплю... только учусь, как видите.

  Ответить  
 
 автор: cheops   (18.02.2007 в 16:55)   письмо автору
 
   для: DDK   (18.02.2007 в 16:34)
 

Да просто в консоли откомпилируйте без использования среды разработки
bcc32 имя_файла.cpp

быстрее получится, я сейчас убегаю, вечером попробую прогнать программу через Builder - выложу проект - вообще-то не должно быть проблем.

PS Когда консольный проект создаёте галку VCL убирайте - скорее всего в этом дело.

  Ответить  
 
 автор: pini-pini   (18.02.2007 в 17:04)   письмо автору
2.7 Кб
 
   для: DDK   (18.02.2007 в 16:34)
 

В общем, что-то вроде такого.
В аттаче исходники + проект (Borland C++Builder)

  Ответить  
 
 автор: DDK   (18.02.2007 в 17:59)   письмо автору
 
   для: pini-pini   (18.02.2007 в 17:04)
 

Спасибо, работает !

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования