Поиск по памяти процесса

Тема в разделе "LANGS.C", создана пользователем Zlyden, 29 июл 2010.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    У меня возникла проблема. Долго создаю программу (С++), смысл которой - поменять в процессе все определенные строки на другие. Долго маялся, пока не соорудил почти рабочий код. Он заменяет все повторы только первой строки, после чего вываливается (при первом запуске renamestr). Реализация такая - процесс запускается, дается 10 сек на загрузку, затем подгружается длл, происходят полный поиск и замена. В итоге проходит 10 сек, процесс подвисает (кстати, оптимизирую поиск потом). Как я выяснил по логам (из кода я их вырезал), после замены всех строк функция memstr выходит за границы допустимой памяти и останавливается - возможно, неправильно определяется размер памяти процесса. Кстати, есть особенность - строки должны заменяться только при условии, что они окружены нулевыми символами.
    Код (Text):
    1. #include "stdafx.h"
    2. #include <stdio.h>
    3. #include <string.h>
    4. #include <io.h>
    5. #include <psapi.h>
    6. #pragma comment(linker, "/DEFAULTLIB:psapi.lib")
    7.  
    8. char * memstr (const char *big, const char *little, size_t len) {
    9.     size_t littlelen = strlen (little);
    10.     char *p = (char*) big;
    11.     size_t i;
    12.  
    13.     if (*little == '\0')
    14.         return 0;
    15.  
    16.     if (len < littlelen)
    17.         return NULL;
    18.    
    19.     for (i = 1; i <= len - littlelen - 1; i++){
    20.         if (memcmp (&p[i], little, littlelen) == 0 && p[i+littlelen] == 0 && p[i-1] == 0 ){
    21.             return &p[i];
    22.         }
    23.     }
    24.  
    25.     return NULL;
    26. }
    27.  
    28. #ifdef _MANAGED
    29. #pragma managed(push, off)
    30. #endif
    31.  
    32. size_t GetAppMemUsage(){
    33.     PROCESS_MEMORY_COUNTERS pmc;
    34.  
    35.     pmc.cb = sizeof(pmc);
    36.     GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
    37.  
    38.     return pmc.WorkingSetSize;
    39. }
    40.  
    41. int renamestr(char * oldstr, char * newstr){
    42.     DWORD written;
    43.     char * res;
    44.     char chbuf[32];
    45.     size_t len=strlen(oldstr),len2=strlen(newstr);
    46.     if(len2>len)
    47.         return -1;
    48.     size_t size=GetAppMemUsage();
    49.     bool check=0;
    50.     long adr=0x1400000;
    51.     do{
    52.         strcpy(chbuf,newstr);
    53.         chbuf[strlen(chbuf)]='\0';
    54.         res=memstr((char*)adr,oldstr,size - adr);
    55.         if(res){
    56.             adr=(DWORD)res+1;
    57.             check=1;
    58.             WriteProcessMemory(GetCurrentProcess(),res,chbuf,len2+1,&written);
    59.         }
    60.     } while (res);
    61.     if (check)
    62.         return 1;
    63.     return 0;
    64. }
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Конечно не правильно, т.к. тут нужно определять размер выделенного непрерывного региона виртуальной памяти через VirtualQuery (ну или адреса и размеры секций образа из PE-заголовка). А WorkingSetSize тут вообще ни к месту, т.к. он показывает суммарный объем физ.памяти, занимаемый процессом в данный момент, и соотв-но, во-первых, включает в себя выделенные страницы из разных\разрозненных регионов вирт.памяти - стека, кучи, твоей длл и прочей "всякой всячины", а во-вторых, может включать в себя не весь размер образа экзешника, а только часть страниц, загруженную в память данный момент (см. Working Set)
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    сорц VMMap у рихтера :)
     
  4. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Спасибо, как раз давеча книгу Рихтера скачал. Только, блин, не компилится его VMMap, выдает кучу ошибок на ровном месте
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Zlyden
    Не нужно комипилить, нужно читать.
     
  6. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Booster
    Спасибо, я и не знал. Книжки читать надо, оказывается, кто бы мог подумать? Только можно догадаться, что я экспериментирую. Или хочу использовать программу по назначению.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Zlyden
    Запомни, каков вопрос таков и ответ. Ваше "на ровном месте" нам ничего не говорит.

    Экспериментируй на здоровье.
     
  8. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Booster
    Я не спрашивал, почему не компилится, я просто заметил. С этими вещами я вполне способен разобраться сам - более того, уже разобрался, кто-то накосячил в CmnHdr.h
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Zlyden
    То что не компилиться это вполне заурядная вещь.
     
  10. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    n0name
    leo
    Спасибо, сегодня определил размер региона при помощи VirtualQuery, все заработало