Лекция

Reverse Engineering на .NET код

Ради Атанасов (Лектор, съосновател на One Bit Software), Иво (представя лектора)

Лекция за обратно инженерство на .NET приложения — с декомпилатор (dnSpy) лекторът показва как се разглежда и променя компилиран код на чужда библиотека и демонстрира на живо кракване на лицензионен модел върху собствен продукт, тъй като други вендори са отказали. Началото е личен разказ за първите му стъпки в програмирането на BASIC и преписването на код от списания.

Кадърът е от сървъра на YouTube. Самият плейър — и всичко, което той зарежда — идва едва след като пуснете видеото.

Описание

🟪 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 и това съм аз. Благодаря ви

↗много.

↗У

← Всички лекции