Сейчас на форуме: asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Внедрение параметров консольного приложения в тело программы
Посл.ответ Сообщение

Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 12:17 · Поправил: n4yk
· Личное сообщение · #1

Здравствуйте, который день шаманю с отключием проверки входных параметров консольного приложения и пытаюсь "переучить" программу брать эти параметры не из консоли, а из своего тела, но учитывая мой малый опыт в этом ничего толкового на ум не приходит.

Подопытный: --> php4.exe <-- ( входные параметры получает функцией MSVCRT.dll!__getmainargs)

Рыскал и в англоязычных форумах и в наших, но аналогичной задачи с решением нигде не нашел.

Подтолкните в нужную сторону, спасибо.

UPD1: Уточнение - "как принудительно указать аргументы консольной программы в бинарнике и отучить ее вообще принимать аргументы, путем замены n'ых байтов под отладчиком".

UPD2: Просьба камнями не закидывать, если вам сложно отвечать по существу, не тратьте свое и чужое время.

UPD3: Мне не нужна какая-либо защита, данный способ был выбран чтобы не создавать кучи мусора во временных папках, и не совать все подряд в SFX архивы. (Зачем использовать 2 программы - одну для запуска другой с аргументами, если можно было бы указать эти аргументы в теле самой программы?)

UPD4: Прошу прощения, если эта тема затронула кого-либо из присутствующих на этом форуме, и спасибо тем, кто все-таки попытался помочь новичку в его вопросе.

ARCHANGEL пишет:
Ну вот, ещё один товарищ делает говнозащиту своего поделия, ну так а мы тут причём? UPX, упаковывай всё им.

Да, тема в разделе "для новичков", но форум в целом посвящён не разработке защит, а как раз обратному.

И мне интересно, каким же боком эта тема будет востребована? Да любой приличный шароварщик знает тысячу способов усложнения реверсинга, а не прячет файлы в теле интерпретатора, "таская каштаны из костра чужими руками". Хотите писать защиту своего мегасофта - ваше право, но пишите её за пределами данного ресурса. И не надо тут про плевки в лицо - ничего личного.

Востребована тем, кому нужно запускать консольные программы без передач им аргументов, Админам к примеру, для запуска утилит. Или всяким патчерам, которые используют консольный софт, и для распространения создают рядом bat файл для запуска или суют все в sfx архив.
Может мое мнение и ошибочно, но элегантнее было бы прописывать в некоторых случаях аргументы в теле самой программы (не засоряя при этом временные директории, не ковыряясь с проблемами смены текущей рабочей папки и прочим)



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 03 декабря 2013 12:22 · Поправил: Veliant
· Личное сообщение · #2

упакуй все в sfx-архив, который будет запускать вложенный файл с нужными параметрами

Варианты:
1)Добавить код который приклеивает параметры в строку запуска в PEB (там откуда читает GetCommandLine), и переставить OEP на себя.
2)Перехватить GetCommandLine(A/W) и на выходе приклеить к имеющимся параметрам свои.

| Сообщение посчитали полезным: n4yk

Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 чтобы он распаковывал файлы не на диск а в память, и оттуда запускал, но думаю на большинство из них будут ругаться антивирусы.



Ранг: 33.9 (посетитель), 22thx
Активность: 0.030
Статус: Участник

Создано: 03 декабря 2013 14:20 · Поправил: dant3
· Личное сообщение · #4

1)написать либу, которая будет сплайсить GetCommandLineA/W
http://www.rsdn.ru/article/baseserv/apicallsintercepting.xml
2)добавить либу в импорт php.exe

P.S.
мб проще писать на чем-то нормальном? что бы не надо было дропы прятать.

| Сообщение посчитали полезным: n4yk


Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 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


| Сообщение посчитали полезным: n4yk

Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 15:05 · Поправил: n4yk
· Личное сообщение · #6

dant3 пишет:
P.S.
мб проще писать на чем-то нормальном? что бы не надо было дропы прятать.

Давно об этом задумываюсь, но к сожалению в данном проекте необходима динамическая расширяемость кода в процессе работы программы и интерпретируемый язык PHP наиболее подходит здесь.
А защитить код банальными обфускаторами/кодироващиками и прочей фигней, которая обходится даже школьником не вариант, поэтому и решил встроить скрипт в исполняемый файл.

DenCoder пишет:
Разбираемся, переписываем нужные части кода, встраиваем скрипты и делаем из php.exe dll-ку (т.е. компилируем в dll).

Согласен, данный метод наиболее правильный, но как Вы заметили на него уйдет много времени (Подготовка среды для компиляции, поиск нужных кусков кода и переделка их (с учетом недостатка знаний синтаксиса C и прочее), поэтому и решил что проще пару строк изменить и модифицировать готовый бинарник.

Для второго варианта я так понимаю нужно писать внешнюю Dll'ку... опять же на C, с которым я мало знаком (на чистом ASM'е писать dll тем более трудновыполнимо).

Исходя из всего этого, я так понимаю модификаций с бинарником будет не достаточно?...
Тогда видать остается более-меннее понятный вариант с изменением исходников и сборкой кучи г.. php из официальных сорцов. Спасибо.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 03 декабря 2013 15:16 · Поправил: Dr0p
· Личное сообщение · #7

> 1)Добавить код который приклеивает параметры в строку запуска в PEB (там откуда читает GetCommandLine), и переставить OEP на себя.

Не прокатит. Сабжевая инфа находится в PEB.ProcessParameters и оттуда извлекается при инициализации kernel. Далее GetCmdLine() вообще наверно не будет туда обращаться. Ну а инициализация кернел выполняется до инициализации прочей статики.

Процесс рестартуйте с нужными аргументами.



Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 15:26
· Личное сообщение · #8

Dr0p пишет:
Процесс рестартуйте с нужными аргументами.

Как было выше сказано, запуск (перезапуск) процесса с аргументами крайне не желателен, по причине палевности этих аргументов через различные TaskManager'ы. (кроме встроенного в Windows)




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 03 декабря 2013 15:31
· Личное сообщение · #9

n4yk

Значит ставите в отладчике останов на GetCmdLine()/PEB.ProcessParameters, находите откуда происходит запрос и модифицируете код как надо. Не вижу проблемы.



Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 03 декабря 2013 15:42
· Личное сообщение · #10

Если не можете сами накодить, то есть куча программ, которые упаковывают исполняемые файлы и данные в один контейнер, например MoleBox, по-моему Enigma тоже умеет. Или обратитесь в запросы.

Но на мой взгляд, это всё поможет лишь от честных людей.

| Сообщение посчитали полезным: Dr0p


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 03 декабря 2013 15:46
· Личное сообщение · #11

Да кто будет смотреть командную строку, берётся монитор в таком случае системный, например procmon, procexp и всё становится понятным, какой файл юзается. Бессмысленная затея имхо.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 03 декабря 2013 15:55
· Личное сообщение · #12

Может проще к php прикрутить zend/ioncube и накрыть им скрипт? По крайней мере так сразу "влоб" скрипт не посмотришь.



Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 15:56
· Личное сообщение · #13

GroundHog пишет:
Если не можете сами накодить, то есть куча программ, которые упаковывают исполняемые файлы и данные в один контейнер, например MoleBox, по-моему Enigma тоже умеет. Или обратитесь в запросы.

Но на мой взгляд, это всё поможет лишь от честных людей.

Об этом я тоже думал, но как я писал выше на данные протекторы частенько приходятся ложные срабатывания различных АВ. Если бы это был 1 или даже 2 антивируса, то ладно, не страшно. Но на эти протекторы с разной переодичностью лают как минимум 6 антивирусов.



Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 16:03
· Личное сообщение · #14

Dr0p пишет:
Да кто будет смотреть командную строку, берётся монитор в таком случае системный, например procmon, procexp и всё становится понятным, какой файл юзается. Бессмысленная затея имхо.

Так в этом и прикол, что сам скрипт будет сидеть внутри екзешника и никакие файлы не будут использоваться. т.е. php интерпритатор будет парсить самого себя и выполнять только кусок имменно его кода, а остальной код игнорировать. А если запускать с аргументами типо "file.exe file.exe", то сразу будет понятно что прога вытаскивает данные из себя. Поэтому только и требуется скрыть аргументы.
Veliant пишет:
Может проще к php прикрутить zend/ioncube и накрыть им скрипт? По крайней мере так сразу "влоб" скрипт не посмотришь.

zend легко снимается и легко опознается (дезендеры выпускают с каждым выходном новой версии) +приличный довесок в виде его библиотеки.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 декабря 2013 16:21 · Поправил: ARCHANGEL
· Личное сообщение · #15

Ну вот, ещё один товарищ делает говнозащиту своего поделия, ну так а мы тут причём? UPX, упаковывай всё им.

Да, тема в разделе "для новичков", но форум в целом посвящён не разработке защит, а как раз обратному.

И мне интересно, каким же боком эта тема будет востребована? Да любой приличный шароварщик знает тысячу способов усложнения реверсинга, а не прячет файлы в теле интерпретатора, "таская каштаны из костра чужими руками". Хотите писать защиту своего мегасофта - ваше право, но пишите её за пределами данного ресурса. И не надо тут про плевки в лицо - ничего личного.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 декабря 2013 16:42 · Поправил: n4yk
· Личное сообщение · #16

ARCHANGEL пишет:
Ну вот, ещё один товарищ делает говнозащиту своего поделия, ну так а мы тут причём? UPX, упаковывай всё им.

Спасибо на "добром" слове. Ничего иного я и не ожидал, все что я хотел, чтобы мне подсказали /подтолкнули в нужном направлении на тему "как принудительно указать аргументы консольной программы в бинарнике и отучить ее вообще принимать аргументы, путем замены n'ых байтов под отладчиком". Какую-либо оценку данного действия я не просил и ни на что не претендую, хотя знал что будет "еще один товарищ", который поскупится поделится временем/опытом и плюнет в лицо.

Не смотря на то, что данная тема находится в разделе "для новичков".

Тема все еще актуальна, думаю найденный способ будет довольно универсальным для любой консольной программы и будет наверняка востребован некоторым количеством людей. Если вам сложно отвечать по существу, не тратьте свое и чужое время.




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

Создано: 03 декабря 2013 16:57
· Личное сообщение · #17

Это форум не по защите софта, если что, так что ошиблись форумом.


 eXeL@B —› Вопросы новичков —› Внедрение параметров консольного приложения в тело программы
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати