• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как правильно изучать malware-кодинг под Windows

Пожалуйста, обратите внимание, что пользователь заблокирован
Whisper до конца не пойму, ты советуешь начинать с плюсов сразу? Или просто потом по быстрому переходить на них? Просто это как бы разные вещи.
Столяров советует вообще начинать с Паскаля, почему - мб читал, могу скинуть; если вкратце что так проще и понятнее для новичка.
Основная проблема в том, что профи понимает, как и что, а для новичка многие вещи не-очевидны , и начинать надо с простого. Пример - вот объясни человеку, который кодит месяц, что такое замыкание в js.
Касаемо дальнейшего - можно переходить хоть на плюсы хоть на шарп хоть на голанг с питоном. Не знаю. Суть в том, что начинать надо именно с Си, потому что он простой, ставит мозги на место, и вся документация так или иначе будет на Си (мсдн, книги).
Хотя да, тенденция идет к плюсам, тот же GDI+ на Си чтоб перевести, уже надо поизвращаться, Иосифович в своих книгах тоже использует RAII и прочее , даже для ринг0 юзает auto и прочие плюсы.
 
Whisper до конца не пойму, ты советуешь начинать с плюсов сразу? Или просто потом по быстрому переходить на них? Просто это как бы разные вещи.
Столяров советует вообще начинать с Паскаля, почему - мб читал, могу скинуть; если вкратце что так проще и понятнее для новичка.
Основная проблема в том, что профи понимает, как и что, а для новичка многие вещи не-очевидны , и начинать надо с простого. Пример - вот объясни человеку, который кодит месяц, что такое замыкание в js.
Касаемо дальнейшего - можно переходить хоть на плюсы хоть на шарп хоть на голанг с питоном. Не знаю. Суть в том, что начинать надо именно с Си, потому что он простой, ставит мозги на место, и вся документация так или иначе будет на Си (мсдн, книги).
Хотя да, тенденция идет к плюсам, тот же GDI+ на Си чтоб перевести, уже надо поизвращаться, Иосифович в своих книгах тоже использует RAII и прочее , даже для ринг0 юзает auto и прочие плюсы.
С ц на плюсы будет очень трудно, скорее всего человек или не захочет осваить плюсы потому что у него и на ц все как то работает, или будет переход в стиле - пишу на ц просто файлы .cpp. Я сам с этим всем столкнулся. Особенно если с ц на плюсы пытатся да еще и сразу в стл, тут сталкиваются старая простая привычная и работающая парадигма ц и какой то кошмар, и вот преодоление этого кошмара будет очень болезненным. Я не зря посоветовал книги именно про Архитектуре программирования а не по языку, нужно четко понимать что для чего и какие дороки к чему ведут. Новичку стоит их прочитать, а потом по мере роста скилла перечитывать. Для новичков в ц++ вот здесь https://ravesli.com очень хороший ресурс, вот прям нежненько и постипенно вам будут вводить stick of truth c++, с лубрикантами и задорнымы шлепками.
 
Товарищ без аккаунта не смог пройти мимо, попросил меня опубликовать:

Всеми руками поддерживаю Whisper, надо чтобы хоть кто-то его непопулярное мнение поддержал из малвар кодеров. Сам кодил и на ассемблере, и на си, переход на C++ был очень болезненный после всего этого - сначала казалось нафиг впёрлись эти классы, но потом как прочувствовал всю мощь интерфейсов и наследования. Правки очень просто вносить. Особенно если следовать принципу SRP - на каждый элемент системы делать свой собственный интерфейс, то замена функционала происходит очень быстро. Всё что требуется - написать еще одну имплементацию, и ничего больше не менять. Действительно столкнулся с этим когда возникла надобность переделать бота на Linux. В процедурном стиле это был бы ад, хотя и в процедурном стиле можно делать архитектурно, но код быстро перестает быть элегантным. Достаточно открыть исходники линукса на C, чтобы понять почему чистый C очень плох для архитектурных задач.

Разработка - это в первую очередь архитектура. Не важно как круто вы разбираетесь в операционных системах, не важно как круто вы шарите в сетях, не важно какие у вас зеродеи и прочие техники используются - важно то насколько гибкая и надежная архитектура у софта и насколько вы предусмотрели всевозможные варианты окружения в котором оно будет исполняться. Можно много выпендриваться про трансляции адресов, MSR регистры, гипервизоры, р/к технологии, обходы патчгардов и прочее, но если вы не способны создать грамотную архитектуру, то даже простейший софт будет работать крайне нестабильно. Сделайте себе подарок - изучите C++, не пожалеете.

P.S. STL/Boost и иже с ним не использую, только исключительно встроенные ООП методы. Во мне еще многое живо от старых привычек - не могу использовать если до конца неясно во что это компилируется, поэтому предпочитаю свои костыли делать, думаю когда-то дойду и до плюсовых библиотек, но пока еще не потребовалось.
 
Я, например, в одном старом проекте по плохому узнал, что из деструкторов нельзя выкидывать исключения. Потому, что в случае, когда рантайм разматывает стек при исключении и вызывает деструкторы, то повторное исключение нахер все ломает и процесс выходит. И никакие Индусы на ютюбе и многие книги по плюсам тебе об этом не раскажут, ты узнаешь об этом после нескольких часов в отладчике.
Ну так то да... а так - нет :oops: В новых стандартах специально по умолчанию сделали noexcept, но оставили возможность стрельнуть в ногу (якобы можно проверить std::uncaught_exceptions(), но потом то что делать?)
 

Вложения

  • dtor-throw.png
    dtor-throw.png
    46.6 КБ · Просмотры: 62
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
но оставили возможность стрельнуть в ногу.
Для плюсов это нормальная история.
 
Вот про исключения скажу что для малвары инструмент плохой, так же он плохой для любого продукта претендующего на производительность.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот про исключения скажу что для малвары инструмент плохой
плохой разве что в контексте, что никто их (SEH) криптовать не умеет.
а так - наоборот имхо, вот крешнулась обычная прога, юзер отписал баг репорт. Упала малварь - и все. А так есть шанс отправить лог в админку.
Или в чем плохо?
 
Исключения в ц++ это не совсем про windows seh, и вот ц++ исключения потянут рантайм который вам точно в малваре не нужен. В малваре используют veh. Исключения ц++ они как и в питоне предназначены для того что передать информацию об ошибке именно тому коду который должен ее обрабатывать, это избавляет от надобности проверять завершилась ли функция с ошибкой и передавть из функции в функцию код ошибки.
Изабавляет от этого:
x = SomeFunc();
if (!x)
{
return x;
}
...
x =
if (!x)
{
return x;
}
...
x =
if (!x)
{
do something
информация об ошибке передавалась через много функций прежде чем дошла до той которая с ней что то будет делать,
весь код утыкан этими иф эррорами
}
Вот исключения в плюсах позволяют всех этих ифов избежать и ошибка прилетает туда где ее ожидают, более того все RAII корректно освобождаются в процессе, именно поэтому котяру наказал эксепшен в деструкторе.
 
Допустим, давай возьмем код на Си
C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    srand((int)time(0));
    const int n = 10;
    int a[n];

    for(int i=0; i<n; i++)
    {
        a[i]=rand()%33-12;
        printf("%d ",a[i]);
    }
    puts("");

    for(int i=0; i<n; i++)
    {
        if(a[i]<0) a[i]=a[i]*100;
        else if(a[i]>0) a[i]=1;
        printf("%d ",a[i]);
    }
     puts("");
return 0;
}

Простой код с какого-то задачника, все понятно во что преобразуется.
Вчера видел, но прохлопал ушами. Как раз не всё понятно, вот мнение Микрософт.
C++:
// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray];  // allowed in C++; not allowed in C
Самое весёлое, что GCC и Clang это компилируют, если массив определён в теле функции, но выдают ошибку, если область видимости - файл, или стандарт 90го года.
C:
const int maxarray = 255;
char store_char[maxarray];

int main()
{
    const int maxarray = 255;
    char store_char[maxarray];
}
В плюсах тут всё просто - на этапе трансляции вычисляется константа, а на нижнем уровне получается место в секции данных или sub rsp, 255*4.

В Си оказывается, что 1я maxarray может быть слинкована, то есть на нижнем уровне это никакая не константа, а ячейка памяти, где хранится 255. Таким образом store_char - variable length array.

А variable length array - это та ещё верёвка достаточной длины:
C:
void vla(unsigned size)
{
    volatile char a1 [size];
    a1[size] = 1;
    for (unsigned i = 1; i < size; i++) {
        volatile char a[i];
        a[i] = 0;
    }
}
Проблема может быть не очевидна, но код компилируется в
Код:
vla:
  mov esi, edi
  push rbp
  lea rax, [rsi+15]
  shr rax, 4
  sal rax, 4
  mov rbp, rsp
  sub rsp, rax
  mov BYTE PTR [rsp+rsi], 1
  cmp edi, 1
  jbe .L1
  mov eax, 1
.L3:
  lea rdx, [rax+15]
  mov rcx, rsp   ; <<<<
  and rdx, -16
  sub rsp, rdx   ; <<<<
  mov edx, eax
  add rax, 1
  mov BYTE PTR [rsp+rdx], 0
  mov rsp, rcx   ; <<<<
  cmp rax, rsi
  jne .L3
.L1:
  leave
  ret
Место в стеке выделяется на каждой итерации.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Вообще любителям Си из новых языков, наверное, понравится только Zig - как такой же простой язык без нихера, как Си. Ну только с несколькими улучшениями, типа модулей вместо хедеров, компайл тайм исполнения, эррор коды на уровне языка, легкая кросс компиляция и система сборки и тд. Мне, как "любителю" си виз классес, куда больше нравится Nim. Rust тоже не плохой в идее, но синтаксис мне не нравится и его слишком усложнили в плане теории типов.
 
Самое весёлое, что GCC и Clang это компилируют, если массив определён в теле функции, но выдают ошибку, если область видимости - файл, или стандарт 90го года.
Забавная мысль промелькнула. Точнее воспоминание из молодости, о первом языке моем, с которым входил в кодинг. Так уж вышло, что это были Сиплюсы. Я бы даже сказал, что изначально это был больше Си, но с плюсовым синтаксисом, cout вместо printf, new вместо malloc, плюсы полноценно появились уже после освоения ООП, чтобы понимать stl.
Так вот забавная мысль заключается в чем. На начальной стадии, при изучении массивов, мне очень хотелось динамически задавать их размеры, для того, чтобы решить простую задачу, которая была под стать моим знаниям тогда. Но я не мог этого сделать, по той причине, что для этого мне надо было понимание, что такое стек, что такое куча, почему я не могу в теле функции задать произвольные размеры для своего буфера динамически. Вы только вдумайтесь, чтобы просто работать с массивом, новичку уже надо понимать структуры данных, лайаут программы, помимо изучения кодинга, надо сразу же изучать как работает компилятор. И это вы скажете мелочный кейс, «смирись и запомни, неофит». Только вот такое на каждом шагу встречается, и вместо кодинга новичек занимается ерундой, которая безусловно важна, но не на этапе, когда он изучает как работать с кодом вообще.
Квейк аппелирует к тому, что если начать с Python например, то не ясно во что твоя программа транслируется за прослойками абстракций. Хочу спросить, а с Си для новичка разве не так? Новичек большинство подводных камней в этом яп принимает на веру, нет реального понимания того, почему так сложилось исторически в этом яп и почему иначе нельзя, почему под капотом получается такой выход, а не иной. По этому утверждение, что если новичек начнёт с Си - то он больше будет понимать низкоуровневое устройство и выход компилятора - это обман. Без соответствующего опыта это невозможно. Простыми словами - ты не сможешь на этапе изучения массивов в Си в полной мере осознать, почему он на стеке, а не в куче, почему нельзя динамически ему задать размеры, ведь на этом этапе ты даже не знаешь, что такое стек и куча.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А если начал с#/с++ ?
Ну значит: всё, пизда, не выйдет из тебя элитного программиста, лучше сразу на завод идти, ну или хотя бы электриком.
 
Ну значит: всё, пизда, не выйдет из тебя элитного программиста, лучше сразу на завод идти, ну или хотя бы электриком.
Понял, завтра пойду резюме отностить..
 
Кстати про обучение новичков.

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

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

Учить легче когда информация о том как надо ложится на понимание где мы сделали менее эффективно ранее.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Кстати про обучение новичков.

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

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

Учить легче когда информация о том как надо ложится на понимание где мы сделали менее эффективно ранее.
Описанный тобой метод называется "методом Колба" ТЫК
Кстати, это действительно один из (если не самый) лучший способ обучения.
 
Описанный тобой метод называется "методом Колба" ТЫК
Кстати, это действительно один из (если не самый) лучший способ обучения.
Не знал, благодарю.

Еще про малвару и новичков =) Вы не научитесь ее писать если нет возможности лить в живую природу и сливать отутда логи. И неважно что у вас 15 виртуалок с разными верисиями ос. Без проливов и разбора репов вы ее не сделаете, ну или это будет чисто формально малвара.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Еще про малвару и новичков =) Вы не научитесь ее писать если нет возможности лить в живую природу и сливать отутда логи. И неважно что у вас 15 виртуалок с разными верисиями ос. Без проливов и разбора репов вы ее не сделаете, ну или это будет чисто формально малвара.
Про свой путь и опыт рассказать нет желания?
 
Думаю надо так - дать им минимум информации и простые задания. Они наделают ошибок и корявых алгоритмов. Потом дать им книгу по алгоритмам - они будут делать фейспалмы и краснеть, типа вот я натупил.
Что понимается под алгоритмом? "Открыть, файл прочитать, закрыть", или работа с красно-чёрным* деревом (зачем)?

Наиболее фундаментальный труд по алгоритмам, многотомник Дональды Кнута - специально придуманный ассемблер.
Из неё я усвоил анекдот: Алгоритм Кнута-Морриса-Пратта понимают только Кнут, Моррис и Пратт.

Генри С. Уоррен мл. "Алгоритмические трюки для программистов" (название в оригинала: Hacker's Delight, буквально "восторг хакера") - Си, но язык используется как кроссплатформенный ассемблер, никаких "ООП" и прочего.

Роберт Седжвик "Фундаментальные алгоритмы на Си" - вроде нет ООП. У него вышел и вариант про Си++, не знаю, в чём разница.

---
*) в исходниках FreeBSD red-black tree переименовали, поскольку Black Lives Matter и так далее. Так что собирайте книжки, пока их не переписали хунвейбины, корпорации под это дело целенаправленно выделяют сладкие шекели (а стало быть доллары и евро).
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх