Сейчас на форуме: zds, -Sanchez- (+7 невидимых)

 eXeL@B —› Протекторы —› Armadillo и CopyMEM-II
Посл.ответ Сообщение


Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 06 мая 2007 18:16
· Личное сообщение · #1

Щас переписываю обработчик CopyMEM-II. Смысл таков: я внедряю код в процесс-сын и этим кодом обращаюсь к защищённым страницам. Внедряю такой код:
mov eax, XXXXXXX
mov ecx, [eax]
XXXXXXX - адрес из страницы памяти, этот адрес я переписываю из стриппера, таким образом я хотел, чтобы арма мне отдала все страницы памяти, а она не хочет! Процесс просто падает и всё. Т.е. выполняется в контексте процесса-сына например такой код:
mov eax, 401000
mov ecx, [eax]

После выполнения второй команды процесс-сын падает На какой код арма отдаст страницу? rep movs - тот же эффект.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 06 мая 2007 18:52
· Личное сообщение · #2

хм, может ошибка в реализации? по идее всё должно работать.




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 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 и завершу концертную программу наномитами.




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 06 мая 2007 21:05
· Личное сообщение · #4

Щас поэксперементировал с таким кодом:
mov eax, 401000
mov dword ptr [eax], 90909090
Прога тоже просто упала, что делать вообще не знаю. Арма отдаёт страницу только если выполнять код, подругому не хочет или я туплю. Если в течении двух-трёх дней проблема не решится, тогда в стриппе так и останется старый метод...



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 06 мая 2007 22:11
· Личное сообщение · #5

либо я туплю, либо здесь бага.
Bit-hack пишет:
WriteMem((DWORD)hmem+2, &crntaddr2, 4);

почему (DWORD)hmem+2 , а не (DWORD)hmem+1 ?
mov eax,XXXXXXXX --> B8 XXXXXXXX




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 06 мая 2007 22:43
· Личное сообщение · #6

На самом деле глянуть надо, из-за чего оно валится то (какой там эксепшн возникает), можно сайсом подебажить или, что имхо лучше, подебажить само двигло с целью найти косячину, ибо движок умеет хендлить основные ошибки. З.Ы. Почему аллочится только 4 байта-непонятно.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 06 мая 2007 22:47
· Личное сообщение · #7

Archer пишет:
З.Ы. Почему аллочится только 4 байта-непонятно.

и записывается?
WriteMem((DWORD)hmem, &reccode, 4);




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 07 мая 2007 06:36
· Личное сообщение · #8

sniperZ
Несоответствие этих циферок объясняется тем, что я эксперементировал очень со многими вариациями кода, например push [401000], mov eax, [401000] и т.д. и код я привёл уже после всех этих экспериментов. То, что он был правильный я уверен, т.к. я дампил страницу памяти, в которой находится код прямо перед его выполнением, там всё было ок, никаких съездов нет.
Ещё я вчера попробовал записать в защищённую страницу памяти, арма вылетела с глюком, выдав какое-то окошко, а при попытке чтения она эту ошибку не выдаёт, сегодня попробую написать свой обработчик ошибок в стриппере и перед выполнением кода поставлю туда бряк, если он вызовется, значит произошло необработанное исключение и значит, что ошибка в коде, если исключения не будет, значит арма проверяет, откуда обращаются к странице, и если обращаются "издалека", то она закрывается. Тогда я буду писать этот код прямо в секции файла, что в принципе не проблема А пока я убёг в школу




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 мая 2007 08:38
· Личное сообщение · #9

Bit-hack
Там же есть в движке процедура, которая получает управление при любом останове проги, ставь туда бряку. Ещё посмотри ExtremeDump (плаг к PETools), там можно дампить через инжект длл. Если тоже валится, значит в арме проверка. Если робит, ковыряй стрип.


 eXeL@B —› Протекторы —› Armadillo и CopyMEM-II
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати