Не решённая общим путём задача. Тут было некоторое обсуждение https://exelab.ru/f/index.php?action=vthread&forum=6&topic=25429&page=0 Учитывая что там своим не компетентным" мнением люди создают лишь помехи и вводят в заблуждение(не намеренно), не видя общей картины", то обсудим тут. Я покажу что общее и элегантное решение возможно. Но это немного позже(нужно отладить кое что).
Во-первых там не отвечают на его ответ, во-вторых он пока не может туда идти. Зы: отставить, уже может.
f13nd, Это техническая тема, а не обсуждение кл. Зайти туда я могу всегда, для этого существует куча резервных аккаунтов. superakira, > тут эта тема не имеет смысла. Как раз тут ей и место - раздел соотвествующий и тут есть мои публикации, они её непосредственно касаются. Есть какие то мысли конкретные по теме ?
А что вообще характерно для OEP ? сформированность рантайма, там, к примеру, переменных окружения для формирования верных входных данных? Просто пять шагов до OEP и пять шагов после то набор инструкций, ну он, набор как набор. Я правда не знаю, мне правда интересно. К примеру, обертка нормальный процесс, но переход на свою ветку осуществляется через хиповерфло вроде бы штатного в проге линкед листа. Это абстракция, но гипотетически? Там ведь адрес плавать будет от случая к случаю. Когда придет это "позже" после "отладки", такие штуки она тоже будет щелкать? Но если что, сорри, за нубский бред. Вот кстати, с другой стороны тоже какие-то мысли. Весна Обострения
Я знаю эту игру. Что ни предложишь будет объявлено ересью. Но просто как мысль вслух: алгоритм можно рассматривать как ряд зависимостей. В регистр/переменную в памяти помещается значение, из регистра/переменной в памяти забирается значение. Если записывать какие значения на какой позиции в трассе инициализированы, то можно посчитать для каждой позиции в трассе сколько на этот момент инициализированных ранее значений было использовано впоследствии. Просто плюсанув значения с i до j в массиве. И примерно момент около точки входа должен быть самым бедным на такую статистику.
q2e74, Определение OEP не самая важная в данном случае задача. Протекторы делают что угодно с исходным апп - релоцируют, дробят его на части, морфят и тд. Там есчо и первичные загрузчики есть. Некоторые код вообще убирают из модуля. Для проверки идеи я снял лог по активности некоторых протекторов, вот видос записал https://yadi.sk/i/vYIHUB14vzv_FQ и сам лог. Лог формируется следующим образом. При абсолютной адресации страница помечается маркером(AI) и выводится в лог(AI: адрес_инструкции [выбираемый адрес]) , если не помечена. При записи в неё маркер сбрасывается(WA), это событие пока не интересно. Это наводящая мысль - смотреть как связаны адреса
При чем тут хеш? Есть два больших никак не связанных алгоритма. Как только заканчивается один, начинается другой.
Если управление получает область, закрепленная за внешней длл, это вызов апи, не? Кроме тех случаев, когда несколько инструкций из нее вытащены и исполняются в другом буфере, а дальше переход туда. В принципе можно не вести учет для инструкций в образах библиотек и данных, находящихся в них же, если это помешает, хотя хз как это может помешать.
Метод. Лишь одно событие связывает области памяти и это событие не может быть удалено из блока кода без полного его разложения на компоненты(те инструкции) - абсолютная адресация(выборка данных, далее AI). Так как данные не отличимы от кода. Прямое следствие из этого - AI выборки(DF) связывают выбирающий код. Это значит что не зависимо от расположения выбирающих инструкций они связаны выборкой, а не их адресами. Второе следствие - AI не может быть разделена в общем случае, адресуемая область это единое целое, так как находящиеся там данные(размеры структур) не известны. Для теста были взяты следующие протекторы, это которые у меня были: Armadillo Aspack Asprotect Enigma Mpress Obsidium Pecompact PeLock Safeengine Themida Upx VMP YC Тестовая функция элементарна: Код (Text): if AI-DF if Ip !~ DLL[] if Pages[LineAddr << 12] = 0 Pages[LineAddr << 12] = 1 Print "AI Ip LineAddr" fi fi fi Тоесть выбираемая страница помечается маркером для выделения первой выборки к ней. Так как функция примтивна, то страницы не объединяются в регионы. Код (Text): Raw: AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0xF70011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Obsid: AI 0x4CA279 [0x4CA26A] AI 0x4C9BE5 [0x4C9A50] AI 0xF60011 [0x7C97B20C] AI 0x4CA274 [0x7C8855F4] AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Arma: AI 0x4CF99A [0x517890] <-- EP AI 0x4CF9C9 [0x515138] AI 0x4C1C77 [0x52EBA0] AI 0x4C1B8E [0x400000] AI 0x4CDD21 [0x52F2A0] AI 0x4CDD33 [0x5307BC] AI 0x4CC276 [0x5181EC] AI 0x4C56E4 [0x51AFB4] AI 0x4F4943 [0x52D5C8] AI 0x4F4C28 [0x516688] AI 0x4B0594 [0x51981B] AI 0x4C8307 [0x51B164] Aspack: AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0xF70011 [0x7C97B20C] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Enigma: AI 0x1035CA5 [0x10634C8] <-- EP AI 0x1035B0C [0x106B21C] AI 0x1035C71 [0x10620B4] AI 0x103A19F [0x10363C4] AI 0x104DFCC [0x1068230] AI 0x1052118 [0x106972C] AI 0x105522C [0x106A368] AI 0x104A557 [0x1048B9C] AI 0x1037A15 [0x1037A30] AI 0x105F703 [0x104B0F4] AI 0x105F721 [0x1055CF4] AI 0x1055E1A [0x104581C] AI 0x105F735 [0x1056FE8] AI 0x105F746 [0x1057360] AI 0x105F757 [0x1058238] AI 0x1045038 [0x1044F44] AI 0x1043D45 [0x103EB04] AI 0x11D0006 [0x7C80126C] AI 0x104D597 [0x103DE48] AI 0x104C60D [0x104AE70] AI 0x421828 [0x43D68C] <-- EP AI 0x421873 [0x434144] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x1430000 [0x7C885380] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x153000E [0x77DC15B0] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0xFA0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650] Pecompact: AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x3C0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Pelock: AI 0x401020 [0x4890DC] AI 0x401029 [0x568724] AI 0x121063B [0x7C8856D4] AI 0x1050011 [0x7C97B20C] AI 0x12111BE [0x7E3C14BC] AI 0x12103A9 [0x7C80126C] AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x122789E [0x7CBCF548] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x1227208 [0x77DC15CC] AI 0x4088FA [0x44A8A8] AI 0x1226594 [0x77F54014] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Upx: AI 0x421828 [0x43D68C] <-- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0xF70011 [0x7C97B20C] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] Mpress: AI 0x433884 [0x4890C8] <-- EP AI 0x421828 [0x43D68C] AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0xF70011 [0x7C97B20C] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] YC: AI 0x421828 [0x43D68C] <- EP AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x3C0011 [0x7C97B20C] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650] Safeengine: AI 0x4F2AE5 [0x49F42C] AI 0x138DF5F [0x7C80108C] AI 0x138DF65 [0x7C8856E0] AI 0x11D9F67 [0x7C97B0D0] AI 0x13818A7 [0x1381104] AI 0x1392C8D [0x1380EFC] AI 0x4A9EF6 [0x4A9EF2] AI 0x11D3EA5 [0x7C9142C8] AI 0x421828 [0x43D68C] <-- EP AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x57A465 [0x57A461] AI 0x579D57 [0x579D53] AI 0x11D7D0E [0x7C97C324] AI 0x41E525 [0x453740] AI 0x57C89F [0x57C89B] AI 0x577B84 [0x577B80] AI 0x57D51E [0x57D51A] AI 0x578F70 [0x578F6C] AI 0x11D2909 [0x7C910490] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x13C4879 [0x7C887474] AI 0x1486CB7 [0x14813E5] AI 0x1488F38 [0x77E36168] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x1487329 [0x77DC1668] AI 0x553BE1 [0x553BDD] AI 0x4088FA [0x44A8A8] AI 0x401D87 [0x4348B4] AI 0x547555 [0x547551] AI 0x402166 [0x440C20] AI 0x12882BE [0x7E3C1084] AI 0x128829F [0x1280F9C] AI 0x1298587 [0x1281020] AI 0x129E5F8 [0x7E361118] AI 0x55426F [0x55426B] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x54FA72 [0x54FA6E] AI 0x563E25 [0x563E21] AI 0x408033 [0x435AF0] AI 0x408B9A [0x44E3A8] AI 0x55FA09 [0x55FA05] AI 0x580173 [0x58016F] Memory map 00400000 00001000 dbgview 00401000 00088000 dbgview .text 00489000 00104000 dbgview .sedata 0058D000 00001000 dbgview .idata 0058E000 00002000 dbgview .rsrc 00590000 00001000 dbgview .sedata Themida: AI 0x13C9B74 [0x7C8014DC] AI 0x13C8754 [0x7C8856C4] AI 0x1300011 [0x7C97B20C] AI 0x14C81B0 [0x7E3C1224] AI 0x14C81B6 [0x7E3613CC] AI 0x421828 [0x43D68C] <-- EP AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x4190E2 [0x4342D4] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x37604E6 [0x77DC15CC] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] VMP: AI 0x7F1EA5 [0xCAB088] AI 0x46D544 [0x4798B4] AI 0x468EC2 [0x474288] AI 0x46D332 [0x47C634] AI 0x46D340 [0x47DFE0] AI 0x468D93 [0x47E118] AI 0x188000F [0x1880015] AI 0x421828 [0x43D68C] <-- EP AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x4190E2 [0x4342D4] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x414433 [0x43E3D0] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x184000F [0x1840015] AI 0x1850015 [0x185001B] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x17F0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408033 [0x435AF0] AI 0x4117A0 [0x44E3A8] Memory map 00400000 00001000 dbgview 00401000 00033000 dbgview .text 00434000 00009000 dbgview .rdata 0043D000 00018000 dbgview .data 00455000 0035B000 dbgview .vmp0 007B0000 00555000 dbgview .vmp1 00D05000 00002000 dbgview .rsrc Что интересного в этом логе: AI 0xF70011 [0x7C97B20C] - выбираемый адрес из системного образа(ntdll). Это перемещённая в буфер апи, событие можно убрать проверкой LA ~ DLL[]. Arma - секция релоцирована. Enigma - два образа. Они разделены между собой в мапяти, но можно и без этого узнать - первый образ выполняет вборку на запись во второй(exec after write), эти события не включены в лог. AI 0x1430000 [0x7C885380] - так же апи в буфере. Pelock - два образа в пределах одной секции. Safeengine - три образа: AI 0x4F2AE5 [0x49F42C] AI 0x13818A7 [0x1381104] VMP - три образа. - В более сложном случае можно не группировать страницы в области, а отслеживать в AVL каждую выборку. Так же можно следить за событием перезаписи областей. Сработало на всех имеющихся протекторах. --- Сообщение объединено, 5 апр 2019 --- Тут образы для тестов https://yadi.sk/d/qV_-JWuYyCIwHA vx --- Сообщение объединено, 5 апр 2019 --- Нашёл есчо https://yadi.sk/d/gJ9ItuGLEUAKTQ NiceProtect Mew Nspack Winunpack Однотипно: Код (Text): NiceProtect: AI 0x421828 [0x43D68C] AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x14B0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650] Mew: AI 0x421828 [0x43D68C] AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x406251 [0x44F9E0] AI 0x3B0011 [0x7C97B20C] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650] Nspack: AI 0x421828 [0x43D68C] AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0xFA0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650] Winunpack: AI 0x421828 [0x43D68C] AI 0x421857 [0x434198] AI 0x4155FF [0x400000] AI 0x41972B [0x447990] AI 0x419739 [0x454894] AI 0x41E525 [0x453740] AI 0x41AB65 [0x438E1C] AI 0x4087E2 [0x450DF8] AI 0x408810 [0x449738] AI 0x4088FA [0x44A8A8] AI 0x402166 [0x440C20] AI 0x408A1D [0x452320] AI 0x406227 [0x44BA00] AI 0x3C0011 [0x7C97B20C] AI 0x406251 [0x44F9E0] AI 0x408B9A [0x44E3A8] AI 0x408033 [0x435AF0] AI 0x432353 [0x43E650]
Мне дали на кл семпл, надеясь что ничего не получится. Это какой то крякми(Патрик"). Секция кода криптована, апп проверяет кто его запустил и не работает > XP. Из самого exe лишь две выборки к 2-м страницам: Код (Text): AI 0x401D75 [0x4060AC] AI 0x401D7E [0x408384] При первой выборке дампим секцию кода. Решено общим способом. https://yadi.sk/i/lFmHUOerGnSDPQ
Indy_, какая техника протекторов самая крутая(стабильная но максимально затрудняющая реверсинг) на твой взгляд? п.с. сорри за оффтоп
апи это абстракция, вот пример когда ты дерешься руками лучше чем некоторые ножом это считается оружием ? а если в тебя стреляют а ты увернулся а потом убил нет правды и истины истина на стороне сильного
Виртуализация, да, но к сожалению при защите кодесов она тормозит дико, не смотря на всякии оптимизации, что является неприемлемым например при разработке плагинов для маткада или 3д - макса. Мутацию применяю щас, хотелось бы виртуализацию - но скорость падает на несколько порядков.
Ну виртуализация может JIT-компилить, как тот же дотнет или джава делает. Понятно, что мы обратно генерируем код, который защитили, но так код будет разорван на множество исполняемых буфферов и собрать его в единую портянку сложнее. Наверное.