Есть такая вот ситуация: Произвожу изменения в адресном пространстве запущенного приложения (добавляю код). Полный дамп весит порядка полутора гигабайт. Вот меня и стал донимать один вопрос - а как найти эти изменения, если я не знаю по какому адресу прописывается вставка ??? Если кто занимался - подскажите пожалуйста ... =)
Clerk в коде разобрался =) будь здоров ... я говорю о проблеме, если есть стороннее приложение (без исходника), которое с большой вероятностью производит изменения в коде ... неизвестно где и не известно какие, но, допустим, OutPost сигнализирует о внедрении в другой процесс ... как найти то, что сделало вредоносное приложение ... P.S. Те изменения, что сделал я - могу найти и анализировать ...
делай дамп только конкретных регионов памяти / секций файла смотри флаги в дампере процессов (SEC_IMAGE, например) а аутпост орёт на запись в адресное пространство процесса - так что можешь просто проследить, что и куда пишется, отдизасмив патчер хотя проще всего, конечно дампить секцию кода, если запись идёт только в неё и сравнивать ей с оригинальной
млин ... я понимаю, что надо дампить секцию ... иначе полный дамп гига полтора займёт .. вот мне и надо определить хотя бы с какого байта начинается запись, в идеале ещё и размер вставки ... в PETools можно переписать на листочек или в excel значения таблицы при дампинге сектора, а потом сравнивать, чтобы затем искать изменения, но как это автоматизировать ???
Ты для начала определись кто пишет, куда и как, то ты говришь что сам пишешь, то не знаешь кто пишет. Юзай тулзу по типу артмани. Может туда зиродей твой из ядра пишет, или секцию промапил, или пишет в уже промапленую.. Как это понять ? Всё бред какойто. Если секретно, то накой спрашивать, не сборище ведь гадалок.
Кстати последнее время увеличилась активность тролей, начали копать в сторону зиродеев. BadLogin Скажи конкретно что тебе надо.
Clerk Мне казалось, что кроме первого сообщения, все понятны и рассказывают о проблеме полностью. Попробую по-другому спросить: Есть процес, допустим антиврус или експлорер (не важно, главное, что запущен и работает). Я могу изменить его виртуальную память ... вставить туда вставку, по нужному мне адресу ... могу её потом найти и прочитать... Вопрос в следующем, а если инжект писал не я, и не в курсе куда именно прописался код. Как найти такую вставку ... как в режиме реального времени просигнализировать, что именно по такому адресу были произведены изменения ? Причём лучше не опираться на Outpost, который просигнализирует, чтобы потом посмотреть отладчиком вредоносное приложение...Нужно периодически или постоянно наблюдать процесс (антивирус или експлорер) на предмет серьёзных изменений (добавление сегмента) и затем узнать адрес по которому произведено изменение, что бы его сдампить для анализа =) (ведь вставки может и не быть) Вот такая вот проблема ... вручную мона сделать, но мне хочется автоматизировать процес нахождения вставки, ну или хотя бы упростить.
Такое ощущение, что речь идет о краже эксплойта. Если я прав, то можно сделать так: 1. Если эксплойт умеет корректно завершать приложение, то можно запустить целевое приложение под отладчиком и проставить точки останова на все ф-ии завершения типа ExitProcess/ExitThread/TerminateXXXXXX/etcXXXXX и ждать. Когда закроется -- раскручивать стек до целевого кода. 2. Если эксплойт не умеет корректно завершать приложение, а тупо валит его читая/записывая несуществующий адрес или передавая на него управление, то можно запустить целевое приложение под отладчиком и просто ждать пока оно свалится. В этом случае возможны несколько вариантов, но анализ контекста потока во время исполнения может очень помочь, я думаю. А вот как автоматизировать поиск не знаю .
Clerk Process Explorer делает что-то похожее, но отвечает на вопрос по какому адресу в дампе искать функцию ... он может указать что начался новый поток, может показать ещё какие-то функции, связанные с этим потоком ... но я не нашёл по какому адресу есть этот поток .. искал со своим примером (т.е. я точно знаю по какому адресу распологается вставка, но никаких ссылок на этот адрес не нашёл)
BadLogin Часто приходится заниматься чем то подобным (при пополнении своей базы сигнатур). Ищу стороний (инжектируемый) код сравниванием двух "таблиц" в Araxis Comparer. Таблицы - это txt файлы, каждая строка в которых содержит данные, полученные от VirtualQueryEx. Пока ещё не попадался "софт", который инжектируется без создания/изменения регионов/секций (просто такой софт специфичный).
Код (Text): //--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #include <vcl.h> #include <stdio.h> #include <conio.h> #include <tlhelp32.h> #pragma argsused BOOL EnableDebugPrivilege () { HANDLE hToken; LUID SeDebugPrivilegeValue; TOKEN_PRIVILEGES tkp; OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugPrivilegeValue)) { CloseHandle(hToken); return FALSE; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = SeDebugPrivilegeValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL); if (GetLastError() != ERROR_SUCCESS) return FALSE; return TRUE; } int main(int argc, char* argv[]) { EnableDebugPrivilege(); int Pid; HANDLE hProcessSnap = NULL; PROCESSENTRY32 pe32 = {0}; AnsiString temp=""; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); if(hProcessSnap == (void*)-1) { MessageBox(NULL, "net zapuschennih processov", "my program", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL); goto END; } pe32.dwSize=sizeof(PROCESSENTRY32); if(Process32First(hProcessSnap,&pe32)) temp=pe32.szExeFile; if(temp=="explorer.exe") { Pid= pe32.th32ProcessID; CloseHandle (hProcessSnap); goto END; } pe32.dwSize=sizeof(PROCESSENTRY32); while(Process32Next(hProcessSnap,&pe32)) { temp=pe32.szExeFile; if(temp=="explorer.exe") { Pid= pe32.th32ProcessID; CloseHandle(hProcessSnap); goto END; } pe32.dwSize=sizeof(PROCESSENTRY32); } CloseHandle(hProcessSnap); END: Pid=0; HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, Pid ); FILE *f; DWORD start=0; f = fopen("TEST.txt", "w"); while(start<0xFFFFFFFF) { MEMORY_BASIC_INFORMATION mbi; int sz=VirtualQueryEx(hProcess,(void*)start,&mbi,sizeof(MEMORY_BASIC_INFORMATION)); if( (mbi.State==MEM_COMMIT) && (mbi.Protect!=PAGE_READONLY) && (mbi.Protect!=PAGE_EXECUTE_READ) && (mbi.Protect!=PAGE_GUARD) && (mbi.Protect!=PAGE_NOACCESS) ) { printf("Found memory based at %d, size %d",mbi.BaseAddress,mbi.RegionSize); char *p=(char*)malloc(mbi.RegionSize); SIZE_T lpRead; if(!ReadProcessMemory(hProcess,(void*)start,p,mbi.RegionSize,&lpRead)) printf("ReadProcessMemory failed %d Read %d",GetLastError(),lpRead); if(mbi.RegionSize!=lpRead) printf("Read short bytes %d != %d",mbi.RegionSize,lpRead); fwrite(p,1,lpRead,f); } if(start+mbi.RegionSize<start) break; start+=mbi.RegionSize; } return 0; } //--------------------------------------------------------------------------- В отладчике вот здесь происходит переход на завершение ... может кто подскажет почему ? ... =)
В OpenProcess нехватает опции, разрешающей юзать VirtualQueryEx. Кто будет проверять sz на ноль? fwrite вынеси за пределы if Да и вообще в fwrite надо все поля mbi писать (в hex виде). Похоже ты код просто копипастишь.
T800 Ну почт и ... я ведь не решаю какие-нибудь задачи ... я учусь, и только начал в этой области ... поэтому то и задаю бывает глуповатые вопросы ... Это как ? сделал ... всё-равно пустой файл =(