Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Поиск в памяти


Автор: leporel 30.1.2011, 21:28
Пишу в билдере, читается в цикле память блоком 128 байт

Код

BYTE Code[128];
dwRead = 0;
LPBYTE lpAddress = (LPBYTE)0x1D850000;
ReadProcessMemory(hProc,(LPCVOID)lpAddress,Code,128,&dwRead);


Нужно в нем найти блок размеров в 8 байт, в котором содержится целое число (допустим 1234).
Есть пример для поиска строки 
Код

int fMatchCheck (char *mainstr, int mainstrLen, char *checkstr, int checkstrLen)
{
/*
Проверка наличия подстроки в строке.
При этом под "строкой" подразумевается
просто последовательность байт.
*/
BOOL fmcret=TRUE;
int x,y;

for (x=0; x<mainstrLen; x++) {
fmcret=TRUE;

for (y=0; y<checkstrLen; y++) {
if (checkstr[y]!=mainstr[x+y]) {
fmcret=FALSE;
break;
}
}

if (fmcret)
return x+checkstrLen;
}
return -1;
}

Не знаю как туда передать 8-битное число из Edit'a

Автор: null56 30.1.2011, 23:10
попробуй использовать
Код

int memcmp(const void *s1, const void *s2, size_t n);

Автор: leporel 31.1.2011, 00:27
Цитата

 Функция memcmp производит лексикографическое сравнение пер-
         вых cnt байтов из buf1 и buf2 и возвращает значение,  указывающее
         на соотношение этих буферов, так как показано ниже:

                Значение                          Смысл
                Меньше 0                      buf1 меньше,чем buf2
                0                                    buf1 идентичен buf2
                Больше 0                      buf1 больше,чем buf2


Она сравнивает, а мне нужно найти "подстроку" байтов в коде размером 128 байтов, но есть зато memchr, вроде подходит, пробовал так

Код

__int64 sub = 1894;

 ReadProcessMemory(hProc,(LPCVOID)lpAddress,Code,128,&dwRead);
 if(memchr(Code,(char)sub,128)
ShowMessage(AnsiString().sprintf("%p",lpAddress)+" совпадение ");


Но что не не работает, подозреваю что под "sub" не то передаю в функцию.

Автор: null56 31.1.2011, 01:16
во первых извиняюсь, я не понял вопроса....
если у тебя проблема с поиском, то я бы использовал приведенную мною ранее функцию вот так
Код

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

char buff[] = {10, 23, 32, 0xd2, 0x04, 0, 0, 4, 9, 0};

int mem_sub(void * src, size_t src_sz, void * dst, size_t dst_sz)
{
   int ret = -1;
   for (size_t i = 0; i < src_sz - dst_sz + 1; i++)
   {
           if (!memcmp((char *)src + i, dst, dst_sz))
           {
               ret = i;
               break;
           }
   }
   return ret;
}

int main()
{
   int value = 1234;
   int pos = mem_sub(buff, sizeof(buff), &value, sizeof(value));
   if (pos != -1)
   {
      printf("found at %d position\n", pos);
   }
   else
   {
      printf("not found\n");
   }
   return 0;
}

0xd2, 0x04, 0, 0 - на х86, где младший байт по младшему адресу, это число 1234

Цитата(leporel @  30.1.2011,  21:28 Найти цитируемый пост)
Не знаю как туда передать 8-битное число из Edit'a

я до сих пор не могу понять, в чем твой вопрос? ты не можешь сконвертировать строку символов в число?

Автор: leporel 31.1.2011, 02:28
Цитата

я до сих пор не могу понять, в чем твой вопрос? ты не можешь сконвертировать строку символов в число?


В общем я не понимал как число это искать в прочитанном коде. 

Автор: xvr 31.1.2011, 14:38
Цитата(leporel @  31.1.2011,  00:27 Найти цитируемый пост)
Но что не не работает, подозреваю что под "sub" не то передаю в функцию. 
Угу. memchr ищет 1 байт в строке, а не последовательность байтов  smile 
Нужно использовать связку из цикла, memchr и memcmp


Автор: leporel 31.1.2011, 17:19
Код

dwRead = 0;
__int64 sub = 1894;
int pos;

ReadProcessMemory(hProc,(LPCVOID)lpAddress,Code,128,&dwRead);
pos = mem_sub(Code, sizeof(Code), &sub, sizeof(sub));
   if (pos != -1)
   {
      ShowMessage(AnsiString().sprintf("%p",lpAddress)+" cовпадение "+IntToStr(pos));
      break;
   }


Не работает  smile 

Автор: null56 31.1.2011, 18:11
Цитата(leporel @  31.1.2011,  17:19 Найти цитируемый пост)
pos = mem_sub(Code, sizeof(Code), &sub, sizeof(sub));

у переменной Code размер известен на стадии компиляции? если нет, то sizeof использовать нельзя, передай размер явно, числом
Код

pos = mem_sub(Code, 128, &sub, sizeof(sub));

у меня пашет, не забудь, что ты передаешь 8 байтов, а значит в памяти должно выглядеть примерно так
Цитата

char buff[] = {0x4a, 0x07, 0, 0, 0, 0, 0, 0, 0xd2, 0x04, 0, 0, 4, 9, 0};

твое число в нулевой позиции

Автор: leporel 1.2.2011, 02:57
null56, Спасибо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)