поиск изменений в дампе

Тема в разделе "WASM.RESEARCH", создана пользователем BadLogin, 19 апр 2009.

  1. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Есть такая вот ситуация:
    Произвожу изменения в адресном пространстве запущенного приложения (добавляю код).
    Полный дамп весит порядка полутора гигабайт. Вот меня и стал донимать один вопрос - а как найти эти изменения, если я не знаю по какому адресу прописывается вставка ???

    Если кто занимался - подскажите пожалуйста ... =)
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нужно товарищ разобраться в коде, а не копипастить его. Тогда будите знать куда пишите.)
     
  3. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Clerk
    в коде разобрался =) будь здоров ... я говорю о проблеме, если есть стороннее приложение (без исходника), которое с большой вероятностью производит изменения в коде ... неизвестно где и не известно какие, но, допустим, OutPost сигнализирует о внедрении в другой процесс ... как найти то, что сделало вредоносное приложение ...

    P.S. Те изменения, что сделал я - могу найти и анализировать ...
     
  4. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    делай дамп только конкретных регионов памяти / секций файла
    смотри флаги в дампере процессов (SEC_IMAGE, например)
    а аутпост орёт на запись в адресное пространство процесса - так что можешь просто проследить, что и куда пишется, отдизасмив патчер
    хотя проще всего, конечно дампить секцию кода, если запись идёт только в неё
    и сравнивать ей с оригинальной
     
  5. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    млин ... я понимаю, что надо дампить секцию ... иначе полный дамп гига полтора займёт .. вот мне и надо определить хотя бы с какого байта начинается запись, в идеале ещё и размер вставки ...
    в PETools можно переписать на листочек или в excel значения таблицы при дампинге сектора, а потом сравнивать, чтобы затем искать изменения, но как это автоматизировать ???
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ты для начала определись кто пишет, куда и как, то ты говришь что сам пишешь, то не знаешь кто пишет. Юзай тулзу по типу артмани. Может туда зиродей твой из ядра пишет, или секцию промапил, или пишет в уже промапленую..
    Как это понять ?
    Всё бред какойто. Если секретно, то накой спрашивать, не сборище ведь гадалок.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстати последнее время увеличилась активность тролей, начали копать в сторону зиродеев.
    BadLogin
    Скажи конкретно что тебе надо.
     
  8. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Clerk
    Мне казалось, что кроме первого сообщения, все понятны и рассказывают о проблеме полностью.
    Попробую по-другому спросить:
    Есть процес, допустим антиврус или експлорер (не важно, главное, что запущен и работает). Я могу изменить его виртуальную память ... вставить туда вставку, по нужному мне адресу ... могу её потом найти и прочитать...

    Вопрос в следующем, а если инжект писал не я, и не в курсе куда именно прописался код. Как найти такую вставку ... как в режиме реального времени просигнализировать, что именно по такому адресу были произведены изменения ? Причём лучше не опираться на Outpost, который просигнализирует, чтобы потом посмотреть отладчиком вредоносное приложение...Нужно периодически или постоянно наблюдать процесс (антивирус или експлорер) на предмет серьёзных изменений (добавление сегмента) и затем узнать адрес по которому произведено изменение, что бы его сдампить для анализа =) (ведь вставки может и не быть)

    Вот такая вот проблема ... вручную мона сделать, но мне хочется автоматизировать процес нахождения вставки, ну или хотя бы упростить.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    От сисинтерналс монитор возьми, вроде он умеет память монторить(ну конечно если не разделяемая).
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Такое ощущение, что речь идет о краже эксплойта. Если я прав, то можно сделать так:

    1. Если эксплойт умеет корректно завершать приложение, то можно запустить целевое приложение под отладчиком и проставить точки останова на все ф-ии завершения типа ExitProcess/ExitThread/TerminateXXXXXX/etcXXXXX и ждать. Когда закроется -- раскручивать стек до целевого кода.

    2. Если эксплойт не умеет корректно завершать приложение, а тупо валит его читая/записывая несуществующий адрес или передавая на него управление, то можно запустить целевое приложение под отладчиком и просто ждать пока оно свалится. В этом случае возможны несколько вариантов, но анализ контекста потока во время исполнения может очень помочь, я думаю.

    А вот как автоматизировать поиск не знаю :).
     
  11. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Clerk
    Process Explorer делает что-то похожее, но отвечает на вопрос по какому адресу в дампе искать функцию ... он может указать что начался новый поток, может показать ещё какие-то функции, связанные с этим потоком ... но я не нашёл по какому адресу есть этот поток .. искал со своим примером (т.е. я точно знаю по какому адресу распологается вставка, но никаких ссылок на этот адрес не нашёл)
     
  12. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    BadLogin
    Часто приходится заниматься чем то подобным (при пополнении своей базы сигнатур).
    Ищу стороний (инжектируемый) код сравниванием двух "таблиц" в Araxis Comparer. Таблицы - это txt файлы, каждая строка в которых содержит данные, полученные от VirtualQueryEx.
    Пока ещё не попадался "софт", который инжектируется без создания/изменения регионов/секций (просто такой софт специфичный).
     
  13. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    T800

    То что надо!!!

    Сча буду разбираться с функцией
    ... если не сложно выложи проект =))
     
  14. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Код (Text):
    1. //---------------------------------------------------------------------------
    2.  
    3. #pragma hdrstop
    4.  
    5. //---------------------------------------------------------------------------
    6. #include <vcl.h>
    7. #include <stdio.h>
    8. #include <conio.h>
    9. #include <tlhelp32.h>
    10. #pragma argsused
    11. BOOL EnableDebugPrivilege ()
    12. {
    13.  HANDLE hToken;
    14.  LUID SeDebugPrivilegeValue;
    15.  TOKEN_PRIVILEGES tkp;
    16.  OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    17.  if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugPrivilegeValue))
    18.  {
    19.    CloseHandle(hToken);
    20.    return FALSE;
    21.  }
    22.  tkp.PrivilegeCount = 1;
    23.  tkp.Privileges[0].Luid = SeDebugPrivilegeValue;
    24.  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    25.  AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL);
    26.  if (GetLastError() != ERROR_SUCCESS) return FALSE;
    27.  return TRUE;
    28. }
    29.  
    30. int main(int argc, char* argv[])
    31. {
    32.                  EnableDebugPrivilege();
    33.                  int Pid;
    34.                  HANDLE hProcessSnap = NULL;
    35.                  PROCESSENTRY32 pe32 = {0};
    36.                  AnsiString temp="";
    37.                  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    38.                  if(hProcessSnap == (void*)-1)
    39.                  {
    40.                    MessageBox(NULL, "net zapuschennih processov", "my program", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
    41.                    goto END;
    42.                  }
    43.                  pe32.dwSize=sizeof(PROCESSENTRY32);
    44.                  if(Process32First(hProcessSnap,&pe32)) temp=pe32.szExeFile;
    45.                  if(temp=="explorer.exe")
    46.                  {
    47.                    Pid= pe32.th32ProcessID;
    48.                    CloseHandle (hProcessSnap);
    49.                    goto END;
    50.                  }
    51.                  pe32.dwSize=sizeof(PROCESSENTRY32);
    52.                  while(Process32Next(hProcessSnap,&pe32))
    53.                  {
    54.                    temp=pe32.szExeFile;
    55.                    if(temp=="explorer.exe")
    56.                    {
    57.                      Pid= pe32.th32ProcessID;
    58.                      CloseHandle(hProcessSnap);
    59.                      goto END;
    60.                    }
    61.                    pe32.dwSize=sizeof(PROCESSENTRY32);
    62.                  }
    63.                  CloseHandle(hProcessSnap);
    64. END:                 Pid=0;
    65. HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, Pid );
    66. FILE *f;
    67. DWORD start=0;
    68. f = fopen("TEST.txt", "w");
    69.  
    70. while(start<0xFFFFFFFF)
    71. {
    72.     MEMORY_BASIC_INFORMATION mbi;
    73.     int sz=VirtualQueryEx(hProcess,(void*)start,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
    74.     if( (mbi.State==MEM_COMMIT) &&
    75.         (mbi.Protect!=PAGE_READONLY) &&
    76.         (mbi.Protect!=PAGE_EXECUTE_READ) &&
    77.         (mbi.Protect!=PAGE_GUARD) &&
    78.         (mbi.Protect!=PAGE_NOACCESS) )
    79.     {
    80.         printf("Found memory based at %d, size %d",mbi.BaseAddress,mbi.RegionSize);
    81.         char *p=(char*)malloc(mbi.RegionSize);
    82.         SIZE_T lpRead;
    83.         if(!ReadProcessMemory(hProcess,(void*)start,p,mbi.RegionSize,&lpRead))
    84.             printf("ReadProcessMemory failed %d Read %d",GetLastError(),lpRead);
    85.         if(mbi.RegionSize!=lpRead)
    86.             printf("Read short bytes %d != %d",mbi.RegionSize,lpRead);
    87.         fwrite(p,1,lpRead,f);
    88.     }
    89.     if(start+mbi.RegionSize<start) break;
    90.     start+=mbi.RegionSize;
    91. }
    92.         return 0;
    93. }
    94. //---------------------------------------------------------------------------
    В отладчике вот здесь
    происходит переход на завершение ... может кто подскажет почему ? ... =)
     
  15. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    В OpenProcess нехватает опции, разрешающей юзать VirtualQueryEx.
    Кто будет проверять sz на ноль?
    fwrite вынеси за пределы if
    Да и вообще в fwrite надо все поля mbi писать (в hex виде).
    Похоже ты код просто копипастишь.
     
  16. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    T800
    Ну почт и ... я ведь не решаю какие-нибудь задачи ... я учусь, и только начал в этой области ... поэтому то и задаю бывает глуповатые вопросы ...
    Это как ?
    сделал ... всё-равно пустой файл =(