Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в памяти 
V
    Опции темы
leporel
Дата 30.1.2011, 21:28 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 12.2.2008

Репутация: нет
Всего: -1



Пишу в билдере, читается в цикле память блоком 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

Это сообщение отредактировал(а) leporel - 30.1.2011, 21:42
PM MAIL   Вверх
null56
Дата 30.1.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



попробуй использовать
Код

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

PM MAIL   Вверх
leporel
Дата 31.1.2011, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 12.2.2008

Репутация: нет
Всего: -1



Цитата

 Функция 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" не то передаю в функцию.
PM MAIL   Вверх
null56
Дата 31.1.2011, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



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

#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

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

PM MAIL   Вверх
leporel
Дата 31.1.2011, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 12.2.2008

Репутация: нет
Всего: -1



Цитата

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


В общем я не понимал как число это искать в прочитанном коде. 
PM MAIL   Вверх
xvr
Дата 31.1.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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


PM MAIL   Вверх
leporel
Дата 31.1.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 12.2.2008

Репутация: нет
Всего: -1



Код

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 
PM MAIL   Вверх
null56
Дата 31.1.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Цитата(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};

твое число в нулевой позиции
PM MAIL   Вверх
leporel
Дата 1.2.2011, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 12.2.2008

Репутация: нет
Всего: -1



null56, Спасибо  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.