Сейчас на форуме: cppasm, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Исходник: по шаблону искать в файле
Посл.ответ Сообщение

Ранг: 11.9 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 20 марта 2016 18:05
· Личное сообщение · #1

Доброго дня господа.

Ищется исходник (или его часть), который позволял бы по шаблону искать в файле определенный набор команд (байт).
НО ...
При положительном результате поиска, надо чтобы искомая строка сохранялась в некий буфер, для того чтобы ее оттуда извлечь, модифицировать и записать в измененном виде на место.

маленький пример набора команд для ясности

add edx, dword ptr [0x00570b84]
mov eax, 1
imul eax, edx, 2

bytes - 03 15 84 0B 57 00 B8 01 00 00 00 6B C2 02

Заменить надо на

mov eax, 3
mov dword ptr [0x00570b84], eax
nop

bytes - B8 03 00 00 00 89 15 84 0B 57 00 90 90 90


А вот другой ...

add ecx, dword ptr [0x00570d40]
mov edx, 1
imul edx, ecx, 3

А этот заменить надо на

mov ecx, 3
mov dword ptr [0x00570d40], ecx
nop


Таких кусков в файле много и в искомых наборах команд, как регистры, так и явные адреса (первая команда - add, xxx [0x00xxxxxx]) всегда будут разные. По этим причинам и нужно наличие временного буфера.

Ни один авто-патчер подобного не умеет.

Кто чем поможет, кто что подскажет?
Меня устроил бы даже скрипт для инно-сетап, если там подобное возможно.

Надеюсь разрисовал все толково ...



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 20 марта 2016 18:51 · Поправил: dosprog
· Личное сообщение · #2

)) Однако..
Там ещё и асм/дизасм должен быть встроенный?

Евть распространяемый с исходниками biew. Там всё это должно быть.






Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 марта 2016 19:05
· Личное сообщение · #3

поиск по маске? иначе слишком сложно получается и в этом нет смысла.

-----
[nice coder and reverser]




Ранг: 11.9 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 20 марта 2016 19:16
· Личное сообщение · #4

ну да, по маске, а как еще ...
dosprog

асм-дизасм ... ?

ищем по маске bytes - 03 ?? ?? ?? ?? 00 ?? 01 00 00 00 6B ?? 02
нашли bytes - 03 15 84 0B 57 00 B8 01 00 00 00 6B C2 02

здесь важная часть фактический адрес - 84 0B 57 00

пишем bytes - B8 03 00 00 00 89 15 84 0B 57 00 90 90 90

и все ...
зачем асм-дизасм ?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 20 марта 2016 19:37 · Поправил: dosprog
· Личное сообщение · #5

--> Link <--

..проще самому написать, чем в чужом ковыряться..

Задача состоит из двух частей - сперва по строке поиска строится двоичная строка и двоичниая маска ,
а потом с помощью этих двух строк выполняется занудный поиск.
Можно выполнять тупо последовательный strcmp, накладывая на текст двоичную маску, а можно помудрить с оптимизацией. Зависит от старательности.



Ранг: 11.9 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 20 марта 2016 20:06 · Поправил: maddmaks
· Личное сообщение · #6

dosprog
АБСОЛЮТНО с вами согласен. Но ...
Если бы для меня это было как два пальца ..., я бы и тему здесь не поднимал.

P.S.
там по вашей ссылке файлик во вложении. мне не достать. Вы не могли бы помочь, если есть такая возможность?
Спасибо



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 20 марта 2016 20:10 · Поправил: dosprog
· Личное сообщение · #7

maddmaks пишет:
Если бы для меня это было как два пальца


Сравнить две строки байтов сможете? - Думаю, да.
А перед этим сделать им AND c двоичной маской? - Тоже не сложно.
А дальше цикл для каждого байта исходного массива байтов - собственно поиск начала искомой строки.
Работать будет.

Хотя.. На словах-то оно всё просто

maddmaks пишет:
там по вашей ссылке файлик во вложении. мне не достать.


Тоже там не зарегистрирован, сорри.





Ранг: 11.9 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 20 марта 2016 20:19
· Личное сообщение · #8

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




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 20 марта 2016 21:34
· Личное сообщение · #9

На коленке пишется
Code:
  1. BYTE* searchByMask(BYTE* buf, BYTE* search, BYTE* mask, int buflen, int len)
  2. {
  3.   BYTE* found = NULL;
  4.   for(int i = 0; i <= buflen - len; i++)
  5.   {
  6.     int j = 0;
  7.     for(; j < len; j++)
  8.       if(((buf[+ j] ^ search[j]) & mask[j]) != 0) break;
  9.  
  10.     if(== len)
  11.     {
  12.       found = &buf[i];
  13.       break;
  14.     }
  15.   }
  16.   return found;
  17. }


Конечно, можно оптимизировать... и возможны ошибки... но идея, надеюсь, понятна

Вот скучно, видимо, всем - такие топики на 9 постов растягивать

-----
IZ.RU





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 марта 2016 21:37
· Личное сообщение · #10

1. используйте генераторы патчей, там есть такая функция.
2. гугл по запросу "поиск последовательности байт по маске" и нужный язык программирования.
3. закрыто

-----
[nice coder and reverser]



 eXeL@B —› Вопросы новичков —› Исходник: по шаблону искать в файле
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати