Сейчас на форуме: asfa (+6 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Внедрение параметров консольного приложения в тело программы |
Посл.ответ | Сообщение |
|
Создано: 03 декабря 2013 12:17 · Поправил: n4yk · Личное сообщение · #1 Здравствуйте, который день шаманю с отключием проверки входных параметров консольного приложения и пытаюсь "переучить" программу брать эти параметры не из консоли, а из своего тела, но учитывая мой малый опыт в этом ничего толкового на ум не приходит. Подопытный: Рыскал и в англоязычных форумах и в наших, но аналогичной задачи с решением нигде не нашел. Подтолкните в нужную сторону, спасибо. UPD1: Уточнение - "как принудительно указать аргументы консольной программы в бинарнике и отучить ее вообще принимать аргументы, путем замены n'ых байтов под отладчиком". UPD2: Просьба камнями не закидывать, если вам сложно отвечать по существу, не тратьте свое и чужое время. UPD3: Мне не нужна какая-либо защита, данный способ был выбран чтобы не создавать кучи мусора во временных папках, и не совать все подряд в SFX архивы. (Зачем использовать 2 программы - одну для запуска другой с аргументами, если можно было бы указать эти аргументы в теле самой программы?) UPD4: Прошу прощения, если эта тема затронула кого-либо из присутствующих на этом форуме, и спасибо тем, кто все-таки попытался помочь новичку в его вопросе. ARCHANGEL пишет: Ну вот, ещё один товарищ делает говнозащиту своего поделия, ну так а мы тут причём? UPX, упаковывай всё им. Да, тема в разделе "для новичков", но форум в целом посвящён не разработке защит, а как раз обратному. И мне интересно, каким же боком эта тема будет востребована? Да любой приличный шароварщик знает тысячу способов усложнения реверсинга, а не прячет файлы в теле интерпретатора, "таская каштаны из костра чужими руками". Хотите писать защиту своего мегасофта - ваше право, но пишите её за пределами данного ресурса. И не надо тут про плевки в лицо - ничего личного. Востребована тем, кому нужно запускать консольные программы без передач им аргументов, Админам к примеру, для запуска утилит. Или всяким патчерам, которые используют консольный софт, и для распространения создают рядом bat файл для запуска или суют все в sfx архив. Может мое мнение и ошибочно, но элегантнее было бы прописывать в некоторых случаях аргументы в теле самой программы (не засоряя при этом временные директории, не ковыряясь с проблемами смены текущей рабочей папки и прочим) ![]() |
|
Создано: 03 декабря 2013 12:22 · Поправил: Veliant · Личное сообщение · #2 упакуй все в sfx-архив, который будет запускать вложенный файл с нужными параметрами Варианты: 1)Добавить код который приклеивает параметры в строку запуска в PEB (там откуда читает GetCommandLine), и переставить OEP на себя. 2)Перехватить GetCommandLine(A/W) и на выходе приклеить к имеющимся параметрам свои. ![]() |
|
Создано: 03 декабря 2013 12:38 · Поправил: n4yk · Личное сообщение · #3 Veliant пишет: упакуй все в sfx-архив, который будет запускать вложенный файл с нужными параметрами Не вариант, нужно именно отключить проверку параметров и указать в теле фиксированные, т.к. параметры запуска приложения можно легко посмотреть через тот же Process Explorer. т.е. к примеру запуск идет как "php.exe file.php" и чел спокойно может по имени файла найти его. 1)Добавить код который приклеивает параметры в строку запуска в PEB (там откуда читает GetCommandLine), и переставить OEP на себя. Вот с этим и загвоздка, как это сделать? т.е. на какую функцию заменить __getmainargs, чтобы вместо этого php.exe к примеру брал строку по определенному адресу из ресурсов. Или еще лучше еслибы он подставлял вместо параметров имя своего файла. т.е. после проделанной замены результат был бы аналогичным "php.exe php.exe", а если изменится имя exe'шки на "blablabla.exe" то соответсвенно менялось бы на "blablabla.exe blablabla.exe". т.е. я хочу внедрить скрипт php в тело самого интерпритатора, для защиты от "умных" пользователей, желающих подсмотреть исходник скрипта и чтобы не создавалось никаких даже временных файлов, и исходник можно было выдрать только отладчиком. Возможно это можно слелать с помощью какого-то пакера/joinera чтобы он распаковывал файлы не на диск а в память, и оттуда запускал, но думаю на большинство из них будут ругаться антивирусы. ![]() |
|
Создано: 03 декабря 2013 14:20 · Поправил: dant3 · Личное сообщение · #4 1)написать либу, которая будет сплайсить GetCommandLineA/W 2)добавить либу в импорт php.exe P.S. мб проще писать на чем-то нормальном? что бы не надо было дропы прятать. ![]() |
|
Создано: 03 декабря 2013 14:30 · Личное сообщение · #5 n4yk пишет: и кроме __getmainargs еще кучу функций вызывает из MSVCRT.dll msvcrt.dll - это стандартная crt библиотека от ms$. Что касается аргументов приложения, getmainargs() одна и используется. А она обращается в свою очередь к одной из GetCommandLine(A/W). Veliant правильно указал. n4yk пишет: т.е. к примеру запуск идет как "php.exe file.php" и чел спокойно может по имени файла найти его. Может найти его и поставив бряк на CreateFileA/W! Если в бинарник встраивать скрипт, то это можно сделать аналогично проекту node, который выполняет js-скрипты. В нём скрипты запуска и инициализации виртуальной машины v8 встроены. PHP так же опенсорсен, как и node. Разбираемся, переписываем нужные части кода, встраиваем скрипты и делаем из php.exe dll-ку (т.е. компилируем в dll). Также не забываем вставить логотип PHP согласно лицензии! Правда у меня такая задача заняла больше времени, чем правка бинарника. Из предложенного Велиантом проще 2ой вариант. ----- IZ.RU ![]() |
|
Создано: 03 декабря 2013 15:05 · Поправил: n4yk · Личное сообщение · #6 dant3 пишет: P.S. мб проще писать на чем-то нормальном? что бы не надо было дропы прятать. Давно об этом задумываюсь, но к сожалению в данном проекте необходима динамическая расширяемость кода в процессе работы программы и интерпретируемый язык PHP наиболее подходит здесь. А защитить код банальными обфускаторами/кодироващиками и прочей фигней, которая обходится даже школьником не вариант, поэтому и решил встроить скрипт в исполняемый файл. DenCoder пишет: Разбираемся, переписываем нужные части кода, встраиваем скрипты и делаем из php.exe dll-ку (т.е. компилируем в dll). Согласен, данный метод наиболее правильный, но как Вы заметили на него уйдет много времени (Подготовка среды для компиляции, поиск нужных кусков кода и переделка их (с учетом недостатка знаний синтаксиса C и прочее), поэтому и решил что проще пару строк изменить и модифицировать готовый бинарник. Для второго варианта я так понимаю нужно писать внешнюю Dll'ку... опять же на C, с которым я мало знаком (на чистом ASM'е писать dll тем более трудновыполнимо). Исходя из всего этого, я так понимаю модификаций с бинарником будет не достаточно?... Тогда видать остается более-меннее понятный вариант с изменением исходников и сборкой ![]() |
|
Создано: 03 декабря 2013 15:16 · Поправил: Dr0p · Личное сообщение · #7 > 1)Добавить код который приклеивает параметры в строку запуска в PEB (там откуда читает GetCommandLine), и переставить OEP на себя. Не прокатит. Сабжевая инфа находится в PEB.ProcessParameters и оттуда извлекается при инициализации kernel. Далее GetCmdLine() вообще наверно не будет туда обращаться. Ну а инициализация кернел выполняется до инициализации прочей статики. Процесс рестартуйте с нужными аргументами. ![]() |
|
Создано: 03 декабря 2013 15:26 · Личное сообщение · #8 |
|
Создано: 03 декабря 2013 15:31 · Личное сообщение · #9 |
|
Создано: 03 декабря 2013 15:42 · Личное сообщение · #10 Если не можете сами накодить, то есть куча программ, которые упаковывают исполняемые файлы и данные в один контейнер, например MoleBox, по-моему Enigma тоже умеет. Или обратитесь в запросы. Но на мой взгляд, это всё поможет лишь от честных людей. ![]() |
|
Создано: 03 декабря 2013 15:46 · Личное сообщение · #11 |
|
Создано: 03 декабря 2013 15:55 · Личное сообщение · #12 |
|
Создано: 03 декабря 2013 15:56 · Личное сообщение · #13 GroundHog пишет: Если не можете сами накодить, то есть куча программ, которые упаковывают исполняемые файлы и данные в один контейнер, например MoleBox, по-моему Enigma тоже умеет. Или обратитесь в запросы. Но на мой взгляд, это всё поможет лишь от честных людей. Об этом я тоже думал, но как я писал выше на данные протекторы частенько приходятся ложные срабатывания различных АВ. Если бы это был 1 или даже 2 антивируса, то ладно, не страшно. Но на эти протекторы с разной переодичностью лают как минимум 6 антивирусов. ![]() |
|
Создано: 03 декабря 2013 16:03 · Личное сообщение · #14 Dr0p пишет: Да кто будет смотреть командную строку, берётся монитор в таком случае системный, например procmon, procexp и всё становится понятным, какой файл юзается. Бессмысленная затея имхо. Так в этом и прикол, что сам скрипт будет сидеть внутри екзешника и никакие файлы не будут использоваться. т.е. php интерпритатор будет парсить самого себя и выполнять только кусок имменно его кода, а остальной код игнорировать. А если запускать с аргументами типо "file.exe file.exe", то сразу будет понятно что прога вытаскивает данные из себя. Поэтому только и требуется скрыть аргументы. Veliant пишет: Может проще к php прикрутить zend/ioncube и накрыть им скрипт? По крайней мере так сразу "влоб" скрипт не посмотришь. zend легко снимается и легко опознается (дезендеры выпускают с каждым выходном новой версии) +приличный довесок в виде его библиотеки. ![]() |
|
Создано: 03 декабря 2013 16:21 · Поправил: ARCHANGEL · Личное сообщение · #15 Ну вот, ещё один товарищ делает Да, тема в разделе "для новичков", но форум в целом посвящён не разработке защит, а как раз обратному. И мне интересно, каким же боком эта тема будет востребована? Да любой приличный шароварщик знает тысячу способов усложнения реверсинга, а не прячет файлы в теле интерпретатора, "таская каштаны из костра чужими руками". Хотите писать защиту своего мегасофта - ваше право, но пишите её за пределами данного ресурса. И не надо тут про плевки в лицо - ничего личного. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 03 декабря 2013 16:42 · Поправил: n4yk · Личное сообщение · #16 ARCHANGEL пишет: Ну вот, ещё один товарищ делает говнозащиту своего поделия, ну так а мы тут причём? UPX, упаковывай всё им. Спасибо на "добром" слове. Ничего иного я и не ожидал, все что я хотел, чтобы мне подсказали /подтолкнули в нужном направлении на тему "как принудительно указать аргументы консольной программы в бинарнике и отучить ее вообще принимать аргументы, путем замены n'ых байтов под отладчиком". Какую-либо оценку данного действия я не просил и ни на что не претендую, хотя знал что будет "еще один товарищ", который поскупится поделится временем/опытом и плюнет в лицо. Не смотря на то, что данная тема находится в разделе "для новичков". Тема все еще актуальна, думаю найденный способ будет довольно универсальным для любой консольной программы и будет наверняка востребован некоторым количеством людей. Если вам сложно отвечать по существу, не тратьте свое и чужое время. ![]() |
|
Создано: 03 декабря 2013 16:57 · Личное сообщение · #17 |
![]() |
eXeL@B —› Вопросы новичков —› Внедрение параметров консольного приложения в тело программы |
Эта тема закрыта. Ответы больше не принимаются. |