Reverse Engineering на .NET код
Ради Атанасов (Лектор, съосновател на One Bit Software), Иво (представя лектора)
Лекция за обратно инженерство на .NET приложения — с декомпилатор (dnSpy) лекторът показва как се разглежда и променя компилиран код на чужда библиотека и демонстрира на живо кракване на лицензионен модел върху собствен продукт, тъй като други вендори са отказали. Началото е личен разказ за първите му стъпки в програмирането на BASIC и преписването на код от списания.
Описание
🟪 DEV.BG .NETworking Conference 2026 🟪 https://www.events.dev.bg/dotnet/2026
👉 Лектор: Ради Атанасов
👉 Тема: Reverse Engineering на .NET код
Описанието е на DEV.BG.
Препис
Автоматичен препис — може да съдържа грешки — сверявайте с видеото, преди да цитирате.
Клик върху времето пуска видеото от този момент.
↗й [музика]
↗благодаря ви за времето, което ще ми
↗отделите. За мен, разбира се, е чест.
Покажи целия препис — още 1066 абзаца (~6480 думи)
↗А благодаря на Иво, че ме представи.
↗Честит ден на Размисъл.
↗Разбира се, внимавайте с тези машини.
↗Да.
↗А така. А
↗за начало няколко думи за мен.
↗Това съм аз. Мисля, че е 92 година. Не
↗си спомням. Не питах майка ми. Тук се
↗вижда един компютър Ty Color Computer
↗128 KB.
↗А това е монитора с кинескоп.
↗Това е сигурно малко хора тука знаят
↗какво е това. Магнетофон, кастофон. Да.
↗Кулф най-добре знаещото от тази
↗възрастова група. Това са касетки, с
↗които се нали държат се данни на тях.
↗Също намерих една снимка от един музей.
↗Това е всъщност как изглежда сетъпъ. Има
↗два джойстика, които са важни. Там
↗някъде се виждат дискети, което набежда
↗ми щета, че това не ми е първият
↗компютър. За пердетата и за българския
↗елемент няма да коментирам нищо.
↗А в този компютър като влезеш,
↗[прочиства си гърлото] първото нещо,
↗което нали в кавички влизаш е в бейсиic
↗идето. Общо взето включваш компютъра и
↗директно влизаш в идея и започваш да
↗пишеш basic код. А намерих тази снимка
↗отнякъде, 10ти ред, runн, как са и така
↗нататък. Тука виждаме първия AI чат
↗агент.
↗Да. Аа зеления екран можете да си
↗представите кинескоп, нали,
↗зрегорелките. Просто това зелено ми се е
↗впило в ретината.
↗Аа и а
↗от шестгодишен имах този компютър и се
↗опитвах да заредя игрите. Игрите тогава
↗се споделяха чрез списания. А тука
↗намерих някакъв пост от този господин.
↗Това Това работи ли лазер? Не. Упс.
↗Чакай, чакай, чакай, чакай. аматьорска
↗работа. А та с тези списания се
↗споделяше код. Съответно какво да го
↗направиш? Ами трябва да го препишеш,
↗нали, от хартията. Ако на нищо друго не
↗ме научи това нещо в детството ми, поне
↗ме научи на синтаксис и да преписвам
↗много хубаво. Та бях добър преписвач. Аа
↗и докато ги преписвах тези неща, разбира
↗се, имаше нишки, стрингове от текст ти
↗си победител и така нататък. и си спомня
↗как ги променях, нали, да си слагам
↗името в игрите. И разбира се, това като
↗се интерпретира, то не се компилира,
↗нали, бесик, поне в тоя вариант. Той се
↗интерпретира, машината минава и и се
↗вижда игра. И ако гледате заглавията на
↗тези Big Baby Jesus, нали, човека
↗печка, а забележете, има много повече
↗лайкове, отколкото аз имам на постовете
↗си сега, нали? Аа та аа това е историята
↗на бейсик езика. Тука имам слайд, който
↗ще си спестя. Фаун на One Bit Softare
↗съм. Да. Компания на 16 години.
↗Благодаря на екипа, че сте тука и зад
↗тон колоната и не виждам.
↗Да, благодаря, че ме подкрепяте.
↗Аа
↗Quantumм DMS, да, наш продукт. Oracle е
↗най-новия ни продукт. AI агент за
↗програмиране. Можете да ги разгледате.
↗Мога да кажа, че не свирена китара.
↗Минаха тези дни.
↗Сега рекламното лице съм на деф БГ
↗евтините билети. Реших да Да. Не само на
↗една инстанция, ами то беше непрекъснато
↗дълго време. Така че ако нищо не ви
↗друго не ви дам тази лекция, поне можете
↗да нали ми купите един обяд с тези €,
↗които спестихте на глава. И държа да
↗кажа Мартин Кув беше рекламното лице на
↗скъпите билети.
↗Да. Мартин, тука ли си, за да знам с
↗колко да те храня? Не. Да. Добре. Сега
↗аа rвърс engжниринг, докато се подготвях
↗за тази тема, научих, че всъщност
↗терминът обратно инженерство е валиден.
↗Хората го използват. Изключително много
↗ми бърка в здравето, като повечето
↗термини, нали, но а ако ме познавате
↗като лектор, се опитвам да премахна
↗всяка една чуждица. Така че ще се
↗постарая да не използвам такива. А, ще
↗разгледаме нали едно DNET приложение
↗горе-долу как изглежда по различните
↗слогове. Ще го декомпилираме, ще видим
↗как да го дебъгваме без да имаме код. Ще
↗разгледаме малко тематиката за
↗облофоскиране, как да модифицираме
↗обскиране, който съответно как да го
↗изпълним, след като е модифициране.
↗Сега, а отдавна търся конференция, на
↗която да разкажа за тези неща, защото
↗тази тематика обикновено не продава
↗билети, нали, тя е олдсл теория от много
↗време, но рядко се стига до нея.
↗Съответно има твърде много тематика.
↗Разделил съм го на шест части. Ние сме
↗тука на частно. Не знам дали ще доживеем
↗друга част. Не знам къде, не знам кога.
↗Разбира се, не е готово, но а ако някъде
↗доживеем, може и да успея да включа
↗всичките тези неща.
↗Каква ми е целта, като си тръгнете от
↗тази стая, да знаете какво се случва с
↗C#ARP кода ви, след като го компилирате
↗и като го пускате, както Ива добро
↗въведение, да видите какво се случва, а
↗да видите C#ARP код от компилирани
↗библиотеки, да можете да си ги гледате
↗тези неща, за да имате една крачка
↗поглед напред пред компилатора ви, за да
↗видите той какви измишляте нива и
↗разбира се как да променяме библиотеки
↗за каквато и да е била цел.
↗Защо цел? Търсим си цел, за да разберем
↗как работи едно приложение в
↗нашата работа в one bit soft дори в
↗момента имаме ситуация, където да наше
↗приложение, наши приложения, бази, данни
↗навсякъде и някъде другаде има някакво
↗приложение, което мигрира данни между
↗тяхна си база, наша си база. Ние нямаме
↗никаква представа как това приложение
↗работи. Хората, които са го правили, ги
↗няма вече.
↗А и няма кой да ни обясни дали ще счупим
↗нещо, ако започваме да променяме.
↗Съответноснениринг
↗искаме да видим в то в тази библиотека
↗какво има, какво се използва, как се
↗използва. Та типичните сценарии са,
↗когато няма документация, когато просто
↗не знаете дали едно нещо въобще трябва
↗да работи спрямо очакванията ви, когато
↗а тези неща не са налични. Това е много
↗практична задача. Разбира се, ако търсим
↗проблеми vulnerabilities bug
↗detection, това е част от, нали, много
↗съществена част от cyбер secюриity
↗сегмента, който разглежда,
↗вируси и подобни. Въобще гледането на
↗как работи едно нещо изключително от
↗значение.
↗А [прочиства си гърлото] коригирането на
↗приложения в историята си съм коригирал
↗и на Microsoft библиотеки, просто защото
↗нещо не естествено изпипано и както и да
↗е в света на SharePoint ни научи да
↗правим rвърс engниринг абсолютно нали
↗ежедневно. Тоест IL SP ми беше сай с
↗идето в sharepointските дни, когато
↗трябваше да разберем как работи и
↗евентуално да коригираме нещо. Така че,
↗а все още е актуална тематика за cyбер
↗securюity. Казах да и разбира се, ако
↗искаме да направим някакъв вид кракинг
↗на софтуер, кракинг термина, имаме един
↗продукт готов, нали, приложение или
↗игра, най-често игри и искаме да
↗премахнем защитата и така, че да може да
↗си играем съвсем спокойно. А нали днешно
↗време игрите се дават с някаква защита,
↗не е както бейсик, където го преписваш
↗и и като го преписваш, то не компилира
↗или не работи, защото просто си го
↗преписал грешно. В случая с гейминга
↗много бутас engниринг частта от
↗индустрията.
↗И за мене една крачка към синир. Това да
↗можем да си разгледаме кода след
↗компилация, да разгледаем няколко неща
↗ни дава поглед, дълбок поглед на това,
↗което се случва, след като напишем един
↗обикновен C#ARP код и нашият компилатор
↗свърши някаква работа за сцената. А
↗[прочиства си гърлото] как вървим с
↗времето?
↗36. Добре, сега DNET STК какво се
↗случва? Повечето от вас свързват DNET
↗със C#ARP. В моите дни, нали, аз
↗започнах професионална работа 2005
↗година, преди това учих програмиране,
↗скъсаха ме на изпита за vb.net,
↗признавам си, защото просто не бях аз
↗виновен, беше тя, нали. А и а мислех си,
↗че знам повече от всичко и така нататък.
↗Въобще дори не се и занимавах с него, но
↗аз започнах света на DNET с
↗visualbasic.net.net И по-късно през
↗годините, а от 99% популярност C#ARP
↗превзе, започнаха на чисто Microsoft,
↗нали, въведоха неща във езика, които
↗откраднаха от Java, за за да са
↗актуални. Аа за F#ARP нищо не знаем.
↗Никой нищо не знае за F#ARP. Да. Но
↗светът на DNET не е само това, а има
↗много езици, които компилират до DNET.
↗Така, нали, този термин се използва. А
↗те всъщност компилират до IL. След малко
↗ще го видим на диаграмата. Кобо има,
↗нали, Visual Callol компилира на нещо,
↗което може да се пусне в DN runime. PHP,
↗нали, кой би си помислил такова нещо. А
↗когато компилираме, ние компилирано
↗нещо, което се нарича в началото MSIL 1.
↗Microsoft Intermediary Language. CIL е
↗техническият термин, който се използва в
↗момента, в който те го вкараха като
↗стандарт.
↗Разговорно използваме термина. В
↗повечето случаи ще използваме термина.
↗Такава е и документацията, такава е в
↗приложението, защото нали си знака C-то
↗ни пречи. А I език е това, което работи
↗в нещо, което наричаме runtime на DNET,
↗нали? Дали ще го наречем CLR, а Core
↗CLR, а и
↗Environment Engine, мисля, че нали
↗виртуална машина в света на Java и на
↗много други технологии се използват. тоя
↗термин виртуална машина, тоест един слой
↗между машинарията и нещо друго, към
↗което а нали а може да бъде
↗интерпретирано и да работи за въпросния
↗хардуер. В този слой може би живее да не
↗може би живее нещо, което се нарича
↗Justin Time Compatр, нещо, което
↗интерпретира този IL език и го обръща на
↗момента в процесорни инструкции. Rit от
↗You can нали е
↗новият git компилатор в DNET core ерата.
↗Та встрани има of time компилация, която
↗премахва целия time, нали, то
↗прескачаме го един вид. Директно
↗компилираме в кавички или по-скоро а а
↗пакетираме от IL директно към нещо,
↗което е специфично за конкретна
↗архитектура, процесорна архитектура.
↗Това, което Je прави е открива какъв
↗процесор сме, пита операционната система
↗и за конкретния процесор обръща IL
↗операциите към такива, които се разбират
↗от процеса. И в средата има едно нещо
↗там Ready to run технология, която е
↗микс между двете, хем малко native, хем
↗малко менидж код. А ако се питате защо
↗всички лектори вдолу вляво са с празни
↗кутийки, разбрах, че там ще бъде видео
↗стрийм с лицето ми и имаше място да си
↗махнем нещата от слайда. Затова долу
↗вляво има една празнота.
↗Под този слой вече съществува хардуерт,
↗нали? В прости думи тука работим с тука
↗е процесорът, нещо на което изпращаме
↗някакъв вид инструкции.
↗Това са ни основните макрослоеве на
↗технологията. Разбира се, много дебела
↗работа е в въпросния runтайм.
↗А ако искате да разберете повече за
↗целията, единственият качествен ресурс е
↗книгата на Runнтайма, нали това е писано
↗от програмистите на Runтайма- в
↗Microsoft за програмистите в на
↗Runтайма- в Microsoft, но е изключително
↗полезен и хубав ресурс. Аз не съм го
↗чел, просто защото е нали аз съм човек
↗на горните нива, правим неща, които
↗доставят бизнес стойност. Чел съм го от
↗нали нещата, които ме интересуват, а ги
↗гледам. Сега как работи кода ни? Имам
↗една обикновена функция на C#ARP. Приема
↗два параметра, връщадъ,
↗а добавя ги. Това ни е C#ARP
↗репрезентацията. Компилатор взима това
↗нещо и създава IL. Като а
↗[прочиства си гърлото] IL слоя работи с
↗нещо, което се нарича виртуален стак,
↗memory stack, leo stack, lasting first
↗out stack, тоест отгоре са нали
↗най-последните неща, типични стак
↗операции push popп и т. Съответно C#P
↗кода обърнат в Айл горе-долу изглежда
↗така.
↗Аа
↗това чудо се намира в DL файката DLL
↗файла или езето, когато нали направим
↗DNET publish, в случая и нали и build,
↗но publish го подготвяме, дето се вика.
↗А [прочиства си гърлото]
↗в случая на Head of Time Compilat по
↗време наблиish този IL става по-скоро
↗native репрезентация.
↗А се интерпретира от Justin Time
↗компилатора, ако съществува в стакани
↗ни, към така наречените мнемоники на
↗assembly мнемоники. А
↗RCRX са регистри, RETN е информация.
↗Тука вече не ги знам, не са ми чак
↗толкова релевантни. Разбира се,
↗занимавал съм се да бъркам на такова
↗ниво с разни инструменти, но не ми е
↗ежедневието.
↗Зад сцената вече виждаме хкс
↗репрезентацията на Assembly Neemonics.
↗Тоест, ако отворим един файл с notepad
↗или по-скоро скдитор, Notepad ще ни
↗покаже аки репрезентацията на хкса,
↗докато един хдир ще ни покаже ей тези
↗цифри. Те са еквивавилентни всъщност на
↗пневмониките на assembм вляво.
↗C3 примерно еnow знак за връщане и това
↗се случва. Тоест шипинга пакетираме
↗обикновено нещо, което е IL, особено ако
↗не е head of та компилация. Най-накрая
↗стигаме нещо, което е native. По време
↗на екзекюция опе операционната система
↗зарежда метода в памет, нали, заключва
↗го, маркира го като execюable, а и оттам
↗нататък процесорът изчита тези
↗инструкции и си върши работата. Магия.
↗Сега, а в случая на DNET библиотеките
↗тази картинка е AI генерирана и не става
↗за нищо. Просто нямах време, защото
↗трябваше да стигна тука за лекцията на
↗Тони. А има няколко ключови места в а в
↗света на DNET
↗с право стъпиха върху Windows Portable
↗Executable формата PE File формат. Това
↗е форматът на assembмлито и на ex-то,
↗когато компилираме за Windows, нали, за
↗Linux по друг начин изглеждат нещата.
↗Фокусирам се малко върху Windows нещата.
↗Съответно да, има таблица с всичките
↗секции в този файл. Той е обикновен файл
↗с начална точка, крайна точка. Това ни е
↗нали стрийм от бинарни знаци за едикава
↗си част. Има си манифест, хедъри, които
↗описват какво се случва вътре в един
↗файл. А по-интересно е managed code
↗секцията, тоест в случая на DNET в един
↗Pile формат в точкате частта. Малко
↗по-късно ще ги разгледаме набързо тези
↗неща. Няма да задълбавам, защото все пак
↗имаме шест части от теория. Ние сме само
↗за първата. А там се пакетира въпросния
↗IL код. Metadata таблиците или metadata
↗table са едно интересно нещо по време на
↗дизайн наnet и на C#ARP езиците. А
↗колегите от Microsoft са имали много
↗ключови и цели. Една от тях е да имаме
↗нали много хубав developм experience. В
↗случая
↗а и дето много използва metata tables
↗плюс reflection плюс какво ли не още, за
↗да ни помага и да имаме това, което
↗имаме днешно време в поне във Visual
↗Studio, Visual Studio CД, нали, там
↗дебъгеerъ
↗върши само дебък работа. Та
↗а много повече теории имам във втората и
↗в третата част за въпросната DOPN
↗assembly как се пакетира и защо то е
↗интересно. Когато декомпилираме, какво
↗всъщност правим? Взимаме въпросния IL и
↗правим реконструкция на C#ARP кода.
↗Тоест, връщаме се отдясно наляво, нали?
↗Ако декомпилираме DNET assembly, стигаме
↗до C#ARP или до какъвто си искаме DNET
↗ex програмата, която използваме може да
↗го интерпретира. Изъм така се нарича. А
↗това е оригиналния
↗disembler е терминът тука от Microsoft,
↗където от едно една библиотека може да
↗вземем суровия IL код, така както той е
↗пакетиран. Разбира се,
↗не е бинарен. Обърнат е в notepad
↗текстов формат. Съответно може да видим
↗как изглежда и аа
↗и това ни е междинният език, с който аа
↗run runtтайм съответно работи.
↗Популярният инструмент е IL spy. Pнакът
↗е трябва да е малко, объркал съм се.
↗Тука виждате, че слайдовете ми не са
↗генерирани от AI. А съответно
↗[прочиства си гърлото]
↗IL Spy е инструментът, който и до ден
↗днешен се поддържа. Погледнах в GitHub и
↗така има едно преди два-три дни към така
↗че е актуално. А аз днеска ще използвам
↗DNPй, защото е много повече таргетиран
↗към Само да си видя времето. Окей сме.
↗Таргетиране към рекомпилация и
↗преизползване и дебъгинг.
↗Аа всичко от i слоя надолу вече там
↗инструментите са страшно много. Windbug
↗е може би а най-стария, най-използвания
↗от Microsoft, нали той ни дава вече нещо
↗на съвсем друго ниво. Дава ни аа
↗възможно най-близко до желязото всичко,
↗което се случва. ГиIDRA е известен
↗National Security Agency, нали, отново
↗инструмент за по-скоро за Forensic с
↗много голяма част от него покрива
↗Engниринг, също и на GitHub.
↗Мисля, че се поддържа други IDA, Super
↗PMI, много, много, много други
↗инструменти, които може да ползваме за
↗някакъв вид или отваряне на асемблита,
↗или гледане, или runтабъg, блокиране на
↗процесор, закачане на дебъгинг, всичко,
↗което работи по нали по време на
↗оперативна работа на машината.
↗Сега може ли да декомпилираме код? Това
↗е по-скоро
↗имаме ли юридическото право да го
↗направим? Няма да се задълбавам тука.
↗MIT и GPL лицензиите имат клауза, че
↗може да го декомпилираме и че имаме
↗свобода да го правим това нещо.
↗Комерциален софтуер, който има user
↗licence agreement. Обикновено там със
↗сигурност ще пише, че не може да го
↗декемомпилирате.
↗Аа в Европа 2021 година
↗не знам кой Европейски съд каза, че
↗имаме нали има спечелено дело, че може
↗да правим ревърсенринг, когато вендорът
↗не може да си оправи проблем. Ние сме
↗платили за софтуера, той не задоволява
↗съответно проблема, нали? Съответно може
↗да си го реверс инжененираме, да си го
↗променим и да си караме напред, защото
↗сме си платили за това нещо. US този
↗закон аа той е много интересен. Той дава
↗три години възможност да правим публична
↗декомпилация, три години да не го
↗правим, три години да го правим, нали?
↗Сега 2024 до 2027 може да се правят
↗такива неща. Та да, странна работа. Сега
↗обскирането
↗няма такава дума на български език, но
↗се използва, нали?
↗А
↗нямам представа как да го кажа на
↗български език, защото все е грешно. А
↗нали всякакви стратегии има, които
↗объркват
↗аа IL слоя,
↗генерират вътре какво ли не, така че
↗интерпретиран или обърнатият C#ARP код
↗да прилича на нищо. То така или иначе
↗прилича на нищо, когато се компилира.
↗Така че обускирането
↗цели да направи
↗обратното инженерство
↗по-бавно, по-трудно, нали, защото няма
↗защита. Всичко, което правим, е да
↗направим кракинг
↗по-бавен и по-труден.
↗[прочиства си гърлото]
↗Тези термини няма да ги няма да влизам
↗надълго в тях. А можете да си ги
↗разгледате по-подробно. В третата част
↗на тази серия ще ги разгледаме малко
↗по-подробно, макар че ползата от тях е
↗нали клони към нула. За да защитим,
↗имаме много нали възможности. Преди
↗малко казах, защитата само забавя.
↗Когато се прави securюриity audit или
↗pтест на софтуерен продукт. А
↗компанията, когато правитеationшъ
↗тестинга, винаги казва едно и също нещо.
↗Ние имаме ограничено количество време.
↗платили сте за четири дни, докато
↗кракерите имат безкрайно много време.
↗Съответно това им е техният дисклеймер,
↗че няма да се справят навреме.
↗Аа но наистина
↗ние щом може да видим каквото има в
↗памет, колкото и в суров вид да е, все
↗пак може да го видим, нали, може и да го
↗променим. Сървър сайт, когато не
↗изпращате кода а към потребителя, е
↗единственият истински начин да защитите,
↗нали, някакъв вид IP. Това не променя
↗тази част.
↗В гейминг индустрията
↗се счита, черснеринг
↗има най-много последствия спрямо нали
↗финансовия аспект. Тоест там има
↗най-много кракинг и в софтуерния,
↗разбира се, но като че ли нямам
↗статистика, но а от рисърч, който имам,
↗гейминг индустрията най-много а губи
↗пара от декомпилация и подобни неща.
↗Сега дотука имаме ли въпроси?
↗Само да кажа, че нямаме време за
↗въпроси. Съответно, ако искате да питате
↗нещо, нали, сега е моментът, нищо против
↗нямам. Трябва да викате по-силно, за да
↗ви чуя. А, само да сменя това на не
↗толкова тъмно, за да не ви объркам.
↗Кажете ми дали така е по-добре. Сега тея
↗новите джензи, джъм и така нататък,
↗нали, сочна слива.
↗А,
↗да, извинявам се.
↗Къде е по дяволите синия? Виждаш се
↗какви са тея.
↗Лайт не е ли с цяло бял?
↗>> Е, тук ще ви изгоря ретината, нали? Е,
↗да. Търся онова синьото, готиното.
↗>> Добре. Кулбрийс. Сега тука вече се
↗загубих. А
↗допускам още една аматьорска грешка. Аз
↗съм принципно опитен лектор, ама как пък
↗допускам такива аматьорски грешки? То е,
↗че не съм си пуснал зумит, нали, за
↗хората като кулв, дето не могат да
↗видят.
↗Няма го тука, за да си говорим през
↗сцената.
↗Така. Да, вижда се. Окей. Ще мога да да
↗ви да ви завия свят. Така. А сега аз
↗[прочиства си гърлото] ще използвам DN
↗SP, затова търсех синия ефект, но сега
↗поне може да го разграничите, нали, от
↗Visual Studio. А DNSP е един от
↗инструментите, с които може да
↗разглеждаме какво се случва в конкретна
↗библиотека. Имам едно решение, разбира
↗се, на OneBIT Soft, разбира се, Quantumм
↗DMS. Преди тази лекция питах две-три
↗неща. Едното беше всичките вендори на
↗някакъв софтуер дали ще ми дадат на живо
↗да направя кракинг и промяна на техните
↗приложения, да заобиколя лицензирато.
↗Никой не каза да.
↗Съответно хванах наш продукт, който няма
↗такъв лицензионен модел. Аа
↗разбира се, използвах нашия AI агент
↗Oraclon, за да напиша спецификация за
↗лицензионен модел. Вторият въпрос, който
↗зададох към нали публичната социална
↗аудитория е какво искате да видите от
↗една rвърс engineering сесии. Всички
↗казаха искам да видиш как каркваш
↗софтуера наnet, нали? Окей. Съответно
↗направих си спецификация генерирана от
↗AI. А оракъл ни е написа така, така се
↗казва нашия AI ген. Не е много зле, не е
↗никак добре. Тоест някъде в средна зона.
↗А има къде къде по
↗зрели неща, които може да направим, за
↗да си защитим един продукт. Разбира се,
↗всяко едно ниво по-нагоре отнема време,
↗пари и е главоболие. Има един триъгълник
↗ability, securюity features, нали,
↗никога не може да печелим от трите неща
↗в днешно време. Само Apple успява някак
↗си да ги избута. А няма какво толкова да
↗разгледаме лицензионния компонент. има
↗криптиране, хеширане, разчитане на аа
↗CPU ID-то на диска, аа генериране на
↗лицензионен файл и така нататък.
↗Съответно едно от нещата, които направих
↗е аа
↗защото знам нещо за тези неща, е,
↗включих лицензионния код в средата на
↗приложението, Core библиотеката, бизнес
↗и така нататък. Лицензионният ви код
↗никога не трябва да бъде third partти
↗продукт. такива на пазара са тотал,
↗нали? А, защото като компроментират
↗продукта, нали, веднага ще компроментира
↗всичко друго, което трябва да е в ядрото
↗на кода ви, където най-много има
↗промяна, така че да не прави смисъл да
↗кракнем едно нещо, защото на следващия
↗ден вече със света, в който ние живеем,
↗нали, а аудиторията ще бъде а outдейт.
↗Добре сме с времето. А между другото
↗въпрос за аудиторията.
↗Това, което казах, да направим външна
↗библиотека, която ни дава възможност да
↗си защитим кода. Можете ли да се сетите
↗най-големия гаф в практика в индустрията
↗ни?
↗Кой тегли от Замунда?
↗Игри всички. Да. Добре. Най-големият гаф
↗по стойност, фискална стойност е на
↗Steam а-то steamapi.dl,
↗нали? А е DL като, която един път като
↗се компрометира всички игри изведнъж се
↗изкомпрометирах и в продължение на 10
↗години аа занда кракерите, нали, просто
↗раздават Steam API библиотека и ако
↗видите техните инсталатори, те просто
↗заменят Steam API библиотеката, тогава
↗цялото нещо. никога лицензионен
↗компонент или компонент за защита на
↗софтуера или каквото и да е било, не
↗трябва да излиза от сърцето на софтуера,
↗защото просто го компрометирате и оттам
↗нататък ъпдейтите на продукта ви, нали,
↗почти няма да имат отношение и значение.
↗Сега AI тука изгенерира
↗интересни класове, лицензионен контекст,
↗нали? А кой човек подрежда файловете си,
↗така нали? Това е 100% AI генери. Да.
↗Има един колега мой, да не му казвам
↗името, да не се обиди, нали, който
↗казва, "Не мога да различа AI
↗генерирания код от човешко написане."
↗Как бе, човек? То просто изкрие и нали
↗сега не съм му казал генерирай код,
↗който прилича на човешки писан, нали,
↗все пак, но изгенерира някакви неща.
↗Гледах го,
↗прави няколко ключови действия. За
↗начало няма метод validate licence,
↗който връща едно просто бул. Да, не
↗валиден си, нали мога да ти покажа
↗цялата функционалност валиден си или не,
↗защото просто с това нещо може да се
↗обърне с точно едно копче и да се
↗възстанови. Аа в случая нали случва се
↗тамринг на чист български на
↗библиотеката. Тука сложи едниб ключове,
↗privт ключове, генерирах едни
↗сертификати, сложих нали моето име за
↗еншъ, понеже той ми сложи нещо смислено,
↗защото мога някакъв лицензионен гард
↗тука има, който съм го ибъгвал, нали, за
↗да видя какво прави, защото не работеше,
↗[смях] трябваше да го оправя. Аа и това
↗нещо м има няколко интересни принципа,
↗ако ги забелязахте преди малко. Този
↗файл е освен, че е recкард окей, опитва
↗се да направи реверсниринга, нали,
↗по-насляп. То има и статичен конструктор
↗някъде. Съответно се зарежда почти,
↗когато и библиотеката се зарежда. Тука
↗има някакъв рапер клас, който върши
↗някаква магия.
↗А
↗сега къде са ми въпросните?
↗А какъв е шортката за breakpoint
↗прозореца?
↗Добре, никой не го знае. Не се чувствам
↗глупав. Да. Сега като го пусна това
↗прижение, само да ви кажа и то какво
↗прави.
↗Постарах се все пак тука лицензионният
↗компонент да е малко по-дванс.
↗А [прочиства си гърлото]
↗има UI Blazer, за да се нали вписвам
↗сред младежта.
↗Да. А да, да, да. Аз го видях, че е
↗долу. Сега сложих му тука един consol
↗read Readline, за да ви покажа Tch на
↗The Buger след малко. В момента сме в
↗Visual Studio, така че не е чак толкова
↗релевантно. Къде са ми брейк пойнтите?
↗Искам да му кажа remove all.
↗Ето remove all, нали
↗така? А сега този инструмент, той прави
↗OCR. Това ни е тест бенч за OCR. Качваме
↗му някаква картинка на някакъв документ.
↗Имаме си наш езиков модел, препроцесинг
↗на картинката, за да се изкриви листа,
↗когато се прави някакъв, нали.
↗А този компонент живее в Quantumм DMS и
↗освен, че ни дава OCR на PDF, обръща и
↗PDF- в Searchable PDF. Тоест, това е
↗сканиралист хартия, то се вижда от
↗анотациите. Съответно мога да да
↗селектирам този текст, което в един PDF
↗не мога да го направя. Обаче тука ми
↗казват, че съм страл лиценз, че кодът ми
↗го връща до първите 100 знака, нали, не
↗ми дава пълния експириънс на всичкото
↗отгоре. Ми казва, че не са ми
↗лицензиран. Съответно помолих AI да
↗направи една страница, където просто да
↗виждаме лицензионната информация, защото
↗с това нещо ще си боравим. Да. А
↗лицензионния обект не е лицензиран ли си
↗или не, ами е сложен обект, за да
↗направи декомпилацията сложна, нали, да
↗ни забави. Липсва ни лицензионен файл.
↗Не е на правилното място. Ако го копирам
↗този f extension.rди, това нещо изведнъж
↗ще цъфне. Така. А до тук сме с Visual
↗Studio и с въпросното нещо.
↗Сега, а компилирахме в ето тази папка,
↗а
↗допълнително, разбира се, помолих AI да
↗ми направи един скрипт, който прави
↗иation. В случая обфскаcтора
↗използвам
↗Opus Car е терминал, разбира се. Пак
↗помолих Oracle, нашия агент, направи ми,
↗моля ти се, една спецификация за OPFCAR.
↗Направи ми XML файл, който дефинира
↗какво да се обускира. Казах му всичко,
↗което е свързано с лицензи да го
↗офоскира. Тоест, нали, той си направи
↗спецификацията. Движим във време, в
↗което кодът вече няма значение. Тоест
↗тая лекция може би това и е последната
↗година, за която ще е релевантна. След
↗това спецификациите само spec driven
↗developм. Няма значение какъв е кодът,
↗стига да задоволява спецификацията.
↗А, да. И тука се е разгърнал, нали, ние
↗описани модел е Quen 3,5 или 6, такъв
↗локален.
↗Това не го гледах вече. И съответно в
↗лицензионната папка имаме аа къде си,
↗къде си, къде си, къде си? В срипт
↗папката може би да имаме XML дефиницията
↗на обускатора ни, която казва какво да
↗аа обскира, какво да не обскира,
↗какво да нали обърне специално внимание.
↗И аа като част от този build скрипt няма
↗да го показвам. Powerhell генерира,
↗нали? М кой си пише скриптовете толкова
↗красиво.
↗А съответно публикуваме
↗без head of time компилация.
↗А обскираме, сравнително бързо се
↗справи. Заменяме
↗обскирания
↗та библиотека с заменяме оригиналната
↗библиотека с офскираната и пускаме уеб
↗сървър, за да може вече да го видим това
↗нещо. Съответно аз ще си играя сега и с
↗тази библиотека. Тя ми е а интересната.
↗Това го спирам за едни пречи.
↗А
↗така. Антум точка. Ето я. Първото нещо.
↗Копирам си я, за да имам оригинал,
↗когато сбъркам нещо или
↗от таммперинга тя вече не става валиден.
↗IL.
↗Да. Така. Сега аа ето го DNP. Красота.
↗Докарвам си библиотеката. Сега в
↗момента, в който я докарам, се случва
↗отваряне на въпросната библиотека.
↗Първата част е P ихера, за който става
↗дума. А ако направя Упс, бомба.
↗Аа оф, четири ли беше? Да. Това, което
↗хем мога да цъкна. Да, съответно А
↗>> а да, то е това тука пък на HDMI не
↗работи. Тоест Ctrl F1лей
↗не Ctrl 4 трябва да Аматьорска грешка.
↗Добре, няма да мога, защото изключва
↗въпросния HDMI. Сега а хедърът ни е
↗разпърчето. Ако искаме да го видим с
↗хексов редактор, тук ще може да видим
↗първо, а нали това приложение не може да
↗работи вOS режим. То сигурно не си
↗спомня какво е DOS режим. Тоест връщаме
↗на дните на TНC. Това е просто защото PE
↗форматът стъпва върху Windows P формата.
↗MZ-та са инициалите на човека,
↗програмиста, който го е писал, си сложил
↗името вътре, нали, ако измислите нещо.
↗Съответно тука много лесно можете да
↗разгледате въпросните части от този
↗файл. А разбира се, и тук можете да ги
↗цъкате и така нататък, за да правите
↗някакъв вид инспекшън. Референциите на
↗типовете,
↗много важна част. Тоест всичко, което е
↗клас тип
↗се описва. Това е част методите, нали?
↗Това е част от амеad
↗data table частта в въпросния файл.
↗Имаме регистър, който е нали, той е
↗виртуален, къде се намира този метод в
↗целия ни файл. Съответно тази
↗метаинформация е
↗нали частта, голямата част, в която
↗работи въпросното компилиране,
↗референците на библиотеките, за да видим
↗какво друго се реферира.
↗Аа и а различни части модул
↗инициализатора, тоест assembly module
↗клас, може биace клас. В света на Visual
↗Basic модулът се пишеше в C#ARP винаги е
↗бил премахнат или поне така се мисли, но
↗може да решим да пишем и модул, да
↗дефинираме какво се нарича вътре. Дълго
↗време в C#ARP нямаше възможността да
↗правим модул инициicialйри. Това е код,
↗който се пуска, когато модулът се
↗зареди, преди да имаме стартова точка. А
↗ако само помислите какво казах, C#ARP
↗няма функционалност, която има в DNET,
↗нали? Напълно валидно.
↗А [прочиства си гърлото]
↗C#ARP не покрива всичко от DNET, но
↗днешно време е движещият фактор.
↗Съответно една от защитните механизми,
↗за какво ви го казвам това нещо, е, че
↗модул ийizer е място понякога, където се
↗вкарва код, който примерно проверява
↗консистентността на кода. Дали примерно
↗всичките тея методи надолу са били
↗променени и отговаря някакъв вид хеш. А
↗как се казваше тази картова игра на
↗Blizzard? Heart of
↗>> как
↗>> Hearthstone, да, тя използва такова
↗нещо, нали, даже е криптирано и такова
↗натак. Гледал съм го за спорта. Тя е
↗една от така по-сериозните DNET базирани
↗игри, които се таковат и а много честа
↗практика е, нали. Съответно, ако видите
↗нещо
↗огромен епшън, преди да сте поели
↗въздух, горе-долу там се случва. private
↗implementation details. Това е на Roslin
↗компилатора част. Тук ще видите поне в
↗този билд много неща, които са обърнати
↗от стрингове към бинарни неща. А
↗съответно повечето стрингове ще бъдат и
↗ще се намират тука в решението ни. Сега
↗ето го нашия name space с това са. Тука
↗вече виждаме класовете, които са в
↗папката на проекта. Те нямат DT
↗namespace. Разбира се, всеки един от тях
↗може да го цъкнем и това, което ще видим
↗е [прочиства си гърлото]
↗а обърнат код от към C#ARP. Някои неща
↗нямат променливи и така нататък.
↗Съответно, нали, компилатора са compйлър
↗генерирани. Извинявам се, тука цъкнах
↗стрийм без да искам. А този код се води
↗сега в случая наистина е минал през
↗обускаци. Всичките тези неща в повечето
↗случаи може би опускаторът ги е направил
↗да са грозни. Това са името на класове
↗на променливи, които обускаторът се
↗опитва да ме обърка. Това са unникод
↗знаци и тези, които не са видимите в
↗повечето случаи или четири таба с един
↗знак или невидим интервал, невидим нов
↗ред, ей такива а знаци в този клас,
↗понеже тука използва някакви неща, които
↗са минали през облоскация стринговете,
↗затова изглеждат по такъв начин. В
↗повечето случаи не изглежда чак толкова,
↗нали, средна работа. И сега какво ни
↗дава възможност? А,
↗нали, DNET spid да направим в случая
↗десния бутон тука съжалявам, че не мога.
↗Тука пише edit clit metod, нали? Добави
↗клас към Добави мем към класа. Добави
↗клас с
↗мърч
↗>> слей.
↗Благодаря. Слей две библиотеки в едно.
↗Редактирай езика, нали, каквото и да е
↗било. Сега дава ни възможност да го
↗редактираме в C#ARP. Сега това е странна
↗работа, която в повечето случаи работи.
↗Ако гледате YouTube видеа за RSE
↗enggenнери на DNET, те ще стигнат до
↗тука, нали? Казват ви, че ето това нещо
↗можете тука да го направите с чист C#ARP
↗код, return true, нали, validate,
↗license. Всичко точно. Тук сега имаме
↗един червен проблем. Това означава
↗компилационна грешка. В едно
↗най-обикновено
↗assembly по-старите dnetфъ стоит в
↗повечето случаи, защото сега розлен
↗компилатор ни дава ето това главоболие.
↗Само с промяната на този C#arp код. С C#
↗Sharp код мога да натисна бутона compile
↗и това ще мине през компилатора, защото
↗тази библиотека е обскирана и причината,
↗поради която не ви я показах да не е
↗така, защото това щеше да компилира в
↗най-обикновен вариант. Тука а
↗обускаторът ни пречи какъв е този каква
↗е тая точка за петайка, нали, на пети
↗ред в еди кой си фама, аз нямам main CS
↗и така нататък. Тоест, а възможността да
↗не компилирам на този етап променената
↗библиотека е аа възпрепятствено към мене
↗от нали от от случая от опускатор. А
↗сега ако го променим това в IL, това
↗също не е нещо хардкор, нали? Извикай
↗този клас, извикай онова, няма никакво
↗значение. Три ги тези редове. Load
↗constant заради константа.
↗от размера integer 4битов със стойност
↗единица. Единица е true хоп цък цък и и
↗този метод изведнъж ще се обърне в в
↗return true. Тук вече няма компилиране,
↗то вече е, тоест инструкциите ми по
↗такъв начин изглеждат. Това, което мога
↗да направя си сейвна библиотеката, тя
↗вече е тамър, тоест тя не отговаря хшай,
↗нали? Хш екстрактор, мисля, че е модерно
↗по новините. Тука няма да съответства.
↗Тоест това вече променена библиотека. В
↗случая на моето приложение Blazer Webе
↗сървър и така нататък на никой не му
↗пука това нещо, нали, защото няма
↗логика, която да валидира тези неща. В
↗случая на Global Assembly Cash, да, там
↗има малко логика, която предотвратява. В
↗случая на Java по същия начин може да
↗кажем на DNET и на Windows сървър да не
↗ни хвърля грешки, когато библиотеката ни
↗не съответства със сайн кода и просто
↗всичко да си работи. А това ще го
↗оставя, не ни е чак толкова интересно.
↗Връщаме се до а лицензионните папки. В
↗случая нейсace ми не е модифициран.
↗Класовете също така е решил AI-я да не
↗ни обърка съвсем. Съответно аа
↗пропъртитата публичните, нали, искам да
↗видя статуса на лицензионния компонент
↗от външна библиотека. Трябва да правим
↗малко смисъл. В момента, в който имаме
↗фоскирани куласове като ето тези,
↗каквото и да се случи в тях, само ще дам
↗целия клас. Каквото и да се случи вътре
↗в тях, ние губим
↗стак трейса или ние не го губим, ами
↗просто то изглежда по ей такъв странен
↗начин, нали? В папката на обускатора има
↗мапинг, който ни казва ей тоя знак към
↗какво точно е обърнат, ако трябва да
↗разглеждаме такъв стакрейс. Сега аа
↗тука веднага виждаме неща, които бият
↗супер много на очи, ексепшъни,
↗лицензионен ексеп, без дори да знам
↗какво е направил този зацената. Мога да
↗се сетя, че ако някой хвърли Licence
↗Tumer exception, то тогава няма да ми
↗пусне кода и ще покажа, нали, нещо
↗такова. Едно от готините си
↗функционалности на DNSpy е analy
↗функционалността. Мога да видя кои
↗класове използват в заредените
↗библиотеки вляво, а или инициализират
↗използват този клас и този метод. Ми ей
↗тука нали имаме някакъв а хвърлен епшъ.
↗Ако ние искаме в случая на липса на
↗лиценз да спрем хвърлянето на Licens
↗Tamper Exception, да гледате ме лошо
↗виждам. А нали това е един а добър а
↗начин да го направим това нещо. Сега
↗дори без много да го разбирам това нещо,
↗тука има инициализация някаква ш код
↗лиценз. Тука се вижда статичен
↗конструктор, за който говорихме. А
↗тези неща директно мога да си ги променя
↗с, тоест нумератор валиден ли или не е
↗ли. А съответно това мога да го сменя на
↗примерно на на този статус file missing
↗на ниво IL. Тука нямам време да правя
↗по-сложни неща. мога да ги изтрия, мога
↗да ги променям, мога да си пиша I
↗инструкции, нали, вкарай някаква
↗инструкция или няколко, промени си ги на
↗нещо и и действай по този начин.
↗Съответно оттука, ако ги променя нещата,
↗аа действието след това,
↗момент, само да видим а къде се
↗намираме. Нека [прочиства си гърлото] да
↗го бил наново. Само това ще го почистя,
↗за да не ми пречи.
↗Опс, тука ми казва не съм си сейвнал
↗файла, нали? Окей.
↗Остави ме намира. Но
↗аа
↗й айде де.
↗Заби.
↗А не, сега
↗да оправихме се. Искам само да си
↗зачистя аа да въпросния
↗елемент. Сега това ни е библиотеката, с
↗която работи приложението в момента.
↗Оттука само ще отида да променя нещо и
↗колкото да го сейвна, за да ви покажа,
↗че ми свършва времето. Аа
↗така.
↗Къде си? Притесних се.
↗Да, в момента
↗аа
↗явно сорс кодът ми е вече кракна. Тоест
↗аз нищо не направих. А някак си минаха
↗нещата. Ей това мога да ви го променя.
↗Примерно ще е една идея по-интересно. Аа
↗тука искам да сменя възможните знаци,
↗които OCR ми дава. Ще ги сменя много.
↗Давам и червено, защото това S еш. Тоест
↗пак тука AI се опитва да ми го направи
↗по-трудно. Аа искам integerдър,
↗който не еш. Е ето това, нали? Връща ми
↗стойността, а защото не мога да напиша
↗такава голяма цифра в short. Така. Това
↗е променена библиотека. Сега, а
↗директно ще запазя модула, ще го кръстя
↗кракт. Сега направих нещо сравнително
↗лесно. Сейвна се в някои случай. Тука
↗може и да не сейвне, а по време на сейв
↗може да уточним ето тази човка, да
↗запазим размер на old stвалето. Това
↗обикновено, ако премахваме код, се
↗объркват реда на нещата. Сега тука това
↗трябва да го спра, защото ако пусна
↗билда, нали, ще ми замени въпросното
↗нещо. То гледам тука в някаква папка
↗build.
↗Сега нека да го пусна това нещо. Така.
↗Така. А това е спян. Това ще го пуснем.
↗Влизаме в нали порт 5000 и със сигурност
↗тука вече
↗някъде сбърках в цялото си това де. Може
↗би не го за А, да, естествено. Защо не
↗следите и не ми казвате къде имам
↗проблем?
↗А така.
↗Това е библиотеката от току-що. Вижда,
↗че е 57. Тоест
↗така вече замених истинската библиотека
↗с крак библиотеката и аа тука вече
↗работата ще се промени на тези знаци,
↗нали. Сега сбърках тука, че всъщност
↗библиотеката ми в сорс кода беше нещо
↗объркана с дефолтните стойности, но в
↗крайна сметка я промених и я заредихме
↗без да има проблеми. Така че а това се
↗получи по този начин. Нямам много време.
↗Надявам се да ви хареса. Offication не
↗струва за нищо. Може да си го дебъгваме.
↗Dnet spy поддържа и деbuger, тоест
↗закачваме към процес, дебъгваме без да
↗имаме source код. хубави линкове,
↗форматирането можете да си направите
↗една снимка или ще ви го дам. Квантум
↗DMS Oraclon и това съм аз. Благодаря ви
↗много.
↗У



