eXeL@B —› Протекторы —› Armadillo и CopyMEM-II |
Посл.ответ | Сообщение |
|
Создано: 06 мая 2007 18:16 · Личное сообщение · #1 Щас переписываю обработчик CopyMEM-II. Смысл таков: я внедряю код в процесс-сын и этим кодом обращаюсь к защищённым страницам. Внедряю такой код: mov eax, XXXXXXX mov ecx, [eax] XXXXXXX - адрес из страницы памяти, этот адрес я переписываю из стриппера, таким образом я хотел, чтобы арма мне отдала все страницы памяти, а она не хочет! Процесс просто падает и всё. Т.е. выполняется в контексте процесса-сына например такой код: mov eax, 401000 mov ecx, [eax] После выполнения второй команды процесс-сын падает На какой код арма отдаст страницу? rep movs - тот же эффект. |
|
Создано: 06 мая 2007 18:52 · Личное сообщение · #2 |
|
Создано: 06 мая 2007 20:46 · Личное сообщение · #3 hmem = VirtualAllocEx(hProcess, 0, 4, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //Выделяем память в процессе-сыне под код reccode WriteMem((DWORD)hmem, &reccode, 4); //mov eax, 90909090 //mov ecx, [eax] memcpy(&orig_state, &state, sizeof(state)); //Сохраняю все регистры for(crntaddr=victim_file.oe[0].Section_RVA; crntaddr<=victim_file.oe[0].Section_RVA+victim_file.oe[0].Virtual_Si ze; crntaddr+=0x1000) //цикл с нарощением адресов на 0x1000 за интерацию { state.Eip = (ULONG)hmem; //Меняем eip на адрес начальной ф-ии восстановителя crntaddr2 = crntaddr + victim_file.peh->Image_Base; //вычисляю адрес, который будет написан заместо 909090 в коде восстановителя WriteMem((DWORD)hmem+2, &crntaddr2, 4); //пишу этот адрес, это адрес первой инструкции в странице памяти break_id=0; AddBreak(bRecovery, (int)hmem+7, btOpcode); EnableBreak(bRecovery); Continue(); //Ставлю бряк на нули после кода восстановителя, и отпускаю прогу на волю DisableBreakAll(); //Тут прога уже лежит, процессы завершены ReadMem(crntaddr+victim_file.peh->Image_Base, (LPVOID)((int)CMMem.MemAddr() + crntaddr - victim_file.oe[0].Section_RVA), 0x1000); // Читаю код, который мог бы восстановиться } memcpy(&state, &orig_state, sizeof(state)); //восстанавливаю CONTEXT Это не весь код процедуры, но он основной, собственно вот и вся проблема. И ещё один прикол: код типа mov eax, ecx нормально отрабатывает, прога падает именно на обращении к страницы памяти с атрибутом PAGE GUARD, т.е. к странице, защищённой CopyMEM-II и в данный момент зашифрованной. Конечно есть вариант использовать старый вариант: насилование процесса-отца, а именно перехват всяких функций, подмена структур и т.д. Но этот вариант слишком тормозной и иногда глючной, что, конечно, никого не радует. Есть ещё один вариант: менять EIP на адрес начала страницы и выполнять одну инструкцию, это работает, но иногда происход вот что: в начале страницы оказываются байты, образующие, например, код из разряда int 10 и тоды вилы - сех или ещё что... Стрипп переписывается почти с нуля, поисковик ОЕР переписан, пока я не нашёл прог, где бы он сглючил. Щас перепишу окончательно обработчик CopyMEM-II, потом доделаю трейсер неопознанных ф-ий импорта (переходников), потом допишу CodeSplicing и завершу концертную программу наномитами. |
|
Создано: 06 мая 2007 21:05 · Личное сообщение · #4 Щас поэксперементировал с таким кодом: mov eax, 401000 mov dword ptr [eax], 90909090 Прога тоже просто упала, что делать вообще не знаю. Арма отдаёт страницу только если выполнять код, подругому не хочет или я туплю. Если в течении двух-трёх дней проблема не решится, тогда в стриппе так и останется старый метод... |
|
Создано: 06 мая 2007 22:11 · Личное сообщение · #5 |
|
Создано: 06 мая 2007 22:43 · Личное сообщение · #6 |
|
Создано: 06 мая 2007 22:47 · Личное сообщение · #7 |
|
Создано: 07 мая 2007 06:36 · Личное сообщение · #8 sniperZ Несоответствие этих циферок объясняется тем, что я эксперементировал очень со многими вариациями кода, например push [401000], mov eax, [401000] и т.д. и код я привёл уже после всех этих экспериментов. То, что он был правильный я уверен, т.к. я дампил страницу памяти, в которой находится код прямо перед его выполнением, там всё было ок, никаких съездов нет. Ещё я вчера попробовал записать в защищённую страницу памяти, арма вылетела с глюком, выдав какое-то окошко, а при попытке чтения она эту ошибку не выдаёт, сегодня попробую написать свой обработчик ошибок в стриппере и перед выполнением кода поставлю туда бряк, если он вызовется, значит произошло необработанное исключение и значит, что ошибка в коде, если исключения не будет, значит арма проверяет, откуда обращаются к странице, и если обращаются "издалека", то она закрывается. Тогда я буду писать этот код прямо в секции файла, что в принципе не проблема А пока я убёг в школу |
|
Создано: 07 мая 2007 08:38 · Личное сообщение · #9 |
eXeL@B —› Протекторы —› Armadillo и CopyMEM-II |