background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE"

input logo icon
Обложка аудиозаписи
Подождите немного, мы готовим ссылки для удобного просмотра видео без рекламы и его скачивания.
console placeholder icon
Оглавление
|

Оглавление

0:00
Start
1:54
Download Ghidra
3:03
Ghidra Requirements/Setup
3:36
Download OpenJDK from Microsoft
4:49
Download OpenJDK from Amazon
6:15
Install OpenJDK from Microsoft
6:56
Install Ghidra
8:09
SmartScreen block
9:49
Ghidra first run, fix scaling, small font issue
11:36
ZIP file JDK (i.e., Amazon Corretto)
13:21
Run Ghidra, fix scaling issues (ZIP file JDK)
14:28
Install Visual Studio
15:09
Visual Studio initial startup
15:24
Create DemoApp project
16:16
Visual Studio quick test drive
17:33
Debug vs Release build intro
27:07
The DemoApp source, building, initial use.
30:50
Visual Studio binary hex editor
31:30
VSCode Hex Editor
33:37
Caution, do not edit the binary!
34:03
Create a Ghidra Project
37:39
The 'main' function
38:26
Initial analysis
39:39
The Luxury of Decompiling
41:06
Top-down not required
41:19
Lucky helpful strings
43:10
C++ Console Output
45:35
The binary is not the source code
46:57
Adding Labels
50:17
An adventure with levels
51:24
Secondary highlights
51:59
The art of names and more
53:00
STL string intro
58:16
Variable naming pt1
58:59
The operator != function
1:01:52
Le door de back
1:04:11
Another label
1:04:56
Add a comment
1:05:25
Fearless naming.
1:07:40
C++ Console Input
1:08:08
Removing secondary highlight
1:08:41
STL string, C-string, pointers pt1
1:12:49
Navigate to a function
1:13:50
Shortcuts==saved brain cycles
1:14:52
Function arguments pt1
1:16:10
Strings and pointers pt2
1:19:42
C++ this pointer
1:21:33
The purity of source code
1:22:35
Coach Ghidra, Reset/Recap
1:26:37
Strings/bytes and pointers pt3
1:32:27
Copying hex from Ghidra
1:34:28
Naming pt2
1:38:07
Top-down not required pt2
1:43:07
The 'for' loop
1:48:09
Decoding the_big_secret
1:57:11
Exiting the 'for' loop
1:58:56
The 'flag'
2:00:59
Fundamental Data Types (x86/x64)
2:02:33
Middle mouse button highlight
2:03:17
General Purpose CPU Registers
2:07:09
Register variables
2:08:43
Calling conventions
2:09:23
Return values in RAX
2:10:34
x64 Calling Conventions Summary
2:14:05
Rename register variable
2:16:21
Temp-saving RAX during other operations
2:21:00
Hiding symbols from Ghidra
2:23:41
Ghidra without symbols
2:27:43
Naming pt3: Use what works!
2:30:19
Release vs Debug w/symbols
2:34:07
Inlined functions
2:38:17
Rel vs Dbg: Decompile Window
2:43:30
Inline example
2:46:24
Finding, examining the _Myptr() function
2:51:00
_Buf vs _Ptr value
2:54:59
Disassembly Window, inviting coach Visual Studio to help
2:56:01
LEA instruction pt1
2:57:12
Register variables
2:57:26
Calling conventions pt3
2:58:35
Easy/Nuanced register variable naming
2:59:49
Renaming an existing register variable
3:01:00
Nuanced register variable renaming
3:01:19
Undo/Redo to observe changes
3:05:43
Processor Manual Setup
3:08:45
LEA instruction pt2
3:09:12
CMP instruction
3:10:27
CPU Flags, EFLAGS register
3:11:27
Ghidra and 'string' memory layout pt1
3:14:37
CPU Carry Flag (CF)
3:17:06
CMOVNC instruction, 'string' mem layout pt3
3:20:18
LEA/CMP/CMOVNC recap
3:22:20
MOV instruction
3:23:07
CMP instruction pt2
3:23:56
JNZ instruction
3:24:19
JNZ/JNE, JZ/JE instructions
3:25:25
LEA instruction pt3
3:25:52
Compiler as strategist
3:29:52
TEST instruction
3:32:29
Outro... Thank you! Happy reversing!
Теги видео
|

Теги видео

gidra tutorial
geedra tutorial
gidra sre tutorial
reverse engineering
gidra windows
gidorah
gidorah tutorial
geedorah
geedorah tutorial
nsa reverse engineering tool
gidraRun.bat does not work
gidraRun.bat blocked
gidraRun.bat
ghidraRun.bat not working
ghidraRun.bat smartscreen
ghidraRun.bat unblock
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
[Музыка]
00:00:20
счастливого месяца осведомленности о кибербезопасности
00:00:22
это видео представляет собой обучающее видео по гидре
00:00:25
если ты не знаешь, что такое гидра, то это
00:00:27
инструмент, который поможет вам реконструировать
00:00:30
двоичные файлы, двоичные файлы, означающие как Windows
00:00:32
программа, где у вас нет исходного кода
00:00:34
код, но у вас есть двоичный файл, и он позволяет
00:00:36
вы заглянете внутрь, как работает двоичный файл
00:00:38
даже если у вас нет исходного кода
00:00:40
и в этом есть немного искусства
00:00:41
этот маленький видеоурок не
00:00:43
собираюсь рассказать обо всем, это типа
00:00:45
над чем тебе нужно работать со временем
00:00:47
но даже если ты не планируешь над этим работать
00:00:48
со временем, но тебе это интересно
00:00:50
Я бы порекомендовал остаться здесь, если ты
00:00:52
у меня нет никакого опыта в этом, я бы
00:00:53
рекомендую тебе остаться, потому что я
00:00:55
собираюсь начать с чего-то очень
00:00:56
простое место, и даже если вы не получите
00:00:59
многое из этого, это нормально, это на самом деле
00:01:01
неплохо, если это произойдет, это чувство
00:01:04
никогда на самом деле не уходит, когда ты
00:01:06
изучать новый материал, даже если вы уже это сделали
00:01:08
это в течение десятилетий, многих, многих лет не
00:01:10
имеет значение, и вы привыкаете знать, как
00:01:13
ох, как приятно чувствовать эту двусмысленность
00:01:15
такой тип, ты знаешь, что это
00:01:16
потрясающе, это целая куча вещей
00:01:19
если ты привыкнешь к этому, ты можешь подойти
00:01:22
почти все и ничего не может попасть внутрь
00:01:24
по-твоему, вот что мы собираемся сделать
00:01:25
сделай это, чтобы я не волновался, если ты
00:01:27
знаю язык ассемблера, я бы не волновался
00:01:29
если вы знаете C и C++, потому что даже если
00:01:31
ты не знаешь таких вещей, это может быть
00:01:33
если ты видишь их впервые, возможно, ты
00:01:35
получить 10% от этого 50% от этого это хорошо, так что
00:01:39
есть все виды ценностей, которые можно получить
00:01:41
много разных уровней, поэтому я бы порекомендовал
00:01:43
если у тебя есть хотя бы малейшее
00:01:44
Интерес не пугайтесь этого
00:01:46
настройте свой ноутбук, давайте скачаем
00:01:48
гидра, давай займемся этим, посмотрим, что
00:01:49
это похоже на реверс-инжиниринг с помощью гидры
00:01:51
ладно со всем сказанным, давай
00:01:53
вникаем, ладно, поехали, мы в Windows
00:01:55
11 здесь, и мы собираемся запустить
00:01:58
браузер, и мы собираемся ввести
00:02:00
гидра мы пишем гидру обычно вверху
00:02:03
результат, но ты должен убедиться, что все идет
00:02:04
быть гидра гидра D s.org мы собираемся
00:02:08
нажать на это, и тогда мы собираемся
00:02:10
перейдите для загрузки на GitHub, и он принесет
00:02:13
нас на GitHub, и вы увидите
00:02:15
вверху здесь Агентство национальной безопасности
00:02:18
гидра теперь мы видим доступна версия 10.4
00:02:21
поэтому мы собираемся нажать здесь на почтовый индекс
00:02:22
файл, и он начнет загружаться
00:02:24
и пока идет загрузка, мы собираемся
00:02:25
нажать на этот хэш Shaw 256 и мы
00:02:29
собираемся пойти сюда, чтобы
00:02:31
папку загрузок, и мы скажем
00:02:34
откройте терминал, который мы собираемся поставить
00:02:36
небольшой символ комментария и вставьте
00:02:38
Шоу 256, там мы собираемся сделать
00:02:40
маленькая ЛС, и мы собираемся заняться сексом
00:02:43
хэш файла здесь, и мы собираемся
00:02:45
укажите zip файл и алгоритм
00:02:49
будет шоу 256 и мы хотим
00:02:52
увидеть совпадение между этим числом, которое
00:02:54
пришло с сайта и вот это
00:02:57
Powershell отлично рассчитал. Итак, мы
00:02:59
есть то, что кажется хорошей загрузкой
00:03:01
здесь очень хорошо, теперь есть парочка
00:03:04
все здесь, поэтому я хочу пойти и нажать
00:03:06
руководство по установке здесь, и я хочу
00:03:08
чтобы показать минимальные требования, сейчас я
00:03:09
собираюсь показать вам шаги, как
00:03:11
настройте все это и установите, так что не
00:03:12
беспокойся о том, чтобы прочитать все это прямо сейчас
00:03:14
окей, здесь вы можете видеть, что Java
00:03:17
jdk, который представляет собой комплект разработки Java,
00:03:19
требуется для запуска гидры, теперь есть
00:03:21
количество способов, с помощью которых можно получить
00:03:23
jdk, теперь один из способов — обратиться в Microsoft
00:03:26
и получить их jdk, для которого они создали
00:03:28
Пользователи Windows, но есть еще Amazon
00:03:30
четто, так что я собираюсь открыть это, эээ
00:03:33
веб-страница здесь, чтобы вы могли увидеть это
00:03:35
вот четто 17 и сейчас я собираюсь
00:03:37
также откройте это и скажите Windows 11 JDK
00:03:42
и мы видим, что у Oracle есть
00:03:45
верхняя ссылка здесь, а затем прямо под ней
00:03:47
есть сборка открытого jdk от Microsoft
00:03:50
теперь это один результат поиска для одного
00:03:51
поисковую систему, которую вы можете проверить и просто
00:03:53
убедитесь, что вы идете направо
00:03:55
места для всего этого, поэтому, если я нажму
00:03:57
на Microsoft-сборке открытого JD K
00:04:00
это приводит нас сюда, и мы можем просто щелкнуть
00:04:02
скачать, а затем мы попадем в Интернет
00:04:05
страница, на которой много разных загрузок, поэтому мы хотим открыть jdk 17 и
00:04:09
могу скачать здесь jdk 17, чтобы я мог
00:04:12
скачайте этот MSI, кстати, обратите внимание здесь
00:04:15
у них есть Шоу 256, так что мы действительно можем
00:04:17
проверь это, 256, так что я пойду
00:04:19
чтобы загрузить Shaw 256, нажав на
00:04:22
вот теперь давайте перейдем к этим загрузкам
00:04:24
папку еще раз и посмотрите, есть ли наши загрузки
00:04:25
они там, и они прямо здесь, я
00:04:27
собираюсь просмотреть этот файл и внутри него
00:04:30
содержит Shaw 256 для файла MSI
00:04:35
поэтому, если я получу хеш файла в MSI
00:04:38
файл правильный, давайте сделаем алгоритм Шоу
00:04:40
256 введите оба этих совпадения и я
00:04:44
думаю, мы собираемся скачать, эээ
00:04:45
Amazon cetto one тоже собираюсь
00:04:48
покажу тебе что-нибудь с обоими из них
00:04:49
вот сайт Cetto и вот
00:04:52
у них есть похожая вещь, вы можете видеть
00:04:53
вот 64-битная версия Windows MSI, я
00:04:57
собираюсь скачать zip-файл
00:04:58
ради этого, потому что я собираюсь показать тебе
00:04:59
как использовать zip-файл, который у них есть
00:05:01
проверьте Su md5, это другой хэш
00:05:04
алгоритм, но если у вас есть выбор
00:05:06
между md5 и sha 256 используйте Sha 256
00:05:09
тот, который является лучшим алгоритмом хеширования и
00:05:11
это то, что нам нужно, чтобы
00:05:14
проверьте zip-файл, который мы только что скачали
00:05:17
zip-файл, ну, это хеш Sha 256
00:05:19
для этого ZIP-файла этот ZIP-файл Amazon Credo
00:05:21
файл, так что мы перейдем сюда вот
00:05:23
Амазонское кретто, которое мы собираемся сделать
00:05:25
запустите то же самое, чтобы получить хеш файла
00:05:28
что за алгоритм Шоу 256 и можно
00:05:31
смотри, там 2А, а здесь 71
00:05:34
C2, и если вы пойдете сюда, вы увидите
00:05:36
там 71 С2 и 2 а72 и мы даже можем
00:05:39
проведи такую ​​же сравнительную проверку
00:05:42
поэтому я могу дважды щелкнуть и вставить его в
00:05:43
буфер обмена и вернитесь сюда и
00:05:46
сделайте crlf, и вы увидите, что это соответствует этому
00:05:48
100% все в порядке, давайте проверим наш
00:05:50
инвентарь здесь мы скачали гидру мы
00:05:52
скачали jdk от Microsoft и мы
00:05:55
скачали Amazon cetto jdk, теперь мы
00:05:58
не нужно было загружать 2 jdks, мы могли бы
00:06:00
только что скачал, но пойду
00:06:02
чтобы показать вам, как установить Microsoft и
00:06:04
мы собираемся запустить гидру с помощью
00:06:05
это и мы собираемся установить Amazon
00:06:07
cetto, и это использует zip-файл, поэтому
00:06:10
это немного другой набор установок
00:06:11
шаги, и мне просто хотелось пойти
00:06:13
над этим, чтобы вы могли как бы увидеть
00:06:14
два варианта, и тот, где вы
00:06:16
скачайте jdk от Microsoft, все, что вам нужно
00:06:19
сделайте двойной щелчок по MSI, который он предложит
00:06:21
вы вы нажимаете далее вы принимаете
00:06:23
лицензионное соглашение, если вы хотите сделать
00:06:24
уверен, что вы прочитали это полностью слово для
00:06:26
слово, затем еще раз нажмите «Далее» и нажмите
00:06:28
установите, вы получите приглашение UAC, которое
00:06:31
подсказка, в которой говорится, вы уверены, что это
00:06:32
зависит от вас, хотите ли вы нажать или
00:06:34
нет, я просто нажал на свой, я не вижу
00:06:36
проблема с этим при загрузке, которую я получаю
00:06:38
от Microsoft, но вам придется оценить
00:06:40
все, убедись, что все в порядке
00:06:42
просмотрите вещи и т. д., которые мы только что установили
00:06:44
Microsoft jdk, это замечательно и
00:06:46
на самом деле мы можем убедиться в этом, просто
00:06:48
открываем окно терминала и пишем
00:06:51
Java slel и версия SL и это
00:06:54
замечательно, все установлено, теперь все в порядке
00:06:57
давайте приготовим гидру вот так вот
00:06:58
мы собираемся сделать это мы собираемся
00:07:00
извлечь G
00:07:06
гидра, окей, гидру извлекли, вот это
00:07:09
был исходный zip-файл, и это
00:07:11
извлек его сюда, и вы заметили
00:07:13
здесь есть дополнительный уровень, а потом мы
00:07:15
иди сюда и вот гидра, так что мы
00:07:16
собираюсь избавиться от этого дополнительного уровня,
00:07:18
нажимаем crl X, чтобы вырезать, а затем приступаем
00:07:20
чтобы вставить это сюда, сейчас этот должен
00:07:23
быть пустым, и мы просто заходим туда, чтобы
00:07:24
убедитесь, что мы щелкаем по нему вверх, чтобы мы
00:07:27
можно зайти сюда и просто нажать «Удалить» и
00:07:29
вот это наша гидра, добытая гидра
00:07:31
папка в порядке, вместо запуска гидры
00:07:34
здесь, в загрузках, что я хочу сделать
00:07:37
скопировать все эти файлы в
00:07:40
демонстрационный каталог, в который я просто собираюсь
00:07:42
поставь на рабочий стол и я сделаю
00:07:43
crl X, чтобы вырезать, а затем мы пойдем
00:07:46
на рабочий стол и у меня есть демонстрационная папка
00:07:48
здесь пусто и я собираюсь
00:07:50
вставьте это сюда и всё будет
00:07:52
переместите все это сюда, чтобы, если я вернусь
00:07:54
для загрузок вы можете увидеть загрузки
00:07:56
пусто и все перенесено сюда
00:07:58
поэтому мы установили их Microsoft jdk
00:08:00
и мы можем увидеть это, добавив
00:08:02
удалить, позвольте мне просто добавить, удалить, так что
00:08:04
вы можете увидеть это прямо здесь, в добавлении
00:08:05
удалить установленный jdk и
00:08:08
мы извлекли гидру и побежали
00:08:10
гидра сначала прямо сейчас с Microsoft
00:08:12
jdk 17, мы можем пойти сюда и найти Гидру.
00:08:15
сделайте и дважды щелкните «О, Windows»
00:08:17
защитил ваш компьютер, окей, и что происходит
00:08:20
здесь хорошо, когда вы загружаете zip
00:08:22
файл с внешнего сайта и вы
00:08:24
извлеките его на локальный диск Windows
00:08:27
отслеживает эту информацию, и если она
00:08:29
обнаруживает там как пакетный файл или
00:08:31
это будет какой-то исполняемый файл
00:08:33
начните с блокировки этого
00:08:35
если только это не что-то, о чем он знает
00:08:38
хорошо, в этом случае запускай Windows
00:08:40
умный экран видимо не в курсе
00:08:44
этот файл G run.bat при запуске G
00:08:47
запустить.bat в первый раз у вас может не получиться
00:08:49
посмотри на это, у тебя может все начаться нормально, если
00:08:51
они меняют свой умный экран на
00:08:53
относительно этого одного командного файла, но в
00:08:56
в нашем случае нам нужно сделать дополнительный шаг
00:08:58
вот так нажмите кнопку «Не запускать, запустить»
00:09:00
Итак, вы идете, чтобы получить run.bat, щелкните правой кнопкой мыши
00:09:02
свойства и здесь вы увидите
00:09:04
разблокировать флажок сейчас, вы не хотите
00:09:07
без разбора щелкайте это на любом старом
00:09:09
скачайте то, что видите, или любой старый файл
00:09:12
обычно ты хочешь сделать это, когда знаешь
00:09:13
что ты делаешь сейчас в этом конкретном случае
00:09:15
если этот командный файл поступил от АНБ
00:09:18
из их репозитория GitHub, поэтому мы
00:09:22
иметь разумную уверенность в том, что это
00:09:24
тот же пакетный файл, который они создали, и
00:09:26
это часть гидры и все в этом роде
00:09:28
страховки, которую мы собираемся нажать
00:09:30
разблокировать, я просто пытаюсь указать
00:09:32
что вы не просто слепо щелкаете
00:09:34
разблокировать, когда умный экран скажет тебе привет
00:09:37
Я не собираюсь управлять этим делом, ты
00:09:38
в основном хочу провести должную осмотрительность
00:09:40
предпринять некоторые шаги, чтобы разобраться в том, что
00:09:42
этот исполняемый файл правильный?
00:09:45
это хороший и т. д. и т. п., в нашем случае
00:09:48
мы собираемся разблокировать его, мы собираемся
00:09:49
нажмите окей окей теперь давайте запустим гидру все
00:09:52
правильно, вы получите лицензионное соглашение здесь
00:09:54
и вы нажимаете «Я согласен» после тщательного
00:09:57
прочитав его и убедившись, что вы можете
00:09:58
соблюдайте это, и теперь вот гидра и
00:10:01
гидра бежит, теперь я что-то делаю
00:10:02
хочу сделать здесь, просто чтобы показать тебе
00:10:04
что-то, что может быть важно для
00:10:06
ты так, я уже сделал это на своем
00:10:08
система здесь, поэтому вы можете столкнуться
00:10:11
то же самое, и это масштабирование
00:10:13
проблема, поэтому, если вы заметили это на самом деле
00:10:14
выглядит довольно хорошо, мы можем видеть большую часть
00:10:16
эээ, персонажи и все такое, когда я
00:10:18
изначально установили, что они действительно были
00:10:21
маленький, так что пойдем сюда, я собираюсь
00:10:24
запусти гидру сейчас здесь дисплей 4К
00:10:27
эээ, я записываю это в формате 1080P, но если ты
00:10:30
обратите внимание, посмотрите, какой он маленький, и это
00:10:32
на самом деле слишком мал для анализа и
00:10:34
штука, она слишком маленькая, вот что я сделал
00:10:36
чтобы решить эту проблему, если вы столкнетесь с этим
00:10:38
итак, мы собираемся выйти из гидры, вот что
00:10:39
мы собираемся найти Java W
00:10:42
э-э, exe-файл, поэтому, если я скажу, где javaw.exe
00:10:47
ты видишь, что это прямо здесь, так что я пойду
00:10:50
на самом деле нажать я собираюсь сделать
00:10:52
Windows e, чтобы открыть проводник, я иду
00:10:55
вставить это в адрес Explorer
00:10:58
бар, а потом я пойду вниз
00:11:00
здесь и найдите Java W, и я собираюсь
00:11:03
щелкните правой кнопкой мыши Java W, я собираюсь сделать
00:11:05
свойства, а затем
00:11:07
совместимость и тут есть кое-что
00:11:09
изменить DPI, и это не было проверено
00:11:13
для меня так что раньше это не было отмечено и
00:11:16
затем используйте этот параметр, чтобы исправить масштабирование
00:11:18
проблемы для этой программы вместо
00:11:21
один в настройках, поэтому используйте этот параметр, чтобы
00:11:23
у нас есть настройки пользователя, вы можете открыть
00:11:25
расширенный блок масштабирования, я не собираюсь делать
00:11:27
это, ну, так что я просто щелкну
00:11:29
окей окей теперь когда мы пойдём бежать за гидрой
00:11:32
вы увидите, что он сильно масштабируется
00:11:37
лучше, если тебе интересно посмотреть
00:11:39
как использовать версию jdk в виде zip-файла
00:11:41
как Amazon Credo, давай, мы
00:11:43
собираюсь сделать это прямо сейчас, поэтому я пойду
00:11:44
выйти эээ гидра вот здесь я вообще-то
00:11:46
просто собираюсь удалить Microsoft jdk
00:11:48
Я собираюсь переустановить его, прежде чем мы получим
00:11:50
собираюсь после того, как сделаю амазонское кретто
00:11:53
один, ну, но сейчас я просто типа
00:11:55
хочу удалить его полностью сейчас вместе с ним
00:11:58
полностью удалено, попробую
00:11:59
запустить гидру гидра не может найти среду выполнения
00:12:02
как видишь, мы собираемся вернуться наверх
00:12:03
в папку demo, здесь мы собираемся
00:12:06
извлечь Amazon Cetto
00:12:08
здесь и, как вы можете видеть, у него есть
00:12:11
каталог с тем же именем, что и
00:12:13
zip-файл, а затем еще вот этот поменьше
00:12:15
один внутри, мы сделаем то же самое
00:12:16
то, что мы делали раньше: нажимали
00:12:18
это меньшее имя папки здесь и
00:12:20
мы собираемся перенести это на демо-версию, так что
00:12:22
Я собираюсь сделать, я сделал crl X там и
00:12:24
теперь я собираюсь сделать control+v, вот это
00:12:25
собираюсь переместить это отсюда, так что это
00:12:27
теперь пусто, мы можем вернуться сюда
00:12:30
нажмите «Удалить», и это исчезнет, ​​и теперь мы
00:12:32
создайте здесь эту красивую небольшую папку jdk
00:12:34
гидра просто требует от нас поставить
00:12:36
bin-файл на нашем пути, окей, я делаю
00:12:39
alt dtrl C, чтобы поместить это в буфер обмена
00:12:42
Я собираюсь зайти в меню «Пуск» и
00:12:44
введите «Редактировать» нажмите «Редактировать систему»
00:12:46
переменные среды, на которые я собираюсь нажать
00:12:48
по переменным среды дважды щелкните
00:12:50
путь, а затем мы добавим
00:12:52
вход в путь вот так нажмите
00:12:55
окей, кстати, если ты редактируешь
00:12:57
путь в диалоговом окне, которое выглядит
00:13:00
вот так, где это одна строка, ты
00:13:02
в основном хочу поставить точку с запятой после
00:13:05
последний путь, а затем вставляете
00:13:08
такой путь jdk прямо здесь, так что это
00:13:11
зависит от того, какой интерфейс вы используете для редактирования
00:13:13
путь, но если ты используешь это
00:13:15
какая-то причудливая чушь, вот она
00:13:17
вроде просто, можно просто дважды щелкнуть
00:13:19
и вставьте его прямо сюда, чтобы добавить его туда
00:13:21
хорошо с этой установленной переменной среды
00:13:23
мы собираемся пойти и запустить гидру, это
00:13:25
гидра, кстати, я говорил гидра
00:13:27
ты знаешь, я не знаю, я всегда забываю
00:13:29
я это называю гидра и вуаля это
00:13:32
просто гидра проще и быстрее требует
00:13:35
хотелось бы немного больше усилий в
00:13:36
произношение, так что простите меня за это
00:13:38
гедра гедра, ладно, ладно, если ты
00:13:42
у вас такая же проблема с масштабированием на Amazon
00:13:45
четто, ты действительно можешь пойти в мусорное ведро
00:13:47
папка здесь, как мы это делали с Microsoft
00:13:50
jdk, и вы можете щелкнуть правой кнопкой мыши и выбрать
00:13:53
свойства и
00:13:55
совместимость и изменение высокого разрешения и
00:13:58
у тебя это есть, и ты действительно можешь
00:13:59
см., быстро это уже установлено здесь
00:14:01
повторим, что мы сделали, мы скачали
00:14:03
гидра из репозитория АНБ на GitHub, мы
00:14:06
скачали два jdks не потому, что у нас были
00:14:08
но потому что мы продемонстрировали тот, который был
00:14:10
Microsoft, которая является установщиком MSI и
00:14:13
тот, который представляет собой ZIP-файл с Amazon
00:14:15
ketta, и мы только что сделали это, чтобы
00:14:17
демонстрация двух вариантов установки
00:14:20
один является установщиком MSI, другой
00:14:22
это что-то вроде портативного zip-файла, который
00:14:24
вы извлекаете и помещаете его туда, куда хотите
00:14:26
а потом у нас завелась гидра там
00:14:28
на самом деле еще одна вещь, которую мы хотим
00:14:30
иди сюда, и это Visual Studio
00:14:35
2022 год, так что перейдем к загрузкам, и я
00:14:38
собираюсь скачать версию сообщества
00:14:40
если у тебя есть другие, это нормально
00:14:42
это бесплатно, поэтому я просто собираюсь
00:14:45
использовать это
00:14:48
один, э-э, в данном конкретном случае мы действительно
00:14:51
нужна только настольная разработка
00:14:53
среда для C++, если вы хотите проверить
00:14:56
остальные в порядке и нажмите
00:14:59
установить, я перемотаю это вперед
00:15:01
чтобы нам не пришлось здесь сидеть
00:15:02
через
00:15:08
это нормально, когда Visual Studio сначала
00:15:11
запускается, вы можете нажать «пропустить это право»
00:15:13
сейчас или вы можете войти под своим
00:15:14
Учетная запись Microsoft, если вы предпочитаете, я
00:15:16
не собираюсь этого делать, я просто пойду
00:15:17
нажать, пропустить это, сейчас я собираюсь
00:15:19
выберите темную тему и визуальный
00:15:23
C++, поэтому после первоначального запуска, когда
00:15:26
вы запускаете Visual Studio, он начинает
00:15:28
нравится такой дисплей, и вы можете сказать
00:15:31
ты знаешь, создай новый проект для
00:15:33
пример и что для этого проекта
00:15:35
мы собираемся выбрать языки
00:15:37
Платформой C++ будет Windows.
00:15:40
выделите консольное приложение и нажмите
00:15:43
дальше теперь будет по умолчанию это
00:15:46
Каталог Repose, я собираюсь просмотреть
00:15:48
сюда, в демонстрационный каталог, куда я собираюсь
00:15:50
нажмите ALT d contrl c, чтобы скопировать эту папку
00:15:54
и я собираюсь открыть эту папку прямо сейчас
00:15:56
здесь, тогда я собираюсь сделать контра
00:15:58
выбери все демо-приложения и я пойду
00:16:01
нажать «Создать», и вы увидите, что я
00:16:03
создал здесь стандартное приложение, так что я
00:16:05
собираюсь вернуться сюда к нашей демо-версии
00:16:07
папку, и вы можете увидеть вот эту папку
00:16:09
и внутри здесь вот это
00:16:11
стандартное приложение, такое же, как
00:16:13
это демо-приложение. CPP, так что просто правда
00:16:16
быстро, если вы никогда не видели Visual Studio
00:16:18
раньше или вы никогда не программировали на C++
00:16:21
не волнуйся, так что смотри, что мы собираемся сделать
00:16:22
делай здесь, ну давай просто избавимся от всего
00:16:24
это ты можешь прочитать, если хочешь
00:16:25
или ты можешь оставить это там, это просто
00:16:27
прокомментируйте что-нибудь, что вы с маленьким SL
00:16:29
косая черта в качестве комментария, который мы как раз собираемся
00:16:31
удали все это, а потом то, что мы
00:16:32
собираюсь сделать это подняться сюда и мы
00:16:34
собираюсь сказать, что создадим решение, тогда мы
00:16:37
можно подняться сюда, и мы начнем без
00:16:39
отладка, и когда мы начнем это без
00:16:41
при отладке вы можете видеть, что он передает привет
00:16:43
мир прямо здесь, и это программа
00:16:45
это работает, поэтому мы можем нажать X там
00:16:47
отклонить это и просто показать тебе
00:16:50
вот такая программа 1 два 3 эээ и
00:16:53
затем я нажму contrl s, чтобы сохранить и запустить это
00:16:56
без отладки снова так себе начнем
00:16:58
без отладки, и он запустится и
00:17:00
вы можете видеть, что это наш маленький C++
00:17:03
программа, поэтому она дает вам немного
00:17:04
шаблонная программа C++, с которой нужно начать
00:17:06
вероятно, многие из вас использовали C++.
00:17:09
ты знаешь, но если нет, то все в порядке
00:17:11
и теперь ты почувствуешь небольшой вкус, Джу
00:17:13
Просто очень быстро, просто согласитесь с этим
00:17:14
если вы не знакомы с визуальным
00:17:16
студия, и ты не знакомый
00:17:17
с отладкой вы, конечно, могли бы
00:17:19
выполните эти шаги, и вы даже не
00:17:21
должны точно знать, что они делают, и
00:17:24
Я думаю, что иногда это отличный способ
00:17:26
научись, ну, знаешь, если захочешь
00:17:29
тогда тебе нельзя так пытаться
00:17:32
ты просто будешь мешать себе
00:17:33
очень важная коробка для нашего
00:17:35
обсуждение здесь будет таким
00:17:36
концепция сборки выпуска или отладки
00:17:39
построить сейчас, если я выпущу это в релиз и
00:17:42
создайте программу, и вы увидите вниз
00:17:44
вот это компилирует и компилирует
00:17:47
означает, что он принимает этот текст и это
00:17:50
превратив его в двоичный код, который
00:17:53
машина понимает, машина нет
00:17:56
понимаю, что процессор не может это запустить
00:17:59
напрямую, но когда мы скомпилируем это
00:18:02
компилятор, который вы можете видеть, работает
00:18:04
здесь превращает этот текст во что-то
00:18:07
что машина может понять, окей, так что
00:18:10
здесь есть концепция релиза
00:18:12
сборка и отладочная сборка, так что я в деле
00:18:14
выпусти, и я собираюсь его скомпилировать
00:18:16
как мы это делали для отладочной сборки, и я
00:18:18
в основном собираюсь запустить его, поэтому я собираюсь
00:18:19
сказать, начните без отладки, и вы
00:18:21
вижу что-то очень похожее, это почти
00:18:23
вроде нет разницы, но есть
00:18:24
разница, разница внутренняя
00:18:26
и ты этого не видишь, и мы собираемся
00:18:28
коснемся этого позже, так что это будет
00:18:30
стать важным, окей, этот выпуск
00:18:34
сборка и эта отладочная сборка, гм, это
00:18:36
две разные вещи, и я собираюсь
00:18:38
объяснить в общих чертах, почему важно
00:18:41
понимать эти нюансы, когда дело касается
00:18:43
реверс-инжиниринга и когда вы
00:18:45
приближаясь к двоичному файлу, это очень важно
00:18:47
чтобы быть в курсе этих вещей и
00:18:49
если тебе кажется, что я ошеломляю
00:18:51
бросаю все это на тебя прямо сейчас, просто
00:18:53
не волнуйся об этом, позволь этому чувству
00:18:55
подавлять, просто как бы отступить и
00:18:57
иди за тобой и наслаждайся тем, что ты полностью
00:18:59
смущает все правильно, потому что
00:19:01
в следующий раз ты пройдешь через все
00:19:03
тебя это будет немного меньше смущать
00:19:04
или еще что-то, и если вы эксперт и
00:19:06
ты здесь на высоте
00:19:08
эй, это здорово, у меня есть отладка
00:19:10
выбрано и я компилирую с помощью сборки
00:19:12
решение, чтобы я мог либо нажать F7, либо
00:19:15
выберите это, например, я нажму на
00:19:17
Клавиша F7 здесь, чтобы у нас было решение для сборки
00:19:20
правильно, так что если я прямо сейчас, нажав F7, я
00:19:22
только что построил отладочную сборку, если пойду и
00:19:24
выбираю выпуск и нажимаю F7, которую только что построил
00:19:27
релизная сборка, просто имейте в виду, что
00:19:29
когда ты что-то компилируешь, ты
00:19:30
поворачивая этот текст, который могут разработчики
00:19:33
понять в двоичном коде то, что большинство
00:19:35
разработчикам не придется иметь дело с
00:19:36
напрямую все время они обычно имеют дело
00:19:38
с логикой, выраженной в
00:19:41
язык, а не двоичный код, созданный
00:19:43
компилятор, если вы не используете гидру
00:19:45
и занимаюсь реверс-инжинирингом, в котором
00:19:47
случае, если вы действительно начнете беспокоиться о
00:19:48
двоичный формат, это то, что мы делаем
00:19:50
вот так, когда у вас есть отладочная сборка здесь
00:19:52
выбрано и вы компилируете программу
00:19:55
в двоичный исполняемый файл, вы вроде как
00:19:57
делаешь то же самое, что делаешь, когда
00:19:59
вы выбрали выпуск и вы
00:20:01
скомпилировать для создания двоичного исполняемого файла в
00:20:04
факт, если мы перейдем к демо-приложению, вы увидите
00:20:07
вот уведомление о выходной папке
00:20:09
две папки, это отладочная сборка и
00:20:13
это релизная сборка, поэтому в ней два
00:20:16
файлы в каждом, и вы только на самом деле
00:20:18
он нужен для запуска программы, которую мы собираемся
00:20:19
чтобы вникнуть в это, это своего рода
00:20:20
важная маленькая новость, так что начнем
00:20:22
с отладочной сборкой, поэтому отладочная сборка
00:20:24
есть демо-версия app.exe, это исполняемый файл
00:20:27
это двоичная EX-таблица, которой был exe
00:20:30
создано частично из этого текста, но там
00:20:33
были ли добавлены другие вещи и прочее
00:20:35
подготовьте его к запуску в рабочем режиме
00:20:37
система, pdb — это файл символов,
00:20:40
такие инструменты, как компилятор и есть
00:20:42
штука, называемая линкером, а мы нет
00:20:43
собираюсь вникнуть в это, просто подумай об этом
00:20:45
на самом деле это просто инструменты, которые принимают
00:20:48
текст программы на C++ и получается
00:20:51
это в формате e.exe, так что имейте в виду
00:20:53
есть такая вещь, как компилятор
00:20:55
штука под названием «линкер», есть еще что-то
00:20:57
инструменты, вам не о чем беспокоиться
00:20:58
это приходит со временем, и ты можешь
00:21:00
углубитесь в это, когда будете готовы, но в
00:21:02
на этот раз демо-приложение в порядке, это EXE-файл
00:21:06
двоичный файл, создаваемый компилятором
00:21:09
а компоновщик и PDB - это символ
00:21:12
файл, поэтому файл символов, что такое символ
00:21:14
файл, а файл символов — это файл, который
00:21:17
содержит информацию, которую разработчики могут
00:21:19
используйте для отладки EXE-файла, который использует отладчик
00:21:24
файл pdb, который отладчик использует
00:21:27
файл символов, он использует этот файл символов для
00:21:30
понять, как устроен этот двоичный файл
00:21:33
построен внутри, как это устроено
00:21:36
где расположены все переменные и
00:21:38
еще много чего сейчас, если ты пойдешь на релиз
00:21:40
построить, вы заметите, что есть
00:21:42
исполняемый файл, и есть PDB, который
00:21:44
вещь, которой ты управляешь, это то, что
00:21:46
отладчик использует PDB - это символ
00:21:49
файл, который отладчик использует для
00:21:51
понять, что такое макет или
00:21:54
расположение этого двоичного файла вы можете
00:21:56
почти думаю об упрощении F как о
00:21:58
карта, вы знаете, она дает вам представление о
00:22:01
земля, и если она у вас есть, если у вас есть
00:22:03
файл символов для exe, который у вас есть
00:22:05
небольшое преимущество в возможности выбирать
00:22:07
разобрать этот exe и понять, что делает
00:22:10
это тикает внутри, если у вас нет
00:22:12
файл символов, вы столкнулись с более жесткой
00:22:14
Задача и что я здесь делаю
00:22:16
в том, что когда люди используют такой инструмент, как
00:22:19
гидра перепроектирует то, что они из себя представляют
00:22:21
делать то, с чем они обычно сталкиваются, это
00:22:24
у них есть exe или двоичный файл, и они
00:22:27
у меня нет файла символов, но сегодня
00:22:30
мы собираемся начать и сделать наоборот
00:22:32
проектирование с исполняемым файлом отладки
00:22:35
и файл символов отладки, а затем мы
00:22:37
собираюсь посмотреть исполняемый файл релиза
00:22:40
и файл символов выпуска и
00:22:43
причина, по которой мы собираемся взглянуть на них
00:22:44
большую часть времени люди работают
00:22:47
в области кибербезопасности, и они делают
00:22:48
анализ вредоносного ПО или они ищут
00:22:51
ноль дней, ты знаешь, что иногда
00:22:52
исследователи безопасности пытаются
00:22:54
изучить двоичный код, который получает
00:22:55
создано, чтобы они могли понять, эй, ты
00:22:58
знаю, есть ли в этом опасность в этом
00:23:00
двоичный файл иногда, когда они это делают
00:23:02
у них нет файла символов, и я
00:23:04
говорят, что чаще всего они этого не делают, когда бы вы ни говорили
00:23:06
столкнулись с руководством или проблемой
00:23:08
для реверс-инжиниринга и они дают
00:23:10
ты - удобный маленький файл символов с большим количеством
00:23:12
приятных, легко читаемых вещей и прочего
00:23:14
вот так, когда загружаешь его в э-э
00:23:16
инструмент обратного инжиниринга, такой как гидра
00:23:18
они дают тебе своего рода роскошь
00:23:20
опыт, который вы знаете, когда люди
00:23:22
действительно займитесь реверс-инжинирингом, они
00:23:23
не всегда так роскошно
00:23:25
опыт, поэтому вы можете спросить их
00:23:26
ну какая разница между
00:23:28
выпуск и отладка, если они оба имеют
00:23:30
эти два файла не те два файла
00:23:32
то же самое для каждого, нет выпуска
00:23:34
версия на самом деле компилятор и
00:23:36
Компоновщик инструментов, которые создают этот exe
00:23:39
файл из этого текстового файла, читаемого человеком
00:23:42
что разработчики любят использовать этот C++
00:23:44
язык для написания кода, а затем
00:23:47
инструменты, когда компилятор и компоновщик
00:23:49
создайте exe, они могут создать его
00:23:50
разными способами и когда вы
00:23:52
создать релизную сборку вообще что
00:23:54
вы делаете, когда выбираете выпуск
00:23:56
вы сообщаете компилятору, что готовы
00:23:58
чтобы создать exe-файл, который вы собираетесь
00:24:00
отправьте пользователю, которому вы собираетесь
00:24:02
передать пользователю и компилятору и
00:24:03
Компоновщик обычно настроен для создания
00:24:06
exe, они собираются проводить больше времени
00:24:08
перевод этого в exe, потому что
00:24:12
компилятор и компоновщик собираются
00:24:13
ищите способы сделать это быстрее
00:24:16
эффективный, возможно, даже использует меньше памяти в
00:24:18
в некоторых случаях это все маленькие варианты
00:24:20
который можно выбрать перед отправкой
00:24:23
программное обеспечение бинарный исполняемый файл
00:24:25
установщик И т.д. и вообще говоря
00:24:28
обычно это исполняемые файлы, если они
00:24:31
скомпилирован и собран для выпуска, поэтому, если вы
00:24:34
выберите выпуск, и вы создадите и
00:24:37
создайте решение, и оно создаст это
00:24:39
исполняемый файл здесь, он собирается что-то сделать
00:24:41
дополнительная работа, чтобы сделать этот исполняемый файл большим
00:24:44
быстрее, что обычно означает выполнение некоторых
00:24:47
эзотерические вещи к инструкции по
00:24:51
процессор, который находится в этом двоичном файле
00:24:54
файл и причина, почему это важно
00:24:56
понять - это попытка
00:24:58
создание этого более эзотерического исполняемого файла
00:25:01
что обычно делается для создания
00:25:02
что-то, что работает быстрее
00:25:04
оптимизирован, потому что разработчики обычно
00:25:06
хочу, чтобы пользователь, который собирается запустить
00:25:08
программа, чтобы получить опыт, где
00:25:10
все происходит намного быстрее, этот код
00:25:13
в EXE обычно двоичный код
00:25:16
сложнее реконструировать больше
00:25:20
сложно перепроектировать, потому что
00:25:22
компилятор и компоновщик могут принять
00:25:24
Свобода удалять все, что не
00:25:27
необходимо сделать максимально оптимально
00:25:29
возможно машинный код, что я пытаюсь сделать
00:25:31
отметить, что двоичный файл отладки
00:25:34
exe, это обычно просторный
00:25:37
удобно, я использую здесь метафоры, чтобы
00:25:39
подчеркните, что имеется в виду exe-файл
00:25:41
для отладчика это может быть медленнее, чем
00:25:44
окончательная программа, потому что это не
00:25:46
выпустите сборку, чтобы она была в L
00:25:48
рука действительно прописала машину
00:25:51
инструкции из этого исходного кода, которые
00:25:54
это то, что вы называете читабельным для человека
00:25:56
текстовый код этот код C++ те машины
00:25:58
инструкции будут ближе
00:26:00
однонаправленное сопоставление, и я снова имею в виду это
00:26:02
как метафора Оно одно отображение из того, что
00:26:05
вы видите в исходном коде то, что вы
00:26:07
может видеть и воспринимать в двоичном формате
00:26:10
Дело в том, что когда ты собираешься
00:26:12
реконструировать исполняемый файл, и вы
00:26:15
иметь отладочную сборку исполняемого файла
00:26:18
вообще говоря, независимо от
00:26:20
платформа независимо от контекста
00:26:22
независимо от ОС, если вы наоборот
00:26:24
инженерное дело, ты знаешь все вещи
00:26:26
быть равным, если ты наоборот
00:26:28
разработать отладочную сборку чего-либо
00:26:30
тебе будет легче, чем
00:26:32
кто-то, кто должен реконструировать
00:26:35
сборка выпуска, потому что сборка выпуска
00:26:37
очень часто делают сумасшедшие хитрые вещи
00:26:40
в зависимости от оборудования, на которое они нацелены
00:26:42
и я преувеличиваю, когда говорю это
00:26:44
в зависимости от чьего-либо мастерства с
00:26:46
конкретную платформу, которую они могут не просматривать
00:26:48
это безумно сложно или типа того, но если
00:26:50
вы действительно сравниваете двоичный код отладки
00:26:53
с выпуском двоичного кода вы действительно можете
00:26:55
почувствуй разницу после того, как вникнешь в нее
00:26:56
и вы это сделаете, если продолжите использовать
00:26:58
гидра для просмотра исполняемых файлов и
00:27:01
поэкспериментировать, вы увидите
00:27:03
о чем я говорю и мы пойдем
00:27:05
чтобы ощутить это в этом уроке
00:27:07
и что нам сейчас нужно, это небольшой
00:27:10
часть программного обеспечения, небольшая программа, которая
00:27:12
мы собираемся строить, так что позвольте мне взять
00:27:15
пример программы, и я собираюсь скопировать и
00:27:17
вставьте его прямо сюда, этот образец
00:27:19
программа, можешь ли ты знать, если ты не знаешь
00:27:21
C++ это может показаться очень длинным, на самом деле я
00:27:24
буду медленно прокручивать вниз, чтобы вы
00:27:26
можешь увидеть это здесь и заморозить
00:27:28
видео, оно на самом деле не такое уж и длинное
00:27:30
ты знаешь, что можешь заморозить этот урок
00:27:32
и вы можете пойти в свою визуальную студию и
00:27:34
Я думаю, это будет полезно, если ты еще не сделал
00:27:36
любой C++, прежде чем вводить то, что вы видите
00:27:39
например, я повторяю строку
00:27:41
чуть выше, и вы можете просто ввести
00:27:44
то же самое, что вы видите на экране и
00:27:46
это будет хорошо, если вы не использовали C++
00:27:49
и вы не использовали Visual Studio, это будет
00:27:51
будет хорошим упражнением для вас, чтобы напечатать это
00:27:54
вещи и ознакомиться с
00:27:56
редактор, э-э, и пусть это будет соответствовать тому, что вы
00:27:59
см. здесь на экране, так что это очень
00:28:01
простая программа, она не такая уж и большая
00:28:03
в конце концов, там нет ничего
00:28:05
иначе здесь всего 53 строки
00:28:08
и в основном здесь есть кое-что
00:28:11
и он делает некоторые вещи, и мы собираемся
00:28:13
чтобы построить его, и мы собираемся запустить его
00:28:15
прямо сейчас и мы посмотрим на это
00:28:17
вместо изучения исходного кода
00:28:19
прямо сейчас, так что вы можете, если вы знаете C++, вы
00:28:21
могут изучить это большинство людей, которые, если
00:28:22
они профессионалы в C++, они уже знают
00:28:24
что я здесь делаю, и это очень распространено
00:28:26
когда у вас есть учебное пособие GE для людей
00:28:28
иметь какой-то исполняемый файл, и у него есть некоторые
00:28:31
пароль, и наша цель будет состоять в том, чтобы
00:28:33
разберись с этим, но вся хитрость здесь
00:28:34
обучение обычно проводится, когда вы
00:28:36
реверс-инжиниринг с помощью гидры только для вас
00:28:39
используйте двоичный файл, а не исходный код, поэтому
00:28:41
попробуй сделать вид, что у тебя этого нет
00:28:44
исходный код, введите его и создайте
00:28:47
решение здесь и когда вы это создадите
00:28:49
решение, я бы построил его для выпуска
00:28:52
и я бы также построил его для отладки, поэтому
00:28:54
обратите внимание, как там написано «отладка», и вы можете сделать
00:28:57
построить решение или вы можете просто сделать
00:28:58
пересобери решение, если хочешь, эээ
00:29:01
это тоже нормально, это просто заставит его
00:29:02
восстановить все, кроме только
00:29:05
вещи, которые так изменились, как если бы ты
00:29:06
выбирай строить, он строит только вещи
00:29:08
что изменилось, и ты восстанавливаешь его
00:29:10
перестраивает все, так что это своего рода
00:29:11
безопасный способ просто убедиться, что все в порядке
00:29:13
перестроить, так что в основном вы выберете отладку
00:29:15
и вы выберете решение для сборки или
00:29:17
перестроить решение, а затем вы выберете
00:29:20
выпустите, и вы выберете решение для сборки
00:29:22
или перестроить решение, выбирайте сами, давайте
00:29:24
не придавать большого значения инструментам и
00:29:26
идентификатор, кстати, Visual Studio является
00:29:29
IDE, ты знаешь, не делай, не делай
00:29:31
большое дело из всего этого, если ты
00:29:32
не знаком с этим, просто вроде как
00:29:34
через шаги, которые вы знаете
00:29:36
это действительно лучший способ, если ты
00:29:38
слишком задумайся об этом, ты сядешь
00:29:40
вокруг мысли, что ты не сможешь этого сделать и все такое
00:29:42
не делай этого, просто войди в это иди
00:29:44
по движениям все в порядке
00:29:46
итак, учитывая все вышесказанное, мы построили
00:29:48
это и вы можете увидеть здесь, они эээ
00:29:51
есть релиз и есть
00:29:52
отладка, так что давайте на самом деле откроем
00:29:56
терминал здесь, в этом окне, так что все, что я
00:29:57
я сделал это, я щелкнул здесь правой кнопкой мыши и я
00:29:59
выбрал открытый терминал, если ты типа
00:30:02
Windows 10, что ты можешь сделать, это э-э
00:30:04
Windows X, и вы можете выбрать терминал
00:30:07
а затем подойдите и сделайте Alt D, а затем
00:30:10
contrl C, а затем вы можете ввести CD и
00:30:12
ты пойдешь туда, так что это двое
00:30:14
разные способы добраться до одного и того же
00:30:16
вещь, но Windows 11 по умолчанию дает
00:30:18
ты этот маленький щелчок правой кнопкой мыши открываешь терминал
00:30:20
и поэтому я просто использую то, что это дает вам
00:30:22
небольшой терминал Powershell, окей
00:30:24
вот демо-приложение, чтобы мы могли просто попробовать
00:30:26
запустив демо-приложение, оно хочет получить полную информацию
00:30:28
имя пользователя Su, окей, и он передает привет Su
00:30:32
пользователь, надеюсь, у тебя будет отличный день
00:30:34
это довольно интересно, хм, это
00:30:37
ты знаешь, что я вообще-то вроде тебя
00:30:40
знаешь, это типа ты знаешь интересно
00:30:42
видеть, что ты знаешь, что я имею в виду, что это не так
00:30:44
действительно много делаю, так это выглядит
00:30:46
в этой программе больше ничего нет
00:30:48
ну, мы можем рассмотреть это подробнее сейчас
00:30:50
есть кое-что интересное, что ты можешь сделать
00:30:51
сделать, чтобы проверить такую ​​программу на предмет
00:30:53
пример, вы можете использовать Visual Studio
00:30:57
и ты можешь сказать здесь, открой файл и иди
00:31:01
до демо-приложения Лучшее демо-приложение
00:31:04
каталог, а затем зайдите, скажем, в
00:31:05
отладочная сборка, выберите exe, а затем включите
00:31:08
в открытом поле выберите «Открыть с помощью», а затем
00:31:11
вы можете спуститься и выбрать двоичный редактор
00:31:13
и мы не собираемся здесь много делать, я
00:31:15
просто хочу показать вам, что это двоичный файл
00:31:16
файл в необработанном формате, это шестнадцатеричный дамп или
00:31:19
двоичный дамп
00:31:21
исполняемый файл, так что вы можете своего рода
00:31:24
видишь, вот и все, так что мы мы
00:31:27
на самом деле не буду смотреть на это с
00:31:29
эта перспектива очень давно, поэтому я тоже
00:31:31
хочу показать вам, есть ли у вас код VSS, поэтому
00:31:34
если у тебя нет кода VSS, но ты
00:31:36
хочу установить его, на самом деле ты можешь
00:31:38
установите код VSS, поэтому я собираюсь
00:31:40
скачать код VSS, я как раз собираюсь
00:31:42
нажмите Windows, запустится загрузчик
00:31:44
вот, окей, я запущу эту загрузку
00:31:46
этот установщик, и я скажу, что
00:31:48
примите и нажмите «Далее», и все будет готово
00:31:50
установите это в папку по умолчанию, которую я
00:31:53
хотелось бы добавить это, поэтому вы добавляете это в
00:31:55
изучите опцию щелчка правой кнопкой мыши, чтобы
00:31:57
ты можешь делать там все, что захочешь, хм
00:31:59
мы просто собираемся сделать это, правда
00:32:00
быстро сюда, поэтому я просто хочу показать тебе
00:32:02
это еще один взгляд на
00:32:04
содержимое двоичного файла
00:32:05
файл, окей, мы собираемся запустить Visual
00:32:08
Студия в порядке, как только запустится код VSS, я
00:32:11
собираюсь пойти на рынок, я здесь
00:32:13
собираюсь ввести HEX и верхний результат
00:32:16
здесь будет один от Microsoft
00:32:18
называется шестнадцатеричным редактором, я собираюсь щелкнуть
00:32:20
установить и после завершения
00:32:22
установка, я собираюсь выйти из
00:32:25
что я собираюсь перетащить
00:32:28
демо-приложение, ты знаешь,
00:32:32
отладка сборки в коде Visual Studio и
00:32:35
тогда я все равно выберу открыть это
00:32:37
не хочет его открывать, потому что это
00:32:38
двоичный файл, и теперь я собираюсь выбрать
00:32:40
шестнадцатеричный редактор теперь мне об этом хорошо говорит
00:32:42
это не то, что ты катаешься на коньках, позволь мне
00:32:44
действительно сделай это, ты можешь увидеть здесь это
00:32:46
здесь не удалось зарегистрировать службу, эээ
00:32:49
Я думаю, это может быть потому, что это в
00:32:51
ограниченный режим, позвольте мне попробовать выйти
00:32:54
еще раз и на самом деле просто загружаюсь
00:32:57
этот
00:32:58
прямо открыто, о нет, окей, я думаю, это просто
00:33:02
нужна перезагрузка, так что я не буду
00:33:03
сам знаю, что там происходило на самом деле
00:33:05
Я не собираюсь останавливаться, чтобы посмотреть на это, верно?
00:33:06
сейчас, но в любом случае это другой способ
00:33:08
просматривая двоичные файлы, и вы можете
00:33:10
видишь, там много всего
00:33:12
вот там есть еще несколько утилит
00:33:13
вы можете запустить эти двоичные файлы, которые мы
00:33:15
на самом деле не буду вдаваться в это
00:33:16
сегодня, например, ты можешь бежать
00:33:18
утилиты для дампа строк внутри
00:33:21
исполняемые файлы и тому подобное, ага
00:33:23
мы просто собираемся придерживаться этого пути, я
00:33:24
просто хотел, чтобы ты получил пик
00:33:26
двоичный файл с точки зрения обоих
00:33:29
двоичный редактор для просмотра шестнадцатеричных файлов в
00:33:32
Visual Studio и аналогичная программа просмотра шестнадцатеричных файлов
00:33:35
Кстати, теперь двоичный редактор в коде VSS
00:33:37
во всех этих шагах мы просто не сделали
00:33:40
изменить исполняемый файл на самом деле то, что я
00:33:43
собираюсь сделать прямо сейчас, и ты сможешь сделать
00:33:45
это тоже на всякий случай иди сюда и
00:33:46
выберите перестроить все, пока вы находитесь внутри
00:33:48
режим выпуска, а затем перейдите к отладочной сборке
00:33:51
и выберите решение для восстановления и
00:33:53
причина в том, что если вы случайно измените
00:33:55
эти файлы, перестраивая их, будут
00:33:57
воссоздать их, чтобы они, по крайней мере, не были
00:34:00
сломаны, как если бы вы изменили их в
00:34:01
способ, который был бы сломан для нашей демо-версии
00:34:03
это было бы нехорошо, здесь у нас есть хм
00:34:05
эти файлы и то, что я хочу сделать, это
00:34:07
вообще-то вернись сюда, к демо-версии
00:34:10
и, как вы видели, я мог бы поздороваться со мной и
00:34:13
оно говорит: здравствуй, здравствуй, здравствуй, я надеюсь, ты
00:34:16
хорошего дня, поэтому мы даже не знаем
00:34:17
что с этим происходит, и что мы
00:34:18
собираемся сделать, это подняться сюда
00:34:20
и мы собираемся запустить гидру так что начните
00:34:22
вверх
00:34:24
гидра и я закрою отзыв
00:34:27
вот и я скажу новый проект
00:34:29
и мы собираемся сказать «необщий»
00:34:30
проект, и я назову это демо
00:34:33
приложение, э-э
00:34:35
почтительно, хорошо, и мы можем оставить это
00:34:40
хорошо расположен, ты знаешь, о чем я думаю
00:34:42
мы действительно можем держать это подальше от этого места?
00:34:46
так что я на самом деле буду
00:34:48
скажи, э-э, гидра
00:34:52
работай, и я положу это
00:34:55
здесь
00:34:57
а потом я нажму «прикончить тебя»
00:34:59
вижу, что он создал несколько файлов, которые он
00:35:01
буду оставаться там, и это любезно
00:35:03
полезно, если вы поставите G, если вы
00:35:05
не клади это, оно собирается положить это в
00:35:06
местоположение по умолчанию, и это нормально, вы можете
00:35:08
скопируйте материал оттуда, я положил его сюда, поэтому
00:35:10
поэтому мы знаем, где он находится, и мы
00:35:12
мог бы подтвердить это, знаешь, если сделаешь
00:35:14
много работы, и вы сэкономили много
00:35:15
работать на основе вашего реверс-инжиниринга и
00:35:17
ты хочешь поддержать это, ты можешь поддержать это
00:35:18
вплоть до USB-накопителя и тому подобного
00:35:20
окей, следующее, что мы хотим сделать, это
00:35:23
снова зайди в демо-приложение, начнем с
00:35:25
отладочная сборка, есть двоичный файл exe
00:35:28
а затем есть файл символов и
00:35:30
это такая карта или план, который
00:35:32
отладчик использует, чтобы знать о
00:35:35
внутренности двоичного файла прямо здесь
00:35:38
ну, Гидра знает, как их найти, если
00:35:41
они у вас есть поблизости, и они будут использовать
00:35:43
это если он найдет соответствующий PDB для
00:35:45
exe, он будет использовать его, чтобы показать вам
00:35:48
дела в дружеской манере в пределах своего
00:35:50
пользовательский интерфейс, поэтому мы просто собираемся
00:35:52
перетащите этот exe сюда, на этот узел и
00:35:55
автоматически запустится Pro
00:35:57
обрабатываю его, и он подскажет
00:35:59
нам сейчас мы собираемся выбрать все
00:36:00
настройки по умолчанию для этого портативного исполняемого файла
00:36:03
это имя этих двоичных файлов, которые
00:36:07
используются в Windows, в Linux вы увидите
00:36:10
термин эльф, у них есть файлы формата Elf
00:36:13
и есть файлы разных форматов
00:36:15
в зависимости от платформы и в зависимости
00:36:16
в контексте в Windows в целом
00:36:19
ты говоришь о портативном
00:36:21
исполняемый формат, поэтому у гидры есть
00:36:23
понял, что это портативный
00:36:25
исполняемый файл, и он просто спрашивает вас
00:36:27
чтобы подтвердить, и вы можете сказать, что он видит
00:36:29
что это маленький индеец, мы не пойдем
00:36:31
чтобы понять, что это значит, вот что
00:36:32
Ле означает и, э-э, 64 бита, и я собираюсь
00:36:36
вообще-то иди и просто щелкни
00:36:41
окей, и ты увидишь, как это обрабатывается
00:36:43
через кучу вещей
00:36:45
здесь, и как только оно запустится, ты это увидишь
00:36:48
показывает вам кучу информации это
00:36:50
может быть полезно, и на самом деле вы можете
00:36:51
получить доступ к этой информации даже после того, как вы
00:36:53
пройдите мимо этого диалогового окна, но прямо сейчас
00:36:55
мы просто нажмем окей окей окей
00:36:57
поэтому, если вы дважды щелкните по этому
00:36:59
исполняемый файл здесь, в проекте, он будет
00:37:01
выполнить действие по умолчанию, то есть открыть
00:37:04
включаем анализатор и дизассемблер и
00:37:06
все, что мы собираемся увидеть, это
00:37:07
вся магия гидры прямо сейчас, если я
00:37:09
дважды щелкните по нему, чтобы он запустился
00:37:11
некоторые люди называют это драконом
00:37:13
и он спрашивает нас, дракон спрашивает
00:37:15
нам, хочешь, хочешь, чтобы я проанализировал?
00:37:17
это мы скажем да, и так и будет
00:37:19
дайте нам несколько вариантов по умолчанию
00:37:21
это своего рода более продвинутая вещь и
00:37:22
еще много чего, прямо сейчас просто нажмите «проанализировать»
00:37:25
и это займет некоторое время и
00:37:26
он будет анализировать вещи, и ты сможешь
00:37:27
посмотрите статус немного здесь, в
00:37:30
Нижний правый
00:37:31
угол, окей, ты можешь увидеть
00:37:33
сводка автоанализа, содержащая некоторые
00:37:35
предупреждения и прочее, на что можно просто нажать
00:37:37
ладно, отбрось это, не волнуйся
00:37:38
это прямо сейчас я хочу вернуться к
00:37:41
программу C на секунду, и я хочу
00:37:43
отметьте, если помните, в этом маленьком
00:37:45
программа была основная программа и
00:37:48
вот там вообще основная программа
00:37:50
говоря на C и
00:37:52
C++ все начинается с основного
00:37:55
функция теперь, которая может измениться для
00:37:58
различные стили приложений, такие как
00:38:00
Приложение Windows Goey имеет главный выигрыш
00:38:04
функция, но это консоль
00:38:05
приложение, чтобы оно имело основную функцию
00:38:08
и Main имеют давнюю историю, поэтому Linux
00:38:10
использует Main и это похоже на C и C++
00:38:14
ладно, если мы вернемся к гедре
00:38:16
вы можете видеть, что это ставит вас на главную
00:38:19
функция, поэтому gedra в этом случае смогла
00:38:22
обнаружить основную функцию и ее
00:38:24
ставит вас туда в качестве отправной точки сейчас
00:38:27
Смена парадигмы заложена в вашей голове как
00:38:29
хотя у вас нет этого исходного кода
00:38:32
который вы использовали в Visual Studio для создания
00:38:34
этот двоичный файл притворяется, что у вас есть двоичный файл
00:38:36
exe, который мы загрузили здесь и это
00:38:39
pdb этот файл символов теперь с этим в
00:38:41
Имейте в виду, что у вас нет этого исходного кода, чтобы
00:38:44
пойди посмотри, есть ли у тебя этот исходный код
00:38:46
пойти посмотреть на тебя не было бы нужды
00:38:49
будь здесь, в гидре, гидра, извини, так что продолжай
00:38:52
иметь это в виду, и это отличный способ
00:38:54
научитесь не смотреть на исходный код и
00:38:57
посмотрим, сможешь ли ты разобраться в некоторых вещах
00:39:00
ищем в гедре, вот что мы
00:39:01
собираемся сделать сегодня, мы собираемся посмотреть
00:39:03
гедра здесь и тогда мы собираемся
00:39:04
вернемся немного к исходному коду
00:39:06
что мы собираемся сделать вначале
00:39:07
вот посмотрите, что здесь в гедре
00:39:10
а затем попробуй увидеть здесь кое-что
00:39:13
а затем мы вернемся к
00:39:14
командной строки, чтобы посмотреть, сможем ли мы это сделать
00:39:16
что-то в командной строке больше, чем
00:39:18
только то, что мы могли сделать раньше, если бы я
00:39:20
вернемся в командную строку, все, что мы знаем
00:39:22
прямо сейчас, если я напишу «Знаешь, привет, эээ»
00:39:25
Долг, я не знаю, как это пишется, но
00:39:27
привет, привет, Дьюти и это все, что он делает
00:39:29
кажется, что это ничего не делает
00:39:31
я не вижу текста помощи, это
00:39:32
не слушаю мой переключатель там, так что это
00:39:34
кажется, мало что делает, есть еще что-то, что нужно
00:39:37
этот исполняемый файл хорошо бросается в глаза
00:39:39
все в порядке, и что вы можете увидеть здесь
00:39:41
посмотри, что делает для нас Гедра, посмотри, что
00:39:43
да, у него нет исходного кода, окей
00:39:46
имейте это в виду, чтобы вы могли подумать
00:39:48
что этот код, который вы смотрите здесь, если
00:39:51
Я сделаю это окно больше, ты можешь
00:39:53
думаю, что этот код - это что-то
00:39:55
это выглядит очень сложно, и вы знаете
00:39:58
как бы то ни было, но это было давно
00:40:00
назад ну не так давно на самом деле где
00:40:02
инструменты, которые помогут вам повернуть вспять
00:40:04
инженер, гм, до gedra и до
00:40:07
некоторые другие инструменты, которые использовались для этого
00:40:09
для тебя тебе такого не подарили
00:40:11
разборки, которую вы видите здесь
00:40:13
на самом деле это похоже на декомпиляцию
00:40:15
назовите это дизассемблированием, это больше похоже на то, что
00:40:18
вы видите здесь, и мы поговорим об этом
00:40:20
условия, но здесь вы можете увидеть это
00:40:22
декомпиляция и то, что пытается сделать гидра
00:40:24
сделай так, что гидра делает в этом окне
00:40:27
вот он показывает вам лучший C++
00:40:31
код, который он умеет создавать без
00:40:34
имея исходный код, поэтому, если мы посмотрим
00:40:36
мы видим, что в нем есть кое-что
00:40:38
здесь происходит, и мы собираемся
00:40:40
изучите это прямо сейчас, когда мы войдем
00:40:42
здесь мы видим, что есть много
00:40:44
что-то происходит, но одно мы знаем
00:40:47
в том, что когда мы запускаем эту программу и я
00:40:50
напиши здесь типа привет Дьюти окей ну
00:40:54
мы знаем, что это побуждает нас
00:40:57
пожалуйста, введите свое полное имя, и мы знаем
00:40:59
что он отвечает типа «привет»
00:41:02
запятая и все, что ты набрал, и я
00:41:05
надеюсь, у тебя был отличный день, так что если мы пойдем
00:41:07
вот и знаешь иногда это не помогает
00:41:10
идти сверху вниз построчно, но просто получить
00:41:12
чувство к тебе, знаешь, сначала ты можешь
00:41:14
просто скажи, насколько это большое, и прокрути
00:41:16
до самого дна, и тогда ты можешь
00:41:17
просматривайте снизу вверх, так что если вы
00:41:19
посмотри здесь, там намного больше текста
00:41:21
вот посмотри, там какой-то текст
00:41:23
здесь больше никаких особенностей в этом нет
00:41:25
программа, ну, мы никогда не видели этот текст, так что
00:41:27
мы видим, что есть какой-то текст
00:41:29
вот что мы не сделали программу
00:41:32
вывод, так что это почти намекает, что, возможно,
00:41:34
в этой программе есть что-то еще
00:41:36
если ты пойдешь сюда, здесь написано, пожалуйста, сделай
00:41:39
расскажи мне секрет, ладно, это
00:41:41
это довольно интересно, потому что ты знаешь
00:41:44
Мне просто интересно, где это
00:41:46
это исходит из того, что мы этого не видели
00:41:48
когда мы запустили программу и увидели очень
00:41:50
хорошо, так что ты видишь, что тебе не обязательно
00:41:52
обязательно иди сверху вниз, но ты
00:41:54
можешь, поэтому я просто пытаюсь сказать, что ты можешь
00:41:55
может быть, сначала пробежишь и вроде как
00:41:57
поищите удобочитаемый текст, который может вам помочь
00:41:59
не вижу ничего во многих случаях, когда вы
00:42:01
занимаюсь реверс-инжинирингом, но есть
00:42:03
могут быть некоторые простые случаи, например
00:42:05
здесь вы начинаете видеть много
00:42:06
Подсказки сразу же, о боже мой, посмотри
00:42:08
здесь, я надеюсь, у тебя есть, я надеюсь
00:42:10
тебе хорошего дня, это мы, мы
00:42:12
узнай это, я надеюсь, у тебя есть
00:42:14
отличный день, о, посмотри, вот привет, есть
00:42:17
вот эта штука, которая здоровается, а потом что
00:42:19
скажи это здесь, чтобы мы вернулись
00:42:22
вот и посмотри на поведение
00:42:23
программа привет запятая, что бы мы ни набрали
00:42:27
и тогда я надеюсь, что у тебя будет отличный день
00:42:29
ну посмотри, что мы здесь нашли, у нас есть
00:42:31
здравствуй, запятая, а еще есть кое-что
00:42:33
обработка здесь и тогда, я надеюсь, это произойдет
00:42:36
хорошего тебе дня, что ж, выглядит это
00:42:38
как код, который создает этот ответ
00:42:41
что мы приближаемся к этому, давайте возьмем
00:42:43
посмотри на это повнимательнее, окей, это говорит привет
00:42:45
запятая, ну, мы знаем, что когда мы печатаем
00:42:48
демо-приложение, я могу ввести здесь что угодно, так что
00:42:51
все, что здесь напечатано, кажется, что это
00:42:54
штука здоровается и что бы я ни делал
00:42:56
набрал, а потом написано: «Надеюсь, ты»
00:42:58
хорошего дня, ну, кажется,
00:43:01
эта строка может что-то делать
00:43:06
это выводит все, что мы набрали
00:43:10
теперь на C++, если обратиться к исходному коду
00:43:14
здесь есть функция и особенность
00:43:17
где ты увидишь, посчитай, увидишь, что это
00:43:20
вывод консоли и любой текст, который
00:43:23
расположенные здесь, будут отправлены
00:43:26
окно терминала или на консоль, как
00:43:29
ты видел все, что я пытаюсь указать
00:43:32
Out - это счет и меньше, чем меньше, чем и
00:43:36
тогда строка — это способ отправки вывода
00:43:39
что пользователь увидит в терминале
00:43:41
так что, если мы вернемся к Гидре и мы
00:43:44
притворись, что у нас нет этого исходного кода
00:43:45
поэтому я просто обратился к исходному коду, чтобы
00:43:47
типа сообщить кому-то, кто не
00:43:49
знаком с C++ об одной особенности C++
00:43:53
но притворись, что ты знал это существо
00:43:56
быть знанием C++
00:43:58
разработчик, который делает реверс
00:44:00
инженерное дело, так что вы уже знали, что я
00:44:03
только что объяснял тебе это
00:44:04
потому что, возможно, ты новичок в этом, поэтому
00:44:06
часть урока, к которому мы перешли
00:44:08
это, но мы притворяемся, что это не так
00:44:10
иметь исходный код проблемы, которая
00:44:13
мы работаем с Гедрой, вот здесь
00:44:15
так что просто имейте это в виду
00:44:16
парадигмы очень важны, и пусть
00:44:18
твой разум знает эти вещи, поэтому ты можешь
00:44:20
максимизируйте то, как ваш ум будет тренироваться
00:44:22
и учитесь по мере прохождения этого урока
00:44:24
Итак, возвращаясь к этому, эта строка
00:44:27
вывод приветствия и этой графической строки
00:44:30
вот здесь выводится ну нет
00:44:33
строка, там есть только эта переменная
00:44:35
и эта переменная содержит строку
00:44:38
что мы набираем, я собираюсь вернуться
00:44:39
к этому через секунду я просто хочу пойти туда
00:44:41
следующая строка на самом деле вот эта строка
00:44:45
эээ, вывод этой строки прямо здесь, так что
00:44:48
вернемся к исходному коду
00:44:49
на всякий случай, как эта строка имеет
00:44:52
count и оператор вставки так меньше
00:44:55
чем меньше, чем есть вставка C++
00:44:57
оператор, и это способ, когда мы его используем
00:44:59
с C, мы можем использовать его по-разному
00:45:02
способы, но, вообще говоря, когда вы
00:45:03
используя его с чем-то вроде C, вы
00:45:05
рассказывать вещи справа, чтобы пойти
00:45:09
или вставить в материал слева
00:45:12
Итак, у вас есть консольный вывод, который похож на
00:45:15
объект, который может отправлять вещи в
00:45:17
терминал, чтобы пользователь мог их видеть и
00:45:19
вещи справа, которые в этом
00:45:21
случай. привет собираемся пойти на это
00:45:24
вещь, но обратите внимание, что это цепочка
00:45:26
вместе, чтобы у вас был оператор вставки
00:45:28
оператор вставки строки, а затем
00:45:31
переменная, где имя, а затем
00:45:33
оператор вставки, а затем остальная часть
00:45:35
обратите внимание на то, как распадается эта струна
00:45:37
это по трем разным линиям, когда
00:45:40
это показывает вам это, вы можете увидеть здесь это
00:45:42
вызывается оператор, и он
00:45:45
имеет здесь C ex ссылку права, и вы можете быть
00:45:49
интересно, почему бы просто не посчитать
00:45:51
помните, что компоновщик и компилятор делают
00:45:54
все эти модные вещи и то, что они
00:45:56
в конечном итоге создание на выходе может быть
00:45:59
более эзотерично, чем то, что вы видите
00:46:02
разработчик, если вы используете C++ напрямую
00:46:05
просто имейте это в виду, так что гидра - это просто
00:46:08
используя символы, которые были доступны в
00:46:10
этот файл символов, и эти символы могут
00:46:13
у них разные имена, а может и нет
00:46:15
точно соответствует тому, что было в оригинале
00:46:17
файл, потому что это часть функции
00:46:19
того, что делают компилятор и компоновщик
00:46:22
делают ли они определенные вещи, которые требуют
00:46:24
разные имена, так что иногда так и есть
00:46:27
как они сопоставляют вещи с тем, что
00:46:29
разработчик, которого вы знаете, использует и видит внутри
00:46:32
исходный файл, как они отображают эти вещи
00:46:34
для двоичного файла это может быть очень
00:46:36
разные по именам
00:46:38
б/у и тому подобное, просто оставьте это
00:46:40
в виду и заметить, что у них есть это
00:46:42
PB, э-э, VAR, и обратите внимание, как это получается
00:46:46
прикован к следующему звонку, так что ты
00:46:50
см. здесь передается PB VAR и PB
00:46:53
Здесь проходит VAR, мы не собираемся
00:46:54
чтобы вникнуть в подробности этого права
00:46:56
сейчас, потому что не важно, что я
00:46:58
хочу сосредоточиться на том, является ли эта переменная
00:47:01
видимо текст, который мы так набираем
00:47:04
что вы можете сделать в гидре, когда начнете
00:47:06
чтобы понять программу, вы можете
00:47:08
дайте переменным разумные имена, чтобы
00:47:11
если я нажму на эту локальную переменную
00:47:13
у этого какое-то забавное имя, и я
00:47:15
щелкните по нему правой кнопкой мыши, я могу переименовать его, э-э,
00:47:18
нажав на переименование переменной теперь один
00:47:20
Я бы порекомендовал обратить внимание на то, что
00:47:22
здесь есть персонаж по имени L, это
00:47:24
ускоритель и это ярлык
00:47:28
это позволит нам просто ввести букву L
00:47:30
и мы переименуем, так что позвольте мне просто
00:47:31
покажу вам, если я щелкну здесь правой кнопкой мыши и сделаю
00:47:33
переименовать Гидру покажет вам вот это поле
00:47:36
где его можно переименовать, я ударю
00:47:38
отмени, и я просто поставлю свой
00:47:39
курсор на переменную, и я собираюсь
00:47:42
нажмите клавишу L и появится то же самое окно
00:47:45
поэтому я рекомендую, когда вы учитесь
00:47:47
гедра, и ты хочешь стать быстрым в этом
00:47:49
поставь лайк и изучи сочетания клавиш, которые тебе нужны
00:47:51
щелкните правой кнопкой мыши по меню, если вы видите, что это такое
00:47:53
ты хочешь, чтобы в этом не было ничего плохого?
00:47:55
используя мышь и щелкая меню, но
00:47:57
если ты делал это довольно много и ты
00:47:59
хочу стать немного быстрее
00:48:01
в общем, посмотри в меню и посмотри, есть ли
00:48:03
есть ускоритель, ярлык для него
00:48:04
и если вы увидите там L, вы можете отклонить
00:48:07
меню и не используйте эту опцию в этом случае
00:48:09
это способ потренироваться, тогда иди
00:48:11
и выделите переменную и нажмите L
00:48:14
ключ, и вы можете поднять это, чтобы вы могли
00:48:16
в любом случае вы можете использовать меню, если
00:48:18
ты хочешь, но это хорошо
00:48:19
привыкаешь рано, и ты, наверное, уже
00:48:21
уже сделал это, если вы использовали какой-либо вид
00:48:23
фантазии, например, программное обеспечение для редактирования или
00:48:25
что-то, что вы, вероятно, узнали
00:48:27
ярлыки, и это очень распространено
00:48:28
техника, позволяющая кому-то зайти в меню
00:48:31
посмотрите, что это за ярлык, не используйте
00:48:34
меню, затем используйте ярлык, получив
00:48:37
ты знаешь, что после этого меню исчезнет
00:48:39
вы узнали, что такое ярлык и
00:48:40
тогда вы знаете, используйте ярлык и
00:48:42
это способ привыкнуть к использованию
00:48:44
ярлык, а не привыкание
00:48:46
к использованию меню, хорошо, поэтому мы собираемся
00:48:48
вызовите эту переменную, я собираюсь позвонить
00:48:50
эта переменная, э-э, имя, имя, я позвоню
00:48:54
это имя значение Val окей или имя мы можем
00:48:57
назови это имя Строка Я назову это имя
00:48:59
ценность, потому что если вы привыкли, если
00:49:00
вы новичок в C++, это принесет больше пользы
00:49:02
смысл для вас в этой переменной, поэтому, когда
00:49:05
Я, кстати, посмотри, что случилось, я
00:49:06
сейчас нажму кнопку отмены, посмотри сюда
00:49:09
здесь появляется значение имени, я
00:49:10
собираюсь нажать «Отменить» и посмотреть, как все прошло
00:49:13
вернитесь к старой переменной и обратите внимание, как
00:49:14
все они тоже были переименованы обратно, так что
00:49:16
это очень важная часть
00:49:18
повернуть вспять, когда вы начнете понимать
00:49:20
головоломка, это как головоломка, ты знаешь, когда
00:49:22
ты собираешь пазл и это очень
00:49:24
сложно, как эти тысячи штук
00:49:26
головоломки с мелкими деталями и
00:49:28
цвета очень эзотеричны, и вы
00:49:30
сложив это воедино, вы, возможно, имеете дело
00:49:32
с текущей водой в воде
00:49:34
фонтан, и это может быть очень трудно, ох
00:49:36
это сочетается с этим и этим, но тогда
00:49:37
ты начинаешь решать маленькие кусочки
00:49:39
головоломка, и она начинает катиться, как
00:49:41
снежный ком, и ты становишься все быстрее и быстрее
00:49:44
когда ты начнешь во всем разбираться, то же самое
00:49:46
проблема с логикой, если ты когда-нибудь сталкивался
00:49:47
решил те логические задачи, которые ты начинаешь решать
00:49:49
находить небольшие кусочки информации
00:49:51
и ты просто начинаешь где-то, где ты
00:49:52
может получить опору и на этой основе
00:49:54
ты идешь и понимаешь, типа, эй, ты
00:49:57
знаешь что что ты знаешь кто я
00:49:59
учусь по ходу дела, поэтому в данном случае мы
00:50:01
вполне уверен, что это значение имени
00:50:03
поэтому я собираюсь нажать клавишу L здесь и
00:50:06
Я сейчас назову это значение имени
00:50:08
прежде чем я нажму, введите уведомление здесь, где
00:50:11
та самая переменная вот здесь
00:50:13
и тут же заметьте, что это произойдет
00:50:15
изменить все, что ты видишь, на
00:50:18
выяснить, что один маленький кусочек
00:50:19
пазл, у нас есть еще несколько частей
00:50:21
понял, и это забавно
00:50:23
особенность реверса в том, что ты начинаешь
00:50:24
выясните этот мир и позвольте мне рассказать
00:50:26
ты я я когда-то захватывал флаг
00:50:29
эээ, не так давно это было у тебя
00:50:31
знаю, что это было, я бы не назвал это
00:50:34
самая сложная проблема с реверсом, но это заняло
00:50:36
время и усилия, чтобы пройти через это, потому что
00:50:38
там была загадка, которую нужно было разгадать
00:50:40
это было весело, но это было трудно, потому что
00:50:43
ну, потому что я хотел, чтобы ты знал, что тебе нужно
00:50:45
зайди в это и разберись в мелочах
00:50:47
и когда вы это поймете, это позволит
00:50:49
тебе нравится другой уровень, там есть
00:50:51
как уровни в реверсе это не так
00:50:54
это уровни, которые расположены
00:50:56
кто-либо в рамках официальной игры
00:50:58
они как бы подразумеваются по мере продвижения
00:51:00
в путешествии, и это почти как
00:51:02
ты в этом мире приключений, так что
00:51:04
в этом есть что-то вроде аспекта видеоигры
00:51:06
это на каком-то уровне или вы знаете, что это такое
00:51:08
эти М мм о РГ скользят, ты знаешь
00:51:12
маленькие текстовые приключения
00:51:14
прямо сейчас мы почти уверены, что это
00:51:16
дело в переменной имени, так что давайте посмотрим
00:51:19
внутри этой функции, в которой мы находимся, в которой
00:51:20
является основным, поэтому я прокрутлю обратно вверх
00:51:22
видишь, вот главное, пойдем посмотрим
00:51:25
где еще в этом значении имени функции
00:51:27
сейчас используется то, что мы можем сделать, это правильно
00:51:29
нажмите на значение имени, перейдите на второстепенный уровень
00:51:32
выделить и выбрать установить выделение и
00:51:34
он показывает нам практически все эти значения
00:51:37
теперь посмотри сюда, мы видим, что это STL
00:51:40
строка, поэтому, если вы не знакомы с C++
00:51:43
ты не будешь знать, что такое базовое
00:51:45
строка, но в принципе все, что вам нужно
00:51:47
знаю, что это переменная, которая может содержать
00:51:50
значение, такое как имя, слово или
00:51:53
предложение или огромный абзац, ну ты знаешь
00:51:56
нет предела, это зависит от суммы
00:51:58
память, которая у тебя есть сейчас, если мы вернемся к
00:52:00
исходный код теперь помните, что у вас нет
00:52:02
доступ к исходному коду, но сейчас я в
00:52:04
такой способ общения с людьми, которые
00:52:06
возможно, не знаю C++, поэтому мы подсматриваем
00:52:09
здесь, чтобы узнать немного о C++
00:52:11
но давайте представим, что остальное не так
00:52:13
живем, все в порядке, и мы идем сюда и мы
00:52:15
видите, есть такая вещь, как стандарт
00:52:17
строковое имя пользователя и это переменная
00:52:20
что мы сейчас смотрим туда
00:52:22
заметьте, там оно называется по-другому
00:52:24
почему там это называется значением и
00:52:26
здесь указано имя пользователя, а мы этого не делаем
00:52:27
иметь доступ к этому исходному коду только мы
00:52:29
иметь доступ к тому, что мы делаем в Гидре
00:52:31
так как люди, которые делают наоборот
00:52:33
инженерное дело там, в Гедре, мы приходим
00:52:35
имя можно придумать любое
00:52:37
имя, которое вы хотите, мы могли бы ввести
00:52:39
имя пользователя, но давай представим, что ты знаешь
00:52:40
у нас нет исходного кода, мы просто
00:52:42
придумываем имя, которое находим
00:52:44
полезно, поскольку люди делают наоборот
00:52:45
инженерия в гидре и это
00:52:47
то, что каждый человек, который учится
00:52:49
сделать реверс разработает свой собственный
00:52:51
немного искусства, стиля и способа наименования
00:52:54
вещи и обращение с вещами и и
00:52:57
ты ты сделаешь то же самое
00:52:59
вещь обратите внимание также, что это
00:53:01
просто строка здесь и сейчас STD строка
00:53:05
это означает стандартную строку, которая
00:53:07
строка из стандартной библиотеки в
00:53:10
C++ мы не будем вдаваться в подробности
00:53:12
просто помни, как ты мог бы
00:53:13
Определите целое число или плавающую точку
00:53:16
значение, вы также можете определить строки в
00:53:19
почти любой компьютерный язык, который у них есть
00:53:21
строки, и в C++ это ничем не отличается и
00:53:23
вы можете определить строки в числовом номере
00:53:25
различными способами с использованием стандарта
00:53:27
строка из стандартной библиотеки одна
00:53:29
и это очень простой способ работать
00:53:31
со струнами, так что обратите внимание, что это
00:53:34
называется базовой строкой, а не двоеточием STD двоеточием
00:53:38
строка, для этого есть причина и
00:53:39
это потому, что это ЗППП, я могу
00:53:42
на самом деле покажем вам очень быстро, если мы
00:53:43
поместил сюда курсор и нажал F12
00:53:46
клавиатура, в которую он меня перенесет
00:53:48
стандартную библиотеку и когда вы находитесь в
00:53:50
стандартная библиотека, посмотри, что это такое
00:53:52
показывает вам, что это показывает вам, что строка
00:53:55
на самом деле что-то, называемое базовой строкой и
00:53:58
это потому, что их больше одного
00:54:00
вид строки в стандартной библиотеке
00:54:02
но они все как бы справляются с этим
00:54:05
одна вещь, называемая базовой строкой, и это
00:54:08
связано с универсальностью, которую
00:54:10
стандартная библиотека дает вам, используя
00:54:12
функции C++, которые позволяют разработчикам
00:54:16
быть очень универсальными и как они создают
00:54:18
библиотеки, это довольно сложная тема
00:54:20
или промежуточная тема, это что-то
00:54:21
что вы узнаете больше, используя C++, поэтому
00:54:24
не волнуйся об этом так сильно, если ты
00:54:26
не инициировал с C++, просто попробуйте
00:54:28
за все, что ты получишь, проходя через это
00:54:30
это так, что я собираюсь нажать на контроль и
00:54:32
минус, чтобы вернуться к исходному коду
00:54:35
это просто что-то в Visual Studio
00:54:37
вы можете нажать F12, чтобы пойти куда-нибудь и
00:54:40
нажмите кнопку «минус», чтобы вернуться к другому
00:54:42
среды редактора будут иметь схожие
00:54:44
вещи, но это может быть по-другому
00:54:46
нажатия клавиш и даже Visual Studio могут быть
00:54:48
настроен с разными нажатиями клавиш, поэтому
00:54:49
просто имейте в виду, что по умолчанию
00:54:51
это F12 и контроль минус, ок, возвращаемся назад
00:54:54
Гидре сейчас мы надеваем шляпу
00:54:56
занимаемся реверс-инжинирингом, и мы
00:54:58
назвал эту переменную значением имени, которое мы имеем
00:55:00
никогда не заглядывал в этот исходный код, потому что мы
00:55:02
у меня нет к нему доступа и вот почему
00:55:04
мы сейчас в гедре, разве нет
00:55:06
есть доступ к нему, но мы хотим выяснить
00:55:08
как работает двоичный файл, есть
00:55:10
кто-то, у кого есть этот исходный код и
00:55:12
они создали двоичный файл, который у нас есть, и мы
00:55:15
хочу выяснить, как работает этот двоичный файл
00:55:18
что заставляет это работать, что происходит внутри
00:55:19
там это может быть не заметно на
00:55:22
поверхность, когда мы используем двоичный код, потому что, когда
00:55:24
мы используем его из командной строки, как вы
00:55:26
видел, что это просто распечатывается как привет
00:55:29
что бы вы ни вводили, но мы меняем местами
00:55:31
прямо сейчас в гедре, и мы видим, что есть
00:55:33
что-то, может быть, что-то немного
00:55:35
здесь происходит еще больше, поэтому мы в основном видим
00:55:38
что эта строка, называемая значением имени,
00:55:41
используется во многих разных местах
00:55:44
вот и мы можем обойти это штрафом
00:55:46
зубная расческа, но я бы предпочел сделать это
00:55:48
давайте искать простые вещи, которые мы
00:55:50
см. здесь в командной строке, так что
00:55:52
первое, что он отображает, это пожалуйста
00:55:55
пожалуйста, введите свое полное имя, давайте побежим
00:55:57
это еще раз верно, пожалуйста, введите свой полный
00:55:59
имя, так что давай пойдем сюда, к Гедре и
00:56:02
давайте поищем этот колодец, вот
00:56:03
то, что говорит, пожалуйста, введите свой полный
00:56:05
назови и посмотрим, что происходит с
00:56:07
ну, если вы посмотрите, это делает
00:56:10
он делает то же самое здесь с
00:56:13
ок, ну, это звонит C, и пока это
00:56:16
выглядит забавно по сравнению с тем, что мы видим в
00:56:19
исходный код помнит две вещи:
00:56:21
исходный код и то, что находится в двоичном формате
00:56:23
будут разными, потому что
00:56:24
компилятор в компоновщике и у нас нет
00:56:27
доступ к исходному коду, все, что у нас есть, это
00:56:28
что в двоичном формате и однако гедра
00:56:30
можешь представить это нам, и Гедра это сделает
00:56:32
представлять его нам все лучше и лучше, поскольку мы
00:56:35
дайте ему больше информации, когда мы выберем
00:56:37
разобрать головоломку, как мы уже поняли
00:56:39
выведи это имя, чтобы Гидра могла использовать это имя
00:56:41
и это позволяет нам легко проявлять доброту
00:56:43
из вас знаете, продолжайте идти вперед, и что
00:56:45
мы видим здесь вот эта штука
00:56:47
результаты, пожалуйста, введите свое полное имя и
00:56:51
затем посмотрите на следующую строку, в которой есть
00:56:53
вот такая штука, ой, я не имел в виду
00:56:56
на самом деле пойти на линию, ну, я пошел
00:57:00
вперед, нажав двойной щелчок, если
00:57:02
ты попал в аварию, ты можешь пойти в
00:57:04
клавиша со стрелкой вверх, чтобы вернуться назад, но в
00:57:06
дух обучения ярлыки посмотрите на
00:57:08
подсказка там подсказка говорит alt
00:57:11
влево, чтобы вернуться назад, поэтому давайте щелкнем влево
00:57:13
Стрелка первый раз и мы в итоге
00:57:15
возвращаясь к этой основной программе
00:57:18
getline здесь, давайте дважды щелкнем по нему
00:57:20
снова мы идем, чтобы получить линию, вот и все
00:57:22
библиотечная функция, которая читает знак из
00:57:25
терминал от пользователя, который собирается
00:57:27
чтобы ввести его в терминале и вместо этого
00:57:29
нажав левую кнопку, мы здесь
00:57:31
собираюсь пойти на альтернативу и влево Стрелка, окей, альтернатива
00:57:34
и стрелка влево вернет нас назад
00:57:37
то, что я только что сделал, есть способ
00:57:39
размышляя над тем, какой ярлык
00:57:41
вот так вот getline и посмотри что
00:57:44
getline выполняет getline передает
00:57:47
эта переменная называется значением имени, поэтому она
00:57:50
похоже, он спрашивает терминал, эй
00:57:52
дайте мне что-нибудь, что напечатает пользователь и
00:57:55
он помещает это в имя переменной
00:57:58
значение, которое является стандартной строкой C++ и
00:58:02
тогда что он делает после этого, о боже
00:58:04
Господи, посмотри на следующей строке есть
00:58:07
что-то очень интересное дальше
00:58:09
линия, теперь помните, что у нас нет
00:58:11
исходный код прямо сейчас у вас может быть
00:58:13
добрался до исходного кода и уже
00:58:14
видел это, но давай представим, что мы
00:58:16
сделал это не так хорошо, посмотри, что
00:58:17
здесь происходит что-то здесь
00:58:19
называется B, теперь это обычная практика в C
00:58:23
и C++ не везде, но во многих
00:58:26
разные области, где ты знаешь типа
00:58:29
некоторые компании могут сделать это или
00:58:31
определенные виды проектов с открытым исходным кодом
00:58:33
проекты, это зависит от проекта и
00:58:35
еще много чего, но это обычная практика в
00:58:37
определенные круги для префикса переменной
00:58:39
имя с маленькой буквы b, как в
00:58:42
Логическое значение, если переменная является логическим значением
00:58:44
значение, поэтому обратите внимание, что здесь говорится, что b var1 равно
00:58:48
что-то, и мы займемся этим позже
00:58:49
во-вторых, что такое bvar one, ну bvar one
00:58:53
это какая-то булева переменная, что
00:58:56
он делает здесь, он говорит, что мы видим
00:58:59
вот здесь есть вещь, которая называется
00:59:01
оператор не равен, поэтому в
00:59:04
C++, давайте вернемся к исходному коду
00:59:07
но помните, что у нас нет источника
00:59:08
код, к которому мы просто вернемся
00:59:09
узнать о C++ очень быстро на C++
00:59:13
есть оператор не равно
00:59:15
что является восклицательным знаком, что означает
00:59:18
если имя пользователя не равно этой строке
00:59:22
вот тогда иди и делай то, что здесь, другие
00:59:24
разумно, если оно равно этой строке
00:59:28
не буду делать то, что здесь, оно пропустит
00:59:30
это и продолжай здесь, поехали
00:59:32
назад сюда, мы видим, что вот оно
00:59:35
установка barar для результата оператора
00:59:39
не равно значению имени, которое
00:59:43
строка, это довольно сложно, если ты
00:59:44
не знаю C++, это может быть сложно
00:59:47
понимаю это, но когда ты проверяешь
00:59:49
для равенства или не равно с
00:59:52
Строка C++, в конечном итоге она фактически вызывает
00:59:55
функция для выполнения операций
00:59:57
необходимо определить, является ли что-то
01:00:00
равно или не равно, что здесь происходит
01:00:03
эта функция называется оператором, а не
01:00:06
равный называется с двумя
01:00:08
параметры один параметр, который называется
01:00:10
операнд — это значение имени, которое является
01:00:13
переменная, содержащая текст, который вы
01:00:15
введите на терминале или пользователю
01:00:18
другая строка — это интересная строка
01:00:20
есть текст, в котором написано: «Дебаты Л Лора»
01:00:24
это интересно, я вижу слово назад
01:00:27
и дверь, это заставляет меня думать о задней двери, ох
01:00:29
дверь задней двери, могло ли это быть
01:00:32
черный ход, я думаю, это может быть черный ход
01:00:34
дверь, давай посмотрим внимательно и что
01:00:36
здесь происходит, когда оператор не равен
01:00:39
вызывается с этими двумя значениями, а эти
01:00:41
это два операнда, один операнд находится на одном
01:00:44
сторона знака не равно, а другая
01:00:47
один на другой стороне, один на
01:00:49
правая сторона, одна находится на левой стороне и
01:00:51
в основном это говорит о том, что значение имени не
01:00:54
равно равно Лору Дьяку, если это
01:00:57
не равен Лору Деаку, это правда, поэтому, если
01:01:02
это значение не равно этому значению
01:01:05
это было бы правдой или единицей, если бы это
01:01:08
значение равно этому значению, но
01:01:12
оператор не является оператором равенства, поэтому не
01:01:14
Равный хочет видеть то, чего нет
01:01:17
равно, чтобы быть правдой, поэтому для не равно
01:01:19
оператор, если они оба идентичны, это
01:01:21
будет ложным, поэтому переменная
01:01:25
B VAR получает единицу за истину, если эти два
01:01:30
значения не равны друг другу, это
01:01:32
получает истину, если они равны каждому
01:01:35
другое или если вы введете по команде
01:01:37
линия Лор де тогда будет Б
01:01:41
ноль или ложь, что ж, мы попробуем
01:01:44
это так сразу мы видим этого Лора
01:01:47
назад Я хочу попробовать ввести это на
01:01:48
командной строке, мы собираемся сделать это в
01:01:49
во-вторых, но что здесь произойдет, если B хорошо
01:01:52
давай попробуем, вообще-то, давай попробуем напечатать
01:01:54
это пойдем сюда
01:01:57
Лор
01:02:00
Дьяк, там написано очень хорошо, пожалуйста, скажи
01:02:05
для меня секрет, ты хорошо там
01:02:07
это было что-то большее в этом исполняемом файле
01:02:09
делаю больше, чем просто хочу рассказать нам
01:02:11
провести хороший день, это действительно хорошо
01:02:13
реверс-инжиниринг, это может быть
01:02:14
здесь что-то происходит, я не знаю, эээ
01:02:16
мы возвращаемся сюда и что
01:02:18
Это происходит, когда мы набираем Лор
01:02:21
черт возьми, мы вернемся, очень хорошо, пожалуйста, сделай
01:02:23
расскажи мне секрет, ладно, давай
01:02:26
посмотри, что здесь происходит, где мы
01:02:28
ясно, что мы видим здесь, я надеюсь, что у тебя было
01:02:31
отличный день, здравствуйте, значение имени, надеюсь, вы
01:02:34
был отличный день, когда это произойдет
01:02:37
это происходит, если B в C++, если у вас есть
01:02:42
утверждение if, и вы говорите, если и
01:02:44
что-то ненулевое, например единица
01:02:47
что верно, если вы скажете, если и a
01:02:49
ненулевое значение, это то же самое, что
01:02:52
говоря, если это правда, то сделай что-нибудь
01:02:55
иначе ты не сделаешь этого, так что
01:02:57
это все равно, что сказать, если барар один или
01:03:00
если барар ненулевой, и это будет
01:03:04
ненулевое значение, если значение, введенное
01:03:07
пользователь не равен Лору Деаку и
01:03:11
честно говоря, это соответствует тому, что мы видим в
01:03:13
поведение приложения, потому что если
01:03:16
если оно не равно Лор-де-бэку,
01:03:18
вещь просто говорит привет, имя, значение, надежда
01:03:21
у тебя отличный день, и это говорит
01:03:24
прощай и все, все кончено
01:03:26
после этого мы действительно сможем увидеть
01:03:28
что если barar не равен нулю, сделайте это и
01:03:32
тогда есть оператор else, теперь это
01:03:34
выражение else — это то, что произойдет, если barar
01:03:36
неверно, давайте пропустим это на секунду
01:03:39
и иди сюда вниз, так что мы идем
01:03:41
спуститься сюда и сейчас, это L
01:03:43
утверждение является частью того, что происходит в
01:03:45
этот оператор L, поэтому он вложен, поэтому мы
01:03:47
собираюсь пропустить все это, и если ты пойдешь
01:03:49
внизу, вы просто заметите это
01:03:51
выходит, так что происходит, если B VAR есть
01:03:54
true означает, что значение имени не равно
01:03:58
D Лор deac, если если имя значение, если вещь
01:04:02
что пользователь вводит сейчас, кстати
01:04:05
кое-что мы можем сделать здесь, посмотрите, что мы
01:04:07
здесь могут сделать большинство дизассемблеров, эээ
01:04:09
инструменты реверс-инжиниринга помогут
01:04:11
ты делаешь это, мы этому хорошо учимся
01:04:14
B, прежде всего, в основном говорит, что если
01:04:16
это не то же самое, что задняя дверь, так что
01:04:18
Я собираюсь переименовать эту переменную, чтобы
01:04:21
забыл, что это за ярлык, так что я
01:04:23
Щелкните правой кнопкой мыши, о, переименуйте переменную, это L, так что
01:04:26
Я собираюсь закрыть меню, я собираюсь
01:04:28
чтобы выделить B, и я собираюсь ввести
01:04:31
Я и я оставим Б там на некоторое время
01:04:33
Логическое значение, но я назову его
01:04:35
что-то, что имеет больше смысла, и я
01:04:37
собираюсь я позвоню этому Б нет
01:04:42
задняя дверь, потому что там написано, если это так
01:04:44
тогда не равна строке задней двери
01:04:46
установите для этой переменной значение true, чтобы это было верно
01:04:48
Я перейду к этой переменной, я собираюсь
01:04:50
позвони сюда Б, это не черный ход, окей и
01:04:53
теперь это даже делает немного больше
01:04:55
смысл теперь, чтобы ты мог поставить курсор
01:04:57
в начале этого оператора if
01:04:59
что мы теперь понимаем, и вы можете
01:05:01
щелкните правой кнопкой мыши, и вы увидите здесь, что вы
01:05:03
можно оставить предварительный комментарий и в пред-
01:05:05
комментарий можно оставить любой человекочитаемый
01:05:07
текст, который можно сказать, если пользователь этого не сделал
01:05:10
введите строку задней двери точка точка точка
01:05:14
смысл перейти к этому оператору if здесь
01:05:17
и теперь у тебя появится симпатичный маленький человечек
01:05:19
читаемая вещь, которая показывает, что вы знаете
01:05:22
какой в ​​этом человеческий смысл
01:05:24
это и как вы реконструируете вещи
01:05:26
вы начнете добавлять все больше и больше вещей
01:05:28
вот так, и ты разработаешь свой собственный
01:05:30
система того, как вы называете переменные, когда
01:05:32
вы решаете оставлять комментарии и прочее
01:05:34
большую часть времени, когда я еду задним ходом
01:05:36
что-то, как только я мало узнаю
01:05:37
факты о мелочах я начну
01:05:39
называние вещей и еще кое-что о
01:05:41
реверс - это не бойтесь называть
01:05:43
то, с чего я очень часто начинаю
01:05:45
имена, которые имеют лучшее значение, которое я
01:05:47
может догадаться, что такое значение или переменная
01:05:50
значит, и тогда я, возможно, пойму позже
01:05:52
ох, это не то и не то
01:05:55
на самом деле это так, я вернусь и переименую
01:05:57
что-то, что имело бы больше смысла, и вы увидите
01:05:59
это итеративное искусство обратного хода
01:06:01
по крайней мере частично это представление о тебе
01:06:04
называйте вещи, которые вы понимаете
01:06:05
головоломка, подумай о той головоломке, о которой мы говорили
01:06:07
о том, где вы расположите части и
01:06:09
вы можете расположить определенные цвета поверх
01:06:10
вот и это, а потом ты узнаешь позже, ох
01:06:12
нет нет это гора и это
01:06:14
поле я думал это гора
01:06:16
раньше, но это цвет, который я смешивал
01:06:18
вот и вся эта штука
01:06:20
придумывать вещи и упорядочивать вещи
01:06:22
а затем вернуться и переставить и
01:06:24
это как повторяющаяся вещь, и что теперь
01:06:26
мы очень ждем вот чего
01:06:28
случается, если это задняя дверь справа
01:06:30
ну, потому что мы видим, что что-то произошло
01:06:32
вот эта штука хочет секрета
01:06:34
от нас, ну давай я просто напишу по секрету
01:06:37
и пишет, что код не найден, есть
01:06:40
в этой программе больше нет функций, спасибо
01:06:43
тебе, что зашёл и желаю тебе приятного времяпрепровождения
01:06:46
день сейчас восклицание э-э авторское право
01:06:49
братское учреждение зарегистрировано, если
01:06:52
есть что-то такое, что это нет
01:06:54
отношение, которое должно быть шуточным
01:06:55
смешно, ха-ха, вот и все, окей
01:06:59
хорошо, и что нам теперь делать?
01:07:01
пойдем посмотрим
01:07:04
посмотрим, что здесь произошло, ну, мы вошли
01:07:07
в этом очевидном
01:07:09
бэкдорная строка, и там сказано очень хорошо
01:07:13
и он хотел хорошо знать секрет
01:07:15
давай просто пойдём сюда, где написано "ты"
01:07:17
знаю, что это не черный ход, и тогда это
01:07:19
один выходит, мы это уже знаем, поэтому идем
01:07:21
здесь еще здесь и давайте рассмотрим
01:07:24
давайте рассмотрим эту часть Эла здесь
01:07:26
потому что именно здесь кажется, что некоторые
01:07:28
мясо и картофель имели место или если
01:07:30
ты веган, ты знаешь тофу и хм
01:07:33
обжаренная спаржа, это очень хорошо
01:07:36
а потом он говорит: расскажи мне секрет
01:07:38
ну, это довольно интересно и
01:07:40
кажется, я ввожу здесь данные
01:07:44
это sin cin, который является консольным вводом
01:07:48
вспомни тех, кто отправляет вещи
01:07:51
консоль - это консоль, но грех
01:07:55
принимает что-то и это
01:07:57
на самом деле связано с строкой get, поэтому
01:07:59
вызывается строка get, и она
01:08:01
кажется, выкладываю результат
01:08:03
все, что пользователь вводит в это
01:08:05
кстати, переменная называется Local 1 190
01:08:09
мы действительно можем удалить наш вторичный
01:08:11
выделите, чтобы мы могли удалить это право
01:08:13
сейчас, потому что нам это действительно не нужно
01:08:14
один на имя прямо сейчас, так что здесь написано
01:08:17
пожалуйста, расскажи мне секрет, ты и
01:08:19
он выполняет строку получения в эту переменную
01:08:21
так что ты знаешь, что я собираюсь сделать, и я
01:08:23
думаю, стоит переименовать переменную так
01:08:26
Я скажу, чтобы я переименовал местный
01:08:28
переменная L для локального адреса, поэтому давайте вызовем
01:08:31
этот
01:08:32
секрет
01:08:35
строка, окей, потому что мы это вроде как знаем
01:08:38
это ты знаешь, вот в чем секрет
01:08:40
заходим из getline и что происходит
01:08:42
с этим потом ну, есть
01:08:45
функцию для строки и давайте поместим нашу
01:08:47
мы изучаем C++, давайте вернемся к
01:08:50
исходный код теперь помните, что мы не
01:08:51
есть доступ к исходному коду, мы идем сюда
01:08:53
просто чтобы узнать что-нибудь о чем-то
01:08:54
C++ очень быстро эту функцию вот так
01:08:56
вот секретная строка и вот это
01:08:59
это функция для строки C++, которая будет
01:09:03
вернуть что-то, называемое указателем, и
01:09:05
этот указатель воспринимается как значение
01:09:09
это адрес, где находится строка
01:09:12
находится в памяти и вместе с тем
01:09:15
адресный код или функции могут фактически
01:09:18
обработать эту строку, поэтому, если пользователь
01:09:21
будет предложено ввести секрет и пользователю
01:09:23
наберите типа «привет» или «секретно» типа
01:09:26
мы только что набрали, так что поехали, поехали
01:09:28
здесь, так что если вы напишете здесь секретно
01:09:31
правильно, в это входит строковый секрет
01:09:34
переменная, называемая секретом пользователя, а также
01:09:36
люди, занимающиеся реверс-инжинирингом
01:09:38
хм, мы не знаем, что это имя
01:09:40
переменной, но мы вроде как
01:09:41
делая вывод, что просто потому, что там
01:09:43
кажется, здесь есть черный ход и это
01:09:46
черный ход, кажется, дает нам возможность
01:09:47
войти в секрет, который в конечном итоге попадает в
01:09:50
эта переменная обратите внимание, как эта переменная
01:09:52
тогда ты знаешь, что знаешь этот секрет
01:09:54
у него есть вызов C, который возвращает
01:09:58
указатель, так что это аналогично этому так
01:10:01
просто имейте это в виду, потому что я хочу
01:10:03
показать вам, что этот указатель — это компьютер
01:10:05
VAR, чтобы этот ПК VAR в конечном итоге получил
01:10:09
результат того, что cter возвращает so cter
01:10:13
возвращает что-то здесь, на что мы смотрим
01:10:15
исходный код, который, как мы знаем, передается
01:10:17
этой функции в качестве аргумента, но с
01:10:20
нашу шляпу реверс-инжиниринга и
01:10:21
без исходного кода мы не знаем
01:10:23
вот так давай вернемся сюда и посмотрим
01:10:24
как мы можем увидеть это со стороны гедры
01:10:26
вещей со стороны гедры
01:10:28
у тебя есть цистерна, которая действительно возвращает это
01:10:31
значение указателя и помещение его в pcar
01:10:33
и мы действительно можем назвать это
01:10:36
указатель на секретную строку, назовем это так
01:10:38
поэтому я собираюсь нажать L и собираюсь
01:10:40
введите указатель секретной строки и
01:10:44
способ думать о том, что ты хорошо знаешь, что такое
01:10:46
разница между секретной строкой и
01:10:49
указатель, разве они не являются одновременно строкой и
01:10:51
типа того, но мы могли бы в равной степени мы могли бы
01:10:54
написали этот код по-другому, где
01:10:56
мы бы передали эту строку, э-э, это
01:10:59
эту секретную строку прямо в
01:11:01
эта функция, но в некоторых случаях есть
01:11:03
код, который использует что-то под названием A C
01:11:05
строка, думайте о строке C как о простом
01:11:07
простое числовое значение, имеющее адрес
01:11:11
внутри секретной строки, где находится фактическое
01:11:14
физические данные, представляющие строку
01:11:17
ты существует, если наберешь привет 123
01:11:19
привет 123 находится внутри этой штуки, которая
01:11:23
является секретной строкой. Теперь секретная строка представляет собой
01:11:25
экземпляр строковой переменной и так
01:11:28
это объект и в нем больше мяса
01:11:32
и картофель, да, там больше тофу и
01:11:35
собаки-вегетарианцы, да, там есть еще что-нибудь
01:11:37
другими словами, это происходит
01:11:39
больше функциональности с с с секретом
01:11:41
строка, ты можешь сделать гораздо больше вещей, которые ты можешь
01:11:42
можешь ли ты выполнить специальный поиск, ты можешь
01:11:45
используйте алгоритмы, это очень любезно
01:11:47
надежного объекта, э-э, секрет
01:11:50
Строковый указатель — это просто значение, которое мы
01:11:53
спросить спросили мы спросили секретную строку
01:11:56
эй, дай нам адрес внутри себя
01:12:00
где физические символы
01:12:02
строка существует, мы не хотим этого делать
01:12:04
что-нибудь еще, нам просто нужно это число
01:12:06
там есть адрес, потому что мы собираемся
01:12:08
сделать что-нибудь с этим персонажем
01:12:10
строка, и остальные нам не нужны
01:12:12
нам не нужна секретная строка и все такое
01:12:14
причудливые вещи, которые ты можешь сделать, мы просто хотим этого
01:12:16
номер с тем адресом, где что
01:12:19
текст находится в памяти компьютера
01:12:22
окей, секретный указатель строки, все в порядке, эээ
01:12:24
Итак, у нас есть это значение указателя, которое
01:12:26
адрес и то, что происходит, ну, есть
01:12:28
функция, которую мы здесь вызываем, называется get
01:12:30
код и то, что происходит, чтобы получить
01:12:33
хорошо закодируйте этот номер, э-э, местоположение
01:12:35
секретная строка, если вы меняете направление
01:12:37
и ты сталкиваешься с этим, ты действительно
01:12:38
волнуюсь, что происходит внутри, получи
01:12:41
код и, кстати, получить код имеет
01:12:43
что-то, что оно возвращает, мы не делаем
01:12:44
действительно знаю, что это вернет, я думаю
01:12:46
он возвращает какой-то код, но
01:12:48
мы еще не знаем, я скажу тебе, что что
01:12:51
ты можешь сделать это поместить сюда курсор
01:12:52
и вы можете нажать клавишу ввода и
01:12:54
когда ты это сделаешь, ты прыгнешь на
01:12:56
эта функция, давай повторим что-нибудь
01:12:58
здесь помни, прежде чем мы вернулись
01:13:00
откуда мы пришли, как мы это сделали
01:13:02
ну, если забудешь, поищи здесь
01:13:04
панель инструментов, и вы увидите стрелку назад
01:13:06
и эта стрелка назад означает переход к предыдущему
01:13:08
местоположение, но у него также есть ускоритель
01:13:11
Alt и влево, чтобы мы могли нажать на это
01:13:14
кнопку на панели инструментов, и мы вернемся к
01:13:16
где мы были, давайте наведем курсор
01:13:18
что это уже есть, и нажимаем Enter, и мы
01:13:20
перепрыгнем в это место, воспользуемся alt
01:13:23
в и Стрелка влево alt Стрелка влево
01:13:27
мы возвращаемся в это место, и у нас есть
01:13:30
введите, чтобы уйти, ой, введите что-нибудь
01:13:35
произошло здесь, окей, я не ставил
01:13:37
курсор на предмет, поэтому мы ставим курсор
01:13:38
здесь и нажмите Enter, теперь мы идем alt
01:13:42
и оставил стрелку, чтобы вернуться, и вы можете пройти мимо
01:13:44
кстати, вы можете дважды щелкнуть и вы
01:13:46
перейти к месту alt Стрелка влево идти
01:13:49
назад, почему это важная часть
01:13:52
Реверс - это научиться ориентироваться
01:13:54
вокруг, и иногда у тебя бывает корявый
01:13:56
куча переменных происходит в твоей голове
01:13:58
о боже мой, ты все переворачиваешь
01:14:00
различные разделы и пытаемся свести
01:14:02
вещи вместе, да, это другое
01:14:04
из более простых случаев мы вроде как
01:14:05
сейчас разбираюсь с простым делом
01:14:06
у тебя все это происходит в твоем
01:14:08
голова, и ты как будто знаешь, что тебе нужно
01:14:10
передвигайтесь alt влево введите нажмите L
01:14:13
переименуй переменную, оставь это, что ты, ты
01:14:16
не хочу тратить свои мозговые циклы
01:14:18
которые действуют так, как будто ваш мозг
01:14:21
вроде DDR 3000 или что-то в этом роде
01:14:23
Я это правильно придумал, я знаю, что есть
01:14:25
нет DDR 3000, так что это DDR5, я прав
01:14:27
забегаю далеко вперед, потому что человеческий мозг
01:14:29
да, но это так, как будто мы
01:14:31
все время освежает, как и мы, мы
01:14:33
не хочу, чтобы многие вещи отвлекали
01:14:35
мы, у нас есть все эти переменные, и мы
01:14:36
пытаюсь решить проблему правильно и так
01:14:38
вот это реверс-инжиниринг
01:14:40
инструменты, которые они пытаются дать вам все это
01:14:42
вещи, где ты просто касаешься клавиши
01:14:43
ты прикасаешься к этому, ты делаешь то, и это происходит
01:14:45
это для тебя, да, это не похоже на тебя
01:14:47
не могу использовать меню или что-то еще, но
01:14:48
просто имейте это в виду, что вы хотите быть
01:14:49
умеем ориентироваться, поэтому мы идем
01:14:51
чтобы навести курсор мыши на то, что мы
01:14:52
нажмем Enter, мы прыгнем
01:14:54
к этой функции, давайте посмотрим на это
01:14:55
функция, что это такое, хорошо посмотри, Пэм один
01:14:59
гедра мог только придумать что-то вроде
01:15:01
интересно, знаешь, вроде как
01:15:03
название для нее называется коляска, прямо как
01:15:05
вроде получается что-то такое
01:15:07
вы знаете, это несколько читабельно для человека, но
01:15:09
это еще не имеет логического смысла
01:15:10
но мы уже знаем, что к этому относится
01:15:12
пойдем, альтернативная стрелка влево и вернемся назад
01:15:14
да, о, извини, мне нужно быть здесь, в
01:15:17
это окно, я думаю, а затем нажимаю все
01:15:18
Стрелка влево, окей, отлично, так что это такое?
01:15:20
мы хорошо передаем указатель на секретную строку
01:15:23
угадай, что я на самом деле собираюсь сделать
01:15:25
скопируйте это ОК, Ctrl C, все в порядке, сейчас
01:15:28
Я собираюсь поместить курсор туда и нажать
01:15:29
войдите, чтобы перейти сюда, я собираюсь
01:15:31
подчеркни, что я собираюсь нажать L
01:15:33
потому что я знаю, что это произойдет
01:15:34
переименуйте Пэм, я собираюсь вставить
01:15:36
то же имя, потому что я хочу назвать его
01:15:38
то же самое в этой функции, бум, как
01:15:40
эти две секунды, это больше, чем
01:15:42
две секунды, потому что я говорю, но когда
01:15:44
ты работаешь над чем-то, ты ты
01:15:45
все будет хорошо, это секрет
01:15:46
строка, ты знаешь, окей, и что происходит
01:15:48
в
01:15:50
здесь все в порядке, ну, ну, есть
01:15:55
что-то называемое большим
01:15:58
секрет, ладно, эй, ребята, осталось несколько часов
01:16:00
позже, и мне нужно было немного получить
01:16:03
отдыха, поэтому мы продолжим здесь, так что
01:16:05
прости, если что-то выглядит не так
01:16:06
другое, но это через несколько часов
01:16:08
и вот и все, я просто хотел
01:16:09
упомяните об этом, хорошо, поэтому мы переименовали это
01:16:11
к указателю секретной строки или PTR и
01:16:14
это указатель по уходу, э-э, мы
01:16:17
собираюсь объяснить кое-что из этого в
01:16:19
второй здесь, хорошо, давайте попробуем
01:16:21
понять, что здесь происходит, поэтому мы
01:16:22
знайте, что это параметр
01:16:24
передается в эту функцию, это
01:16:26
адрес, указывающий на первый
01:16:28
персонаж с этого адреса вы не можете
01:16:30
добраться только до этого первого персонажа, но вы
01:16:32
можно перейти к следующему и следующему
01:16:34
и следующий, так что позвольте мне на самом деле
01:16:35
давай почему бы нам не записать это на доске
01:16:37
очень быстро, окей, вот где это
01:16:39
функция вызывается, и она вызывается с
01:16:42
секретный указатель строки и помните об этом
01:16:44
Указатель секретной строки поступает из
01:16:47
базовая строка или стандартная строка C++
01:16:51
который был назван секретной строкой и что
01:16:54
содержит строку um, которую пользователь
01:16:57
входит по команде Лин, все в порядке, так что
01:16:59
давайте вернемся к командной строке, давайте
01:17:00
запусти это, и мы введем Лора Дика, что
01:17:05
дает нам доступ к задней двери и теперь
01:17:08
там написано, пожалуйста, расскажи мне секрет, так что если
01:17:10
Я говорю, что моя догадка верна, просто m YG SS и
01:17:16
Я нажимаю Enter, окей, и что происходит, когда я
01:17:19
напиши, думаю, давай раскроем секрет
01:17:22
строка и давайте перенесем ее в
01:17:24
наша маленькая доска для блокнота, вот и мы
01:17:26
собираемся подняться сюда и собираемся
01:17:28
ухватить секрет
01:17:30
строка, так что по сути это строка C++
01:17:34
когда я делаю предположение, это почти
01:17:36
как будто мы назначаем две секретные строки
01:17:40
строка, я думаю, так что это
01:17:42
линия прямо здесь, на самом деле, почему бы нам не
01:17:44
просто возьми эту строку и давай поместим
01:17:46
это прямо здесь, так что это строка
01:17:48
разборка, которая показывает, что мы
01:17:51
использование строки get, чтобы взять что-то из
01:17:53
консольный ввод и он ставится
01:17:56
в секретную строку, когда мы входим в мою
01:17:59
думаю, в конечном итоге это будет назначено вот так
01:18:02
почти в каком-то смысле да, ну что
01:18:04
на самом деле происходит, когда я печатаю
01:18:06
персонаж, которым является этот персонаж
01:18:08
получил от консоли IO что
01:18:10
действительно происходит, если я набираю символ
01:18:12
как M, который принимается консолью
01:18:15
и этот персонаж попадает в
01:18:17
буфер, а затем приходит следующий символ
01:18:19
и это попадает в буфер, но
01:18:21
после всего этого я нажимаю Enter
01:18:23
это как если бы конечный результат был таким, как будто
01:18:26
строка, которой, как я предполагаю, будет назначена
01:18:29
секретная строка, окей, достаточно просто, так что
01:18:31
крайний правый, и тогда следующее, что мы
01:18:34
смотри, вот это следующее, что мы сделаем
01:18:37
посмотрим, произойдет ли это, и я просто принесу
01:18:39
это тоже здесь, окей, и что
01:18:41
здесь происходит это указатель
01:18:44
значение, которое присваивается
01:18:46
результат вызова ccore St на объекте
01:18:51
секретная строка, так что это аналогично
01:18:54
Код C++, который вы знаете, как будто я должен был сделать
01:18:57
это почти похоже на
01:18:59
делаю это прямо здесь, окей, в общем
01:19:02
но если вы посмотрите на обычный код C,
01:19:06
как это выглядит в двоичном формате, когда
01:19:08
ты смотришь на ты знаешь, когда ты
01:19:09
смотрю на это с помощью такого инструмента, как Геа, эээ
01:19:11
то, что ты увидишь, это нечто большее
01:19:13
низкоуровневое представление вещей, поэтому
01:19:15
ты увидишь вещи более свежими
01:19:17
формат, в котором это будет не совсем
01:19:20
выглядеть как код, и это потому, что это
01:19:23
используя, может быть, там будет что-нибудь
01:19:24
там разные символы и вещи
01:19:26
способ, которым он представлен в
01:19:28
наконец, ты знаешь двоичный код и какой ты
01:19:31
глядя на это, это просто будет иметь
01:19:32
расположение, которое более оптимально для
01:19:34
машина и способ получения двоичного файла
01:19:36
построен и как он выполняется и как
01:19:39
он взаимодействует с другой памятью так, что
01:19:41
то, как ты смотришь на вещи, которые знаешь
01:19:43
примерно так же, как когда мы смотрим на это в
01:19:44
то в дизассемблере там в Гее
01:19:47
то, что вы видите, это вызов
01:19:49
функция под названием seaster и она проходит
01:19:52
это адрес чего-то под названием
01:19:54
секретная строка и правда, если ты
01:19:56
знаком с C++, вот это
01:19:59
указатель, хорошо, так что это вызов C++
01:20:02
метод, и он передает метод
01:20:04
этот указатель, потому что этот указатель
01:20:07
и когда я говорю это, я имею в виду
01:20:09
этот указатель, который существует всегда, когда бы
01:20:11
вы вызываете функцию в каком-то смысле
01:20:13
всякий раз, когда вы вызываете любой метод базового
01:20:16
строка, там будет указатель
01:20:18
называется this и тип этого указателя
01:20:20
будет базовым указателем строки
01:20:22
и этот указатель является указателем на самого себя
01:20:25
ну, я мог бы написать сам, но
01:20:27
как в Python, если вы знакомы
01:20:29
Python, который называется self и
01:20:31
в C++ это так называется, так что это
01:20:34
просто разные имена для указателя или
01:20:37
ссылку, если хотите, в зависимости от
01:20:38
язык и определенный контекст, который
01:20:41
указатель — это указатель на объект
01:20:43
само по себе, так что это приносит еще одно хорошее
01:20:45
отметить, что даже если вы не хотите
01:20:47
реверс-инжиниринг, это может быть полезно
01:20:49
поиграйся с Геа и, возможно, даже посмотри
01:20:51
в вашем собственном двоичном файле, который был скомпилирован
01:20:53
потому что вы будете развивать лучшие отбивные по мере того, как
01:20:55
разработчик программного обеспечения и кто-то, кто
01:20:57
действительно могу попрактиковаться в отладке
01:20:59
сложные проблемы нижнего уровня, которые могут очень
01:21:02
часто вступают в игру, когда вы работаете
01:21:04
с собственным кодом, но еще более высокого уровня
01:21:06
код и чем сильнее у вас есть
01:21:08
больше ты сможешь, возможно, разобрать на части
01:21:10
что там такого происходит
01:21:12
создание проблемы и часть возможности
01:21:14
сделать это - значит понять, ты знаешь
01:21:17
что здесь происходит, когда ты видишь
01:21:18
подобная функция называется так
01:21:20
в основном код C++, подобный этому, является своего рода
01:21:23
примерно эквивалентно тому, что вы видите в
01:21:27
Гейра, вообще-то ты знаешь, я бы даже не стал
01:21:29
скажем, примерно эквивалентно тому, что есть у Геа
01:21:31
представление об этом, и вы все знаете
01:21:35
эти вещи очень похожи
01:21:36
символические способы изображения чего-либо
01:21:38
поэтому, когда вы посмотрите на исходный код C++
01:21:41
ты обычно смотришь на очень чистое
01:21:45
представление о том, что такое программное обеспечение
01:21:47
выглядит так, что вы можете увидеть это на C++
01:21:49
секрет
01:21:50
string.c правильно, так что это вызывает это
01:21:53
функция этого метода этот член
01:21:55
функция секретной строки um
01:21:58
переменная, которая на самом деле является чем угодно
01:22:01
переменная, и в этом случае
01:22:02
переменная секретная строка действительно происходит
01:22:04
быть базовой строкой, или мы могли бы просто
01:22:06
скажите строку STL и что на самом деле происходит
01:22:09
в C++, когда вы делаете такой вызов
01:22:12
вы на самом деле вызываете эту функцию
01:22:15
базовой строки, и вы передаете ее
01:22:17
один параметр, и этот параметр происходит
01:22:20
быть самой переменной, это
01:22:22
этот указатель или указатель на себя, если
01:22:24
вы знакомы с Python, поэтому
01:22:26
вот что интересно, если
01:22:28
ты привык работать на высоком уровне
01:22:29
такие языки, как Python или C++, и все готово
01:22:33
подойди к Гейре и ты начнешь тыкать
01:22:35
где-то там ты начинаешь изучать
01:22:37
еще немного о том, что на самом деле
01:22:40
происходит под капотом и на самом деле
01:22:42
ты знаешь много разработчиков C++
01:22:44
может вообще знать, что это то, что
01:22:46
происходит, но когда вы действительно видите
01:22:48
представление этого в Гее, оно может
01:22:51
Немного активизируйте это понимание
01:22:53
немного сильнее, чем, возможно, ты мог бы
01:22:56
были до того, как посмотрели на Геа, где
01:22:59
ты концептуально понял, что было
01:23:01
там происходит, но ты на самом деле добрый
01:23:03
увидеть низкоуровневый код
01:23:06
представительство и это на самом деле ты
01:23:08
знаю, что у меня есть декомпилированный код, но он имеет
01:23:10
точность, которую вы на самом деле могли бы сказать
01:23:13
в нем немного больше истинного или
01:23:15
представление более низкого уровня, чем это
01:23:19
потому что то, что мы видим здесь, ты знаешь
01:23:22
это символическое изображение, которое
01:23:24
означает, что это выражает сейчас, это
01:23:27
также символическое представление, которое мы можем
01:23:30
разбить это дальше на сборку
01:23:32
Язык, и мы можем понять, что это будет
01:23:33
либо позже в этом уроке, либо
01:23:35
еще один урок, но давайте просто возьмем его
01:23:37
шаг за шагом, вся суть в том, что я
01:23:39
пытаюсь сделать вот, когда смотришь на
01:23:40
вещи в Джире, чтобы понять
01:23:42
им, тебе следует держать это в себе
01:23:44
имейте в виду, что вы как бы видите вещи
01:23:46
то, что вы могли бы увидеть в C++, но вы
01:23:49
видя их с другим символическим
01:23:51
представительство в целом и есть
01:23:54
несколько разных способов, которые могут произойти
01:23:56
возможно, вы смотрите на Ассамблею
01:23:57
Языковая дизассемблирование, которым вы можете быть
01:23:59
глядя на псевдокод из декомпиляции
01:24:02
в Геа, как мы смотрим здесь и э-э
01:24:05
все эти разные парадигмы
01:24:06
иметь ценность и уметь распознавать
01:24:08
их и интерпретировать их может быть очень
01:24:10
полезно, и я лично убежден
01:24:12
это похоже на то, если вы интересуетесь C++
01:24:15
развитие и вы заинтересованы в
01:24:16
что разработка программного обеспечения более низкого уровня
01:24:18
погружаться в подобные вещи - это
01:24:20
необычайно плодотворно и ух я я я
01:24:23
сказал бы, что это действительно что-то
01:24:26
как будто я не думаю, что ты хотел бы быть
01:24:27
без этого, если ты действительно хочешь быть
01:24:29
сильный с этими вещами более низкого уровня
01:24:31
что происходит под капотом, но даже
01:24:33
если ты не хочешь тратить кучу времени
01:24:35
под капотом ты просто собираешься на работу
01:24:37
с C++, и вы знаете, чем выше
01:24:39
уровень, на котором вы знаете языковые вещи и
01:24:41
отладчик и все такое, это нормально
01:24:43
но ты также можешь захотеть просто попробовать дип
01:24:45
там немного, чтобы увидеть
01:24:46
немного о том, что происходит, чтобы ты не
01:24:48
ты должен знать, женись на
01:24:50
идея овладеть всем здесь
01:24:53
но немного взглянув на это и
01:24:54
иметь представление о сути
01:24:56
это может пригодиться, может быть, если ты
01:24:57
однажды отладим сложную проблему или вы
01:24:59
хочу посмотреть что-нибудь под капотом
01:25:01
и это не будет для тебя таким чуждым, ты
01:25:02
знаю, что могу порекомендовать посмотреть
01:25:04
вот такая штука под капотом
01:25:06
количество различных парадигм количество
01:25:08
различных архетипов личности
01:25:10
ты знаешь, приближаясь к этому, это не так
01:25:12
должен быть кто-то, кто хочет сделать
01:25:14
реверсивный анализ или анализ вредоносного ПО для
01:25:16
пример, хорошо, поэтому я предпочитаю выполнить сброс после
01:25:19
объясняя такие вещи и просто
01:25:21
вроде как пройтись по этому еще раз, что-то вроде
01:25:22
немного повторяющиеся вещи, потому что я
01:25:24
думаю, если ты смотришь это, это может
01:25:26
вроде как помогите, вот что
01:25:27
мы делаем, у нас есть эта функция здесь
01:25:30
хм, мы вроде как прошлись по некоторым из них
01:25:32
это мы узнаем, если войдем в Лор обратно, окей
01:25:35
на самом деле это будет неправда
01:25:37
это будет ложь, что заставит нас
01:25:39
зайдите и запустите этот оператор else здесь
01:25:42
здесь написано «очень хорошо», а затем написано «и»
01:25:44
затем он говорит: пожалуйста, расскажи мне секрет
01:25:47
будешь ли ты, а затем он предложит
01:25:48
секрет, который в конечном итоге переходит в секрет
01:25:51
строка, так что, если мы введем мое предположение
01:25:53
командная строка почти эквивалентна
01:25:56
взять веревку, я думаю, и
01:25:58
поместив его внутрь секретной строки и
01:26:00
секретная строка является базовой строкой, поэтому она
01:26:03
это все равно, что взять базовую строку, которая
01:26:05
мы объявили секретную строку и
01:26:08
помещение строки, которую вводит пользователь
01:26:09
в командной строке в нашем примере справа
01:26:11
теперь это строка, я думаю, так что
01:26:13
попадает в память, которая поддерживает это
01:26:16
секретная строка объекта, окей, тогда есть
01:26:18
функция, которая получает указатель на
01:26:20
первый символ в этой строке и
01:26:22
вот что делает этот код, вот что
01:26:24
эквивалент этого кода C++ прямо здесь
01:26:27
в итоге выглядит примерно так
01:26:29
под одеялом, куда ты звонишь
01:26:31
эта функция представляет собой базовую строку с именем
01:26:32
ccore перемешать сейчас ccore перемешать возвращает C
01:26:36
строка, я действительно собираюсь изменить то, что
01:26:39
мы делаем это очень быстро и
01:26:41
Я скажу Лор Дьяк, а потом
01:26:44
секрет, который мы собираемся ввести, это ABC
01:26:47
окей, и там написано, что код не найден, так что
01:26:49
мы собираемся изменить это здесь, чтобы быть
01:26:51
ABC, и вы поймете, почему
01:26:54
окей, спроси стол, мы поищем
01:26:57
столик, и мы пойдем сюда и
01:27:00
давайте найдем код ABC, вот
01:27:02
ABC и шестнадцатеричные коды ABC.
01:27:05
будут 61, 62 и 63 в HEX
01:27:09
нам очень легко их распознать
01:27:11
61 62 63 окей, мы собираемся вернуться
01:27:14
сюда, к нашей псевдодоске и
01:27:16
эээ, я изменил это по моим предположениям на ABC
01:27:18
потому что мне будет легче
01:27:19
чтобы объяснить это, когда ты печатаешь ABC
01:27:22
в памяти у тебя 61 62 и 63 это
01:27:27
функция здесь Посмотрите, как C++
01:27:30
Библиотека определяет базовую строку ccore
01:27:34
перемешать, это определяет его так, что когда вы
01:27:37
позвони сюда и получишь указатель
01:27:39
к первому персонажу, который собирается
01:27:41
будь 61 или буква А, так что это секрет
01:27:47
указатель строки закончится
01:27:50
указывая на первый первый символ
01:27:52
и я вообще-то собираюсь пойти и поставить
01:27:54
все в порядке, после этого звонка прямо здесь
01:27:58
это значение, это указатель на секретную строку
01:28:00
будет иметь адрес, который является
01:28:03
число, и это число будет
01:28:05
ячейка памяти, в которой находится первая
01:28:07
символ строки, которую пользователь
01:28:09
вводится из командной строки, которая
01:28:11
будет a или 0x61, следующий
01:28:13
будет 0 x62, что равно B и 0x 63
01:28:17
это C, теперь эта функция имеет в своем
01:28:20
документации, поэтому, если мы пойдем сюда и наберем
01:28:22
в строке C++ в перемешивании мы должны получить что-то вроде
01:28:26
Справочник C CPP или C++, один из этих двух
01:28:29
так что если вы пойдете сюда, вы увидите
01:28:31
в документации здесь есть C Stir и это
01:28:34
вернет указатель на массив, который
01:28:37
содержит завершающуюся нулем последовательность
01:28:41
символы, обозначающие текущий
01:28:43
значение строкового объекта по порядку
01:28:46
чтобы эта функция выполнялась
01:28:48
правильно, чтобы он выполнял свою работу
01:28:50
правильно он должен повернуть указатель или
01:28:54
значение адреса, указывающее на строку
01:28:56
что означает, что он указывает на первый
01:28:58
символ, но затем адрес, который
01:29:00
сразу после первого символа
01:29:01
следующий символ и адрес после
01:29:03
это следующий персонаж, и я, я, я
01:29:05
покажу тебе, что я имею в виду, но это
01:29:06
также означает, что произойдет
01:29:08
ноль или ноль в конце строки
01:29:10
это называется нулевым завершением
01:29:12
строка, так что давайте будем очень упрощенными
01:29:14
вот допустим, что эта строка находится в
01:29:16
локация 100, сейчас это не так
01:29:19
обычно как адрес обычно
01:29:21
адрес действительно большой, например, 64-битный
01:29:24
платформы, давайте не будем вдаваться во все это
01:29:26
потому что концептуально это одно и то же
01:29:28
окей, скажем так, это адрес 100
01:29:30
это означает, что по адресу 100 находится
01:29:32
укус 61 и это буква а и в
01:29:35
адрес 101 - это символ B и
01:29:40
адрес 102 - это символ C, окей и
01:29:44
стандарт C++ говорит, что когда вы вызываете это
01:29:48
сначала вы получите указатель на это
01:29:51
символ, который на самом деле является указателем на
01:29:53
вся строка, кроме самого указателя
01:29:55
который является адресом, всегда указывает на
01:29:58
начало строки, которая является
01:30:00
первый адрес всей строки, поэтому
01:30:02
я предлагаю здесь то, что в нашем
01:30:04
небольшой псевдопример после этого
01:30:06
вызов функции прямо здесь вы получите
01:30:09
обратный указатель на секретную строку, окей, было бы
01:30:12
быть равным значению 100, которое является
01:30:14
адрес первого символа, который это
01:30:16
указатель, который вы получите в ответ, указывает на
01:30:19
первый персонаж, который будет
01:30:21
на самом деле это точка на всю строку, так что
01:30:23
следующий адрес будет иметь
01:30:24
следующий символ идет следующий адрес
01:30:26
чтобы получить следующего персонажа и, наконец,
01:30:28
в конце этой строки происходит
01:30:29
быть нулевым укусом, вот что они
01:30:32
называть нулевым Терминатором, и эти
01:30:36
вид строк на самом деле в C
01:30:38
такой язык, как и так, вот так
01:30:41
эти строки раньше были всегда
01:30:43
представляю, что у тебя не было всего этого
01:30:45
причудливые объекты C++ до C++, поэтому
01:30:48
люди, которые много лет работали на C
01:30:50
очень хорошо знакомы с этими
01:30:52
виды строк, окей, и что это за строка
01:30:54
делает, это зовет моряка
01:30:58
функция над секретным строковым объектом и
01:31:01
он запрашивает указатель на
01:31:03
первый символ строки и его и
01:31:05
это должно быть завершено нулем
01:31:07
строка, так что в основном секретная строка
01:31:08
указатель - это адрес первого
01:31:10
символ строки и это ноль
01:31:12
завершенная строка, а затем этот нуль
01:31:14
завершенная строка того, что пользователь
01:31:16
введенное передается для получения кода, поэтому
01:31:19
теперь мы собираемся получить код
01:31:22
вот и вот мы в этой функции и
01:31:23
мы видим, что указатель секретной строки
01:31:26
прошло здесь, мы уже назвали это
01:31:27
переменная, э-э, должна быть именем, которое соответствует
01:31:30
что это за параметр, потому что мы уже
01:31:32
вроде как знакомы с тем, что это
01:31:34
означает, что это указатель на первый
01:31:36
символ, который пользователь ввел на
01:31:38
командной строки, и это означает, что
01:31:40
следует адрес следующего символа
01:31:42
этот адрес и так далее, так что действительно
01:31:45
это указатель на всю строку
01:31:46
и это строка с нулевым завершением, когда
01:31:48
мы приходим сюда, есть вещь, которая называется
01:31:50
большой секрет, быстро вставьте сюда, ребята
01:31:53
эта функция принимает секретный параметр
01:31:55
строковый указатель, который является адресом
01:31:58
указывая на первый символ, который
01:32:00
введенный пользователем эта функция также содержит
01:32:03
этикетка большой секрет, который является
01:32:06
обратиться к данным, уже находящимся в этом
01:32:10
двоичный, в идеале параметр для этого
01:32:13
функция была бы названа как-нибудь
01:32:15
например, указатель секретного пароля пользователя или что-то в этом роде
01:32:18
указать, что это было от пользователя
01:32:20
станет яснее через несколько минут
01:32:23
но я хотел уточнить это заранее в
01:32:26
случае, это поможет, когда мы придем сюда
01:32:28
есть вещь, называемая большим секретом
01:32:30
окей, если мы нажмем Enter, мы узнаем большой секрет
01:32:33
здесь можно увидеть, как это меняется, и это
01:32:35
показывает нам, что большой секрет — это массив
01:32:39
это в памяти, так что это похоже на
01:32:40
предварительно инициализированный массив, который уже есть
01:32:43
памяти, когда мы запускаем программу и вы
01:32:46
знаю, что мы можем сделать вывод по названию
01:32:48
что теперь там содержится какой-то секрет
01:32:50
мы действительно можем скопировать и вставить это
01:32:52
здесь мы можем все это выбрать и тогда мы
01:32:55
можно щелкнуть правой кнопкой мыши и сделать специальное копирование и
01:32:58
вы можете выбрать строку B и нажать
01:33:00
окей, а потом ты можешь пойти сюда и
01:33:02
блокнот и мы можем вставить это сюда
01:33:04
мы назовем это как угодно
01:33:06
имя это большой секрет, большой
01:33:09
секрет - это адрес в памяти, это
01:33:12
это место в памяти, так что это
01:33:14
метка, это удобная для пользователя метка
01:33:16
это было отдано этой области памяти
01:33:19
который содержит эти данные, поэтому, если вы
01:33:22
имея в виду большой секрет, который ты
01:33:23
имея в виду адрес первого эээ
01:33:26
укус, который является Де, но если вы увеличите
01:33:29
это до следующего места укуса, следующего
01:33:31
адрес, на который вы будете ссылаться, и
01:33:34
в каком-то смысле это указывает на начало
01:33:37
какой-то массив в памяти об этих
01:33:41
пока здесь, хорошо, если мы посмотрим
01:33:43
эта строка, если мы вернемся сюда, если мы
01:33:46
см. местный 170, это большой секрет
01:33:49
вы можете видеть здесь, что локальный 170 определяется как
01:33:52
указатель uare, поэтому он эквивалентен
01:33:54
как бы говоря, что этот указатель UARE локальный
01:33:57
170 соответствует первому символу в
01:34:02
большой секрет, так что в основном местные 170 тоже
01:34:06
указывает на то же самое, что и этот ярлык
01:34:08
делает это, мы знаем, что это
01:34:11
функция по какой-то причине установлена
01:34:13
поднять указатель на некоторую существующую область
01:34:16
память сейчас очень часто это может случиться
01:34:20
в функции c или c Plus+, потому что это
01:34:23
функция собирается что-то с этим сделать
01:34:25
область памяти и вот что происходит
01:34:27
произойдет здесь, поэтому мы вроде как знаем, что
01:34:29
это указатель на большую тайну, которую я
01:34:32
наведите курсор на местный номер 170, я собираюсь
01:34:34
нажмите клавишу L и введите P, большой секрет.
01:34:37
э-э, забота, а P - это номенклатура, которая
01:34:40
означает указатель, поэтому, если у вас есть немного p
01:34:42
там это означает, что это переменная, которая
01:34:44
это указатель, и вы называете его так
01:34:46
это указатель на большую тайну
01:34:49
символ обычно в приложении C++
01:34:51
есть одно особое соглашение об именах
01:34:54
для переменных, которые обычно используются
01:34:56
во всем приложении вы можете видеть
01:34:58
в гедре используется смесь змей
01:35:01
регистр и венгерские обозначения, которые мы использовали
01:35:04
змеиный корпус для секретного параметра
01:35:07
строковый указатель PTR означает указатель
01:35:10
указатель на символ, который является
01:35:13
начало секретной строки для
01:35:15
Венгерская запись, перед которой вы ставите префикс
01:35:17
переменная с некоторыми символами, которые
01:35:19
указать что-нибудь о переменной
01:35:20
например, это тип или его значение, так что в этом
01:35:24
случай p означает указатель b означает укус для
01:35:27
пример, поэтому PB VAR является указателем на укус и
01:35:30
мы называем его VAR one PC VAR 2 означает
01:35:34
указатель на символ и мы даем имя
01:35:36
переменная VAR 2, которую вы могли бы иметь
01:35:38
указатель на символ имени пользователя ПК или ПК
01:35:42
пароль или любое другое описательное имя
01:35:45
главное в венгерской нотации
01:35:47
вы добавляете к переменной префикс некоторого
01:35:49
вид ввода информации или значения
01:35:52
информация существует в разных формах
01:35:53
Венгерские обозначения, которые вы действительно можете посмотреть
01:35:55
в Википедии во всех этих стилях, чтобы
01:35:58
узнать больше о них и их истории
01:36:00
вообще говоря, хотя есть
01:36:02
смесь вещей, которые мы здесь используем
01:36:04
и эта гедра здесь используется, даже если
01:36:06
gedra использует смесь обозначений
01:36:08
возможно, вы захотите использовать один конкретный
01:36:10
стиль ради организации или
01:36:13
вы можете подражать тому, что делает гедра
01:36:15
в определенной области, чтобы
01:36:17
сохранять некоторый уровень согласованности с
01:36:20
э-э, это подход, что делать, решать вам, но
01:36:22
очевидно, с любой из этих вещей, где
01:36:24
здесь много переменных, и я
01:36:26
означает, что и на самом деле, и
01:36:28
метафорически, например, проверка пера
01:36:30
или поиск ошибок или программирование в
01:36:32
большая прикладная система или проект
01:36:35
все эти области работы включают в себя множество
01:36:37
мозговых циклов, отслеживающих множество
01:36:39
переменные и информация, поэтому чем больше
01:36:41
ты организован, тем больше у тебя мозгов
01:36:43
может сосредоточиться на проблемном пространстве, а не
01:36:46
чем отсутствие организации или отсутствие
01:36:48
согласованность с тем, как вы решите
01:36:51
хранить информацию, которую вы отслеживаете, как
01:36:53
ты работаешь над проблемным пространством, так что это
01:36:56
вот здесь большой секрет
01:36:59
метка к месту в памяти, где это
01:37:02
метка представляет собой адрес
01:37:04
первый символ этой таблицы, который
01:37:06
большой секрет, когда вы назначаете это
01:37:09
другая переменная, эта другая переменная
01:37:11
будет иметь тот же адрес, поэтому в
01:37:13
в каком-то смысле они оба одинаковы
01:37:15
вещь первая — это ярлык, который уже существует
01:37:18
это представляет начало этой таблицы
01:37:20
другой — это переменная, которую вы
01:37:22
создание, которое будет указывать на то же самое
01:37:25
место, как этот стол, но когда вы
01:37:27
относятся к обоим этим символам, которые они любят
01:37:29
в данный момент времени они
01:37:31
оба ссылаются на одно и то же место в
01:37:34
память в некотором смысле, поэтому мы можем на самом деле
01:37:36
возьми это новое имя, которое есть у нас и у тебя
01:37:38
вижу, что здесь это изменилось, так что в
01:37:40
теперь чувствую, что это на что-то изменится
01:37:42
немного более удобный для пользователя, где мы
01:37:46
иметь большой секрет, забота равна большому
01:37:49
секрет, окей, пойдем посмотрим, как это
01:37:51
хорошо используется, мы видим, что есть за
01:37:53
Цикл здесь и это для циклов выполняется и
01:37:55
делает что-то, а затем после этого делает
01:37:58
проверьте здесь, и на чеке написано: «А если это»
01:38:01
равно нулю, тогда иди и сделай это, иначе иди
01:38:04
здесь, выйдите и вернитесь в
01:38:07
воротник, поэтому, прежде чем мы посмотрим на цикл for
01:38:09
давайте перейдем к этому простому
01:38:12
код здесь, просто чтобы посмотреть, что это такое
01:38:14
иногда я делаю это, когда я
01:38:15
переворачивая, ты просто как бы идешь куда-нибудь
01:38:17
простые области, потому что если вы решите их
01:38:19
это может помочь вам разобраться в некоторых
01:38:21
другие вещи здесь, а может и нет
01:38:23
но это не имеет большого значения, ты знаешь, если
01:38:24
ты просто проводишь пару секунд, собираясь
01:38:26
здесь, внизу, ты знаешь, мы можем решить не делать этого
01:38:28
поработаем над этой областью здесь, мы можем просто
01:38:30
решил вернуться сюда, но давай
01:38:31
просто пропусти сюда и посмотри на это
01:38:33
очень быстро, теперь мы видим
01:38:35
есть переменная под названием PC VAR 2 и
01:38:37
ему присваивается ноль или ноль, поэтому
01:38:40
всякий раз, когда вы видите Зеро таким в
01:38:43
как разборка, хм, это может означать
01:38:45
то же самое, что и ноль, когда вы смотрите на
01:38:47
С++, например, в нулевом указателе С++
01:38:51
равно нулю в каком-то смысле и на самом деле
01:38:54
стандарт позволяет использовать ноль ноль
01:38:56
это правильный способ, если бы вы сказали «забота»
01:38:58
указатель P равен 0 или указатель ухода P
01:39:02
равно нулевому указателю, а это сумма
01:39:05
одно и то же в обоих случаях ты
01:39:07
создаешь новый указатель и ты
01:39:09
установка этого указателя со значением
01:39:11
изначально это нулевой указатель, который
01:39:13
означает что-то вроде того, что оно не назначено
01:39:15
вообще что-нибудь, что равно нулю или нулю
01:39:17
означает, что когда вы назначаете его
01:39:19
такой указатель имеет
01:39:21
использовался, но он не указывает на
01:39:23
допустимое место в памяти, что это такое
01:39:25
делать это знак присваивания нуля
01:39:28
что-то под названием PC VAR 2, а потом это
01:39:31
возвращается PC VAR 2, мы можем увидеть PC VAR
01:39:34
2 здесь указание по уходу, окей, так что это
01:39:37
указатель на некоторый символ в памяти
01:39:39
и мы видим, что этот конкретный случай
01:39:42
здесь присваивает ноль ПК var2, а затем
01:39:45
возвращает этот ноль, поэтому мы замечаем, что это
01:39:48
функция получения кода должна
01:39:50
вернуть указатель ухода, чтобы это означало
01:39:52
тот, кто вызывает эту функцию,
01:39:54
ожидаю возвращения какого-то персонажа
01:39:56
указатель и одна из возможностей
01:39:59
что вызывающему объекту этой функции необходимо
01:40:01
следует быть готовым к тому, что эта функция
01:40:03
может вернуть нулевой указатель, и это не так
01:40:05
необычно, если вы знакомы с c и
01:40:07
C++, чтобы иметь функцию, которая могла бы возвращать
01:40:10
указатель символа, если что-то произойдет
01:40:12
определенным образом, и если что-то
01:40:14
не происходит, он может вернуть ноль
01:40:16
указатель, чтобы хорошо указать эту вещь
01:40:18
не произошло, или оно не было успешным, или
01:40:21
в некоторых случаях нулевой указатель может означать
01:40:23
успех зависит только от определения
01:40:25
определение функции и в этом
01:40:27
случай, когда мы действительно не знаем, что именно
01:40:29
это значит, но мы понимаем это как
01:40:31
мы идем, но одно мы знаем сразу
01:40:33
битой является ПК VAR 2 — возвращаемое значение
01:40:36
поэтому мы можем поместить сюда курсор и нажать
01:40:37
клавишу L, и мы можем сказать результат p и
01:40:41
это означает, что это возвращение
01:40:43
значение для вызывающего эту функцию и
01:40:46
вы можете видеть, что Геа переименовала его, и вы
01:40:48
также вижу, что здесь есть некоторая логика
01:40:50
это начинает пузыриться, ты можешь
01:40:51
вид см. в этом пункте if в
01:40:53
внизу он устанавливает результат
01:40:55
что-то, что кажется не нулевым и
01:40:58
мы видим здесь еще одно предложение
01:41:00
что это установка возвращаемого значения
01:41:03
быть нулевым или нулевым, чтобы мы могли видеть
01:41:06
из этого следует, что это еще будет
01:41:08
возвращаем нулевое значение, и мы предполагаем это
01:41:11
вроде как именно этот
01:41:13
случай здесь собирается что-то вернуть
01:41:15
не ноль, и это почти дает ощущение
01:41:17
например, если дела идут успешно, если ты
01:41:19
введите правильную вещь, и она проверится
01:41:21
он пойдет по этому пути прямо здесь
01:41:23
это похоже на путь к успеху, и это
01:41:25
вернет что-то, что не равно нулю, поэтому
01:41:27
если мы вернемся к оператору if, мы
01:41:29
вижу, ну, похоже, что дела обстоят
01:41:32
успешен, если P большая секретная забота равна
01:41:36
ноль, что довольно интересно, правда
01:41:38
потому что мы говорим только о нулях
01:41:39
и еще что-то, но это другое
01:41:41
нечто большее, чем то, о чем мы говорили
01:41:42
здесь, внизу, нуль используется во многих
01:41:45
разные способы получить ноль
01:41:46
указатель, который является адресом в памяти
01:41:50
это все Z Z или у вас может быть ноль
01:41:53
Терминатор в конце строки, которая
01:41:55
это всего лишь один укус, который равен нулю, это всего лишь
01:41:57
обозначает конец строки, поэтому для
01:42:00
пример, это ноль в конце
01:42:03
эта строка байтов, которая кажется
01:42:06
большой секретный нулевой указатель или ноль, если я
01:42:09
возьми указатель, просто давай сделаем
01:42:11
любой старый указатель p, и я говорю ноль, это эээ
01:42:14
Переменная P — это указатель, который представляет собой
01:42:17
адрес, так что это адрес Z, назначенный
01:42:24
P, ладно, тогда как вот это
01:42:27
один символ, который оказывается нулем
01:42:30
и это в конце строки и
01:42:32
это потому, что традиционные строки C
01:42:33
не используйте ноль в середине
01:42:36
строку, чтобы они могли использовать ноль для отметки
01:42:39
конец строки, поэтому, если мы вернемся к
01:42:41
другая наша доска, здесь вы можете разыграть
01:42:43
увидеть, что это адрес, чтобы вы могли
01:42:46
назначить адрес указателю справа
01:42:50
но этот адрес будет указывать на один или
01:42:53
больше персонажей в этом конкретном
01:42:55
сценарий, и он может закончиться нулевым
01:42:58
и этот ноль не адрес, это
01:43:00
просто символ, но его значение равно нулю
01:43:03
который отмечает конец строки ABC
01:43:07
окей, давайте перенесем весь этот раздел
01:43:09
в доску блокнота и давайте разберем
01:43:11
посмотри на это секунду, так что, если
01:43:13
мы идем сюда, мы вставим это, и ты сможешь
01:43:15
видишь, мы раскрываем большой секрет
01:43:18
уход равен началу строки
01:43:20
это называется большой секрет и это
01:43:22
у нас есть вот это вот это
01:43:24
загадочно выглядящая строка, которая не имеет
01:43:26
имеют для нас какое-то значение прямо сейчас и
01:43:28
он назначает начало этого и в
01:43:30
факт, что мы можем принести это сюда, это будет
01:43:32
просто облегчи жизнь, так что давай просто положим
01:43:35
это здесь вверху, так что это самое большое
01:43:37
секрет, и то, что мы делаем, это то, что мы
01:43:38
поручив П большой тайной заботе указать на
01:43:41
этот первый символ, а затем у нас есть
01:43:43
Цикл for в порядке, поэтому цикл for имеет
01:43:47
несколько вещей, и мы собираемся сломать
01:43:48
из этих компонентов здесь прямо сейчас это
01:43:50
имеет это задание и это
01:43:52
проверьте, знакомы ли вы с C++, тогда
01:43:55
ты уже знаешь, что здесь происходит
01:43:56
но если ты, если ты нет, я пойду
01:43:58
из-за этого я вроде как делаю это
01:44:00
выгляди немного питонически, может быть, это поможет
01:44:02
поэтому for Loop имеет формат, в котором вы
01:44:04
возьми четыре, и скажем просто «б» и «в»
01:44:08
разделенные двоеточиями, а затем у вас есть
01:44:09
некоторые утверждения прямо здесь, эти
01:44:11
операторы могут быть или не быть фигурными скобками EMB
01:44:13
но давай не будем беспокоиться об этом прямо сейчас
01:44:14
потому что Геа ставит им брекеты
01:44:16
здесь для нас, поэтому мы просто собираемся использовать
01:44:18
этот формат так a является инициалом
01:44:20
оператор инициализации, чтобы вы могли видеть
01:44:22
это оператор инициализации B
01:44:24
оператор условия, который он получает
01:44:26
проверяется перед каждой итерацией
01:44:29
цикл, мы собираемся разобраться во всем этом в
01:44:30
второй и этот последний здесь C
01:44:33
часть вот здесь, это выражение
01:44:35
и это выражение оценивается после
01:44:38
каждой итерации цикла перед
01:44:41
условная проверка, вот часть
01:44:44
вот это будет
01:44:45
инициализация, э-э, что-то вроде этого B
01:44:49
часть прямо здесь - это условие и вы
01:44:51
могу заметить, что они все разделены
01:44:53
точки с запятой это условная проверка
01:44:55
это будет происходить перед каждой итерацией
01:44:57
цикла, а затем у вас есть что-то вроде
01:44:59
выражения, которое происходит после
01:45:01
каждая итерация цикла, так что в основном
01:45:03
цикл собирается пойти и инициализироваться
01:45:06
это он проверит это и если
01:45:08
эта проверка верна, она будет запущена
01:45:11
что в скобках или что-то в этом роде
01:45:13
утверждение, оказывается, вот это
01:45:15
часть, поэтому он собирается сделать это в
01:45:17
самое начало, он запустит этот
01:45:19
раз и только один раз перед этим
01:45:21
Циклы, он проверит это, если это
01:45:24
это правда, здесь будет работать все
01:45:26
затем после того, как он запустит все здесь
01:45:28
он запустит эту часть C после запуска C
01:45:31
он выполнит эту проверку еще раз, если это
01:45:33
проверьте, правда, он запустит это снова и
01:45:35
он продолжает делать это снова и снова
01:45:37
пока это не ложь, имейте это в виду
01:45:40
давайте посмотрим, что делает этот цикл for
01:45:42
эта гидра у нас хорошо декомпилировалась
01:45:45
он назначает локальный ресурс 8 секретным
01:45:48
указатель на строку, поэтому секретный указатель на строку
01:45:51
это то, что ввел пользователь, вернемся назад
01:45:52
переходя к гидре, это параметр, который
01:45:54
мы передали это пользователю
01:45:56
введено в командной строке, чтобы мы могли
01:45:58
вообще-то пойди и возьми это у нашего маленького
01:46:00
разбивка здесь, давайте на самом деле получим это
01:46:02
и перенесем это на нашу маленькую псевдо
01:46:04
доска здесь, и мы можем просто
01:46:06
подключи это, вообще-то я выложу это
01:46:08
вот что это такое
01:46:09
параметр функции, вот что
01:46:11
пользователь ввел это какое-то значение, которое
01:46:13
сама функция та, которая
01:46:15
проверка кода, он знает об этом
01:46:17
значение, и оно будет использоваться в некоторых
01:46:19
своего рода процесс, в котором мы
01:46:21
анализируем прямо сейчас и в рамках этого
01:46:23
обработка установила эту переменную
01:46:24
называется большой тайной заботой, равной
01:46:27
адрес, который представляет эта метка, и
01:46:29
затем начинается это для цикла и это
01:46:31
Цикл for начинается с принятия этого
01:46:33
указатель на первый символ
01:46:36
пользователя ввели строку и она
01:46:38
присваивает его переменной с именем local
01:46:40
res 8, так что помните, что это выполняет только один
01:46:43
время, поэтому при начальном запуске for
01:46:46
Loop local res8 указывает на начало
01:46:48
введенной пользователем строки символов
01:46:50
эта строка больше не будет работать
01:46:53
случается только один раз, потом первый
01:46:54
что происходит, так это то, что есть немного
01:46:56
проверьте, что происходит здесь, это немного
01:46:58
проверка в основном имеет звездочку здесь и
01:47:01
когда ты поставишь эту звездочку здесь впереди
01:47:03
переменной, которая указывает на
01:47:05
адрес, который он указывает на этот адрес
01:47:08
на самом деле мы можем разместить это здесь
01:47:10
и мы действительно можем сказать, что изначально
01:47:13
после этой настройки в локальном цикле for
01:47:15
рез 8 баллов прямо здесь, окей, так локально
01:47:17
получите 8 баллов прямо здесь, когда вы обратитесь
01:47:20
в локальном разрешении 8 вы имеете в виду 100
01:47:23
какой адрес этого места
01:47:26
когда ты поставишь сюда маленькую звездочку
01:47:28
ты имеешь в виду то, что внутри этого
01:47:32
адрес, который равен 61 или букве а в
01:47:35
этот конкретный пример, поэтому эта звездочка
01:47:38
локальный res8 в этот конкретный момент
01:47:41
время равно 61 или букве А, окей, теперь
01:47:45
если вы посмотрите здесь, здесь используется аналогичный
01:47:49
звездочка, поэтому, если мы говорим только о P big
01:47:52
секретная забота, так что давайте действительно сделаем
01:47:55
то же самое, это большой секрет, поэтому мы
01:47:57
собираюсь на самом деле поставить это и скажем
01:47:58
что это 200, хотя это не так
01:48:01
ну, правда, мы собираемся сказать, что это в
01:48:03
200, так что мы скажем
01:48:08
202, и теперь я разобрался с этим, у нас есть
01:48:10
вводимые пользователем данные, которые вам знакомы
01:48:12
тогда у нас есть большой секрет и
01:48:14
то, что мы говорим себе, является
01:48:16
большой секрет находится в позиции 200, поэтому, когда мы
01:48:19
поручить большую тайну заботе о большом секрете
01:48:22
на самом деле он указывает на этот адрес
01:48:26
так что вы можете увидеть сходство здесь, в
01:48:27
настройка этих двух, поэтому, если мы имеем в виду
01:48:30
просто P, большая секретная забота, это на самом деле так и есть
01:48:33
ссылаясь на это число 200, которое
01:48:35
адрес, где находятся большие секретные точки
01:48:38
если бы мы сделали что-то, где ты
01:48:40
скажи звездочку, а затем P, большой секрет
01:48:43
вы имеете в виду не 200, а это
01:48:47
адрес, но вы имеете в виду
01:48:49
что в адресе, который
01:48:50
Де этого одного 200 и это с
01:48:55
звездочка — это нормально, и с этим то же самое
01:48:58
только это равно 100, и если вы поставите
01:49:01
там маленькая звездочка и назови местный ресурс
01:49:04
8 вот что находится в этом адресе 100
01:49:09
что в данном случае равно 61 или
01:49:13
персонаж окей, итак, у нас есть все это
01:49:16
здесь сломано, и если мы спустимся
01:49:18
здесь вы можете видеть, что это эта часть
01:49:20
цикл for в основном говорит только
01:49:23
продолжите это для цикла, если эти два
01:49:26
вещи равны друг другу и на
01:49:28
с одной стороны, это первый символ
01:49:32
что пользователь ввел, а это и
01:49:35
первая большая секретная карьера Де Со
01:49:39
по сути, это означает, что если 61, то и пусть
01:49:43
вообще-то я получу 61 и запишу это сюда
01:49:45
на секунду, так что это говорит, если 61
01:49:48
равно и я сделаю это неправильно
01:49:50
на секунду, просто чтобы подчеркнуть, если
01:49:52
оно равно De, но на самом деле это не так
01:49:55
делаю это правильно, так что это неправильно
01:49:58
но, ну, подожди секунду, подожди
01:50:01
секунда, окей, так что на самом деле он делает это
01:50:04
здесь происходит еще кое-что, окей, так что давай
01:50:08
на самом деле скопируйте и вставьте это сюда, так что
01:50:10
на самом деле он говорит
01:50:13
персонаж, который находится в большой тайне
01:50:16
забота, это 0xde, ладно, давайте просто
01:50:19
замените это на Xerox, там написано
01:50:21
этот эксклюзив или вместе с этим, если мы получим
01:50:26
из калькулятора программиста
01:50:28
запустив Cal в Windows, и вы сможете сделать
01:50:31
альтернативный вариант 4, и это поможет
01:50:33
денди программист, калькулятор, ты можешь
01:50:35
на самом деле иди в heximal и на самом деле ты
01:50:37
можешь оставить его в Quadw Qword, но ты можешь
01:50:40
также нажмите на это, и оно перейдет в word и
01:50:42
оно укусит, так что теперь это произойдет
01:50:44
быть значением укуса, и если я наберу De и
01:50:47
тогда я думаю, что у них есть экзор здесь, не так ли?
01:50:49
есть xor где-то здесь, о, они так делают
01:50:53
мы введем xor и теперь собираемся
01:50:55
введите a и мы нажмем Enter
01:50:58
итак 74 это равняется 74 и что это такое
01:51:02
эффективно сделать это здесь было неправильно
01:51:05
это интерпретация вещей, что это
01:51:07
строка кода на самом деле говорит
01:51:09
если 0x61 = 0x74, продолжайте цикл
01:51:15
окей, если ты анализируешь это, ты
01:51:17
интересно, что такое 74, давайте вернемся
01:51:20
подойди к нашему столику и просто посмотри,
01:51:22
это вопросительный персонаж, и он выглядит так
01:51:25
74 hex — это символ t. Хорошо, вот это
01:51:30
это может быть интересно, мы не знаем
01:51:31
но если так и будет продолжаться
01:51:33
куча персонажей, что мы видим
01:51:35
вот окей, и я собираюсь избавиться от
01:51:37
это неправильно, и я хочу
01:51:38
вернись сюда, и я хочу, чтобы ты увидел
01:51:41
прямо здесь, мы снова собираемся пойти
01:51:43
за это еще раз, это говорит
01:51:44
персонаж, который находится в локальном разрешении 8
01:51:47
это первый символ, который пользователь
01:51:48
введено в командной строке, если это так
01:51:50
равен большому секретному персонажу, который
01:51:53
в настоящее время указывается, на что именно
01:51:55
сначала один exord с АА, так что если что
01:51:58
введенное пользователем значение равно большому секрету
01:52:01
exord персонажа с помощью AA, затем продолжайте
01:52:04
здесь подразумевается, что
01:52:07
большой секретный персонаж закодирован
01:52:10
эксклюзивно или с АА, вы увидите
01:52:13
эксклюзивный или иногда используемый в коде
01:52:16
он используется в криптографии и, э-э
01:52:18
кодирование вещей и прочего, и это может
01:52:20
быть способом своего рода укусов опуса или
01:52:23
кодируя их каким-то образом, поэтому в
01:52:26
в данном случае это очень простая кодировка
01:52:29
алгоритм похоже это большой секрет
01:52:32
кодируется эксклюзивным ORированием всех его
01:52:35
символы с секретным кодом АА это
01:52:38
по сути говоря, начните с первого
01:52:40
символ, введенный пользователем, а затем
01:52:43
проверьте, равен ли этот символ
01:52:45
большой секретный эксорд с АА декодирует
01:52:50
большой секретный персонаж, которым мы являемся
01:52:51
сейчас проверяю, поэтому раскодируйте это де
01:52:55
персонажа, исключив его с помощью AA
01:52:58
и после того, как вы раскодируете его, сравните его с
01:53:00
первый символ, который пользователь
01:53:02
введено, если оно равно, продолжить
01:53:05
вперед, ну, что он делает, чтобы продолжить
01:53:07
вперед, ну, он увеличивает этот указатель
01:53:10
чтобы указать на следующее значение и заметить
01:53:13
здесь это также увеличивает локальное разрешение до
01:53:16
следующее значение, которое эквивалентно
01:53:18
увеличение до символа X и что
01:53:20
происходит, если это равно этому X или
01:53:25
АА указатели перейдут к следующему
01:53:28
позиция и тот же чек примет
01:53:30
место, и если они равны, оно перейдет в
01:53:32
следующий и следующий и
01:53:34
это будет продолжаться до тех пор, пока не появится
01:53:36
несоответствие теперь несоответствие может произойти в
01:53:39
два разных способа: один — если это
01:53:42
персонаж или этот персонаж, в зависимости от того, что
01:53:45
тот, который мы проверяем, не равен
01:53:48
большой секрет, который декодируется с помощью xor
01:53:51
АА или когда оно достигнет конца, если оно
01:53:54
достигает конца строки конец
01:53:56
здесь идет веревочка, большая тайна
01:53:57
иметь 0 0, и если вы исключите это с помощью AA
01:54:01
это будет АА, и если это секрет
01:54:04
Строковый указатель равен всему
01:54:06
на самом деле этого не произойдет, это
01:54:09
в основном будет иметь ценность, которая
01:54:13
в принципе, это не так, поэтому, если мы вернемся к
01:54:15
Геа, что здесь происходит, это происходит
01:54:17
чтобы пройти по строке, и это
01:54:19
собираюсь расшифровать каждый большой секрет
01:54:23
эээ, персонаж, выполняя xoring каждого символа
01:54:26
с АА, так что хорошее упражнение для вас
01:54:29
если вы не знакомы с этим, это
01:54:30
пройти через каждого из этих персонажей так
01:54:32
начните здесь и введите De в поле
01:54:35
калькулятор вправо, а затем выполните xor вправо
01:54:38
а затем сделайте АА, а затем нажмите «равно» и
01:54:41
у тебя 74, так что ты можешь сделать это мы
01:54:44
действительно могу скопировать это для нашего декодирования
01:54:47
правильно, чтобы мы могли просто скопировать
01:54:49
это на секунду, чтобы я мог просто показать
01:54:50
как может выглядеть это упражнение
01:54:52
если ты это сделаешь
01:54:54
все в порядке, значит, у тебя есть большой секрет и
01:54:58
ну, что ты можешь сделать, так это отказаться от своего желания
01:55:00
исключите каждое из них с помощью АА, так что мы
01:55:03
действительно, могли бы заполнить это, и вы
01:55:05
просто пройдусь по списку здесь, например
01:55:08
так ладно, первому 74, так что ты
01:55:11
мог бы поставить 74, так себе следующий
01:55:13
будет C2, а вы скажете побитовое X
01:55:17
или и ты бы пошел на пятерку и тебе было бы 68
01:55:21
вы вводите 68, и если вы сделаете это для
01:55:23
все это, а потом ты попадаешь в небо
01:55:25
таблица поиска 74, так что это Т, так что мы бы
01:55:28
поставь т или вообще-то мне нравится делать это, когда
01:55:30
мы говорим о хм, и следующий
01:55:32
68, значит, 68 — это H, а следующий — CF X.
01:55:37
или AA, поэтому вы говорите CF X или AA, и это
01:55:41
нам будет 65, так что если мы пойдем и получим
01:55:44
65 вне таблицы, вот это будет
01:55:46
e мы ставим 65 и E и говорим F5 X или a a
01:55:53
и у нас есть 5f, так что это 5f, что такое 5f
01:55:58
Итак, мы смотрим здесь в таблице: 5f — это
01:56:01
подчеркни, окей, и в основном ты ты
01:56:04
можно просмотреть весь список, вот это
01:56:06
на самом деле, что делает for Loop
01:56:08
это происходит одно за другим, и оно говорит
01:56:10
окей, раскодируй этот символ и сделал
01:56:12
пользователь вводит это и ввел ли пользователь
01:56:14
это и ввел ли пользователь это и
01:56:17
ты знаешь и так далее и тому подобное
01:56:23
Итак, когда все декодировано, мы можем видеть
01:56:25
что большой секрет в том, что теория big uncore
01:56:30
секрет, вот что происходит
01:56:32
вещь ожидает, что пользователь введет
01:56:36
большой секрет, как и первые персонажи
01:56:39
что бы пользователь ни вводил, что он
01:56:40
введите после, это не имеет большого значения, так как
01:56:42
пока начальные символы являются
01:56:45
большой секрет, поэтому, если пользователь вводит
01:56:48
большой секрет, что за Loop будет идти
01:56:51
до конца и так и будет
01:56:53
прекратить проверку на последнем символе
01:56:57
большой секрет, который равен нулю, но если
01:57:00
проверки завершаются неудачно до этого момента времени
01:57:03
значение указателя P, большой секрет, забота
01:57:06
собираюсь указать на что-то перед
01:57:08
ноль, который будет не нулем, поэтому, если
01:57:11
ты идешь сюда и смотришь на это
01:57:13
для цикла вы можете увидеть, когда он выйдет
01:57:16
здесь если символ по адресу p
01:57:19
ке, большой секрет, забота равна нулю, это
01:57:23
указывает, что пользователь ввел в
01:57:25
как минимум секретный код и что
01:57:28
это означает, что если пользователь ввел
01:57:29
секретный код иди и сделай все это в
01:57:32
вот если бы они не ввели секрет
01:57:34
код, затем идите и просто верните нуль в
01:57:37
вызывающего абонента, чтобы мы могли фактически поместить
01:57:39
оставьте комментарий здесь, поставив курсор
01:57:41
там, и мы можем сказать, если пользователь в
01:57:44
наименее введённый секретный код продолжить
01:57:49
потому что мы не знаем, что это будет делать
01:57:50
пока еще правильно, а потом есть наш
01:57:52
прокомментируйте прямо здесь и тогда это правильно
01:57:54
здесь, вероятно, собирается расшифровать
01:57:58
что-то похоже на то, что это на самом деле
01:58:00
декодирование чего-то еще, потому что если вы
01:58:02
посмотри здесь, есть еще один для Loop и
01:58:04
это на самом деле расшифровка чего-то такого
01:58:06
мы не собираемся попадать в этот CU, я
01:58:07
скажу тебе прямо сейчас, это что-то вроде
01:58:08
декодирование аналогичной строки, и это
01:58:11
ответ, который отображается, и
01:58:13
причина, по которой он закодирован, заключается в том, что вы не можете
01:58:14
просто посмотрите на необработанный двоичный файл и увидите
01:58:16
строка правильная, так что в общем, что я могу
01:58:18
сделать, я могу просто оставить комментарий здесь
01:58:20
и ты можешь посмотреть на это сам, если хочешь
01:58:22
хочу, э-э, это одно и то же
01:58:24
как то, через что мы только что прошли, поэтому я
01:58:25
собираюсь сказать, расшифруй секрет и
01:58:29
верните его вызывающему абоненту, так что это просто
01:58:31
небольшой комментарий, который я собираюсь оставить
01:58:33
вот и вот что происходит прямо здесь
01:58:35
итак, в основном, что делает эта функция
01:58:37
это проверка того, что ввел пользователь
01:58:39
если пользователь ввел хотя бы секрет
01:58:42
код они могут ввести больше, но если но они
01:58:44
должен хотя бы иметь секретный код
01:58:46
начало этого, если бы они вошли хотя бы
01:58:47
секретный код, который вернет эта штука
01:58:50
с декодированной строкой, которая похожа на
01:58:53
специальный код, а если нет, то просто
01:58:55
верните ноль, поэтому давайте попробуем ввести
01:58:57
секретный код здесь, чтобы мы вошли в Лор
01:59:01
назад, а затем мы введем
01:59:04
секретный код, очевидно, я его ввел
01:59:07
неправильно, ну, так что это такое, о, это
01:59:10
большой секрет, окей, большой секрет
01:59:14
большой секрет, большой секрет, ох, я
01:59:17
извини, ладно, Le Door du Back, большой
01:59:24
секрет, эй, вот наш маленький флаг, верно
01:59:27
окей, в любом случае, эта часть верна
01:59:29
вот эта часть находится здесь
01:59:31
расшифровано прямо здесь, особенно нравится
01:59:33
прямо здесь, так что это происходит
01:59:35
и это расшифровка, это другое дело
01:59:37
это exord с AA, поэтому он хранится в
01:59:39
память, это происходит, ты знаешь, что это происходит
01:59:41
фактически декодировано, а затем вернуться к
01:59:43
с абонентом все в порядке, так что если мы сейчас вернемся к
01:59:46
вызывающий объект этой функции, так что я просто
01:59:48
собираюсь вернуться, а что произойдет, если
01:59:50
мы возвращаем указатель, который равен нулю
01:59:55
окей, это значит, что правильный код не был
01:59:57
вошли и мы уже знаем, что происходит
01:59:59
код не найден, нет
02:00:01
больше возможностей в этой программе И т. д. мы
02:00:03
знаю это, но если это вернет ненулевое значение
02:00:06
он перейдет к этому оператору else и
02:00:08
в конечном итоге отображаются некоторые вещи, которые вы можете
02:00:10
теперь получите доступ к специальным функциям, так что это
02:00:13
в конечном итоге отображает возвращаемое значение и
02:00:15
мы действительно можем это увидеть, так что возврат
02:00:17
значение — это указатель результата кода, и если мы
02:00:20
на самом деле иди и щелкните правой кнопкой мыши по коду
02:00:21
указатель результата, и мы вводим вторичный
02:00:24
выделите, мы видим, что это выводится
02:00:27
к терминалу прямо здесь, а затем
02:00:29
выводит на терминал, теперь вы можете
02:00:31
получить доступ к специальным функциям, и если мы пойдем
02:00:33
здесь мы видим, что это именно то, что
02:00:34
произошло вот код и вот
02:00:37
что теперь вы можете получить доступ к специальным функциям
02:00:39
ОК, вы можете видеть здесь, это
02:00:41
случай случай сбоя, где код
02:00:43
введено неправильно, и вы можете увидеть
02:00:45
этот Local 54 равен FFF f f FF, а затем
02:00:49
вы можете увидеть здесь в случае успеха
02:00:51
вот это локальное 34 равно 0, поехали
02:00:54
через это очень быстро все происходит
02:00:55
чтобы дать нам немного окунуться в
02:00:57
здесь дело в разборке, так что давайте
02:00:59
возьмем случай неудачи, случай неудачи
02:01:02
fffff похоже на -1, это просто
02:01:05
другое представление негатива -1
02:01:07
предполагая, что место назначения
02:01:11
32 бита, это в основном 8 FS, что
02:01:14
если мы перейдем к нашему маленькому мини
02:01:16
доска здесь, так что если мы пойдем сюда и мы
02:01:18
наберите 1 2 2 3 4 5 6 7 8 вот это
02:01:21
на самом деле четыре байта правильно четыре байта
02:01:24
32 бита — это нормально, а 32 бита — это двойное слово.
02:01:29
жаргон дизассемблирования, это по крайней мере когда
02:01:32
ты разбираешь какой-то интел
02:01:33
архитектура двоичных PE-исполняемых файлов, когда
02:01:36
мы ссылаемся на двойное слово, так что давайте пройдемся
02:01:38
этот действительно быстрый укус — 8 бит и
02:01:41
вот пример укуса, ну, ты знаешь
02:01:43
АА, мы видели, что вы знаете, в
02:01:46
это была наша маленькая стоимость декодирования
02:01:49
что наше маленькое ключевое слово — 16
02:01:52
биты, а примером слова может быть
02:01:55
хм 1 2 3 4 например двойное слово 32
02:01:59
бит, и это будет похоже на
02:02:01
пример, который мы видели там, это FF FF
02:02:04
FF FF или другой пример 1 2 3 4 5 6 7 8
02:02:09
окей, четверное слово состоит из 64 бит, и это
02:02:13
по сути, это будет вдвое больше
02:02:15
поэтому мы говорим о 64-битном значении и
02:02:18
они получаются довольно большими, L, окей, и так далее
02:02:21
здесь подразумевается, что Local 54
02:02:24
и если мы действительно пойдём и наведем курсор
02:02:26
это вы можете видеть, там написано неопределенное
02:02:28
двойная длина слова, так что это 4
02:02:32
байтовое значение, чтобы вы могли видеть, если мы
02:02:34
выделите здесь эту строку, окей
02:02:36
выделяет эту строку, так что давайте поднимемся сюда
02:02:38
и просто выдели любую другую строку, окей
02:02:40
и теперь я собираюсь вернуться к
02:02:41
это, и вы можете видеть, что это подчеркивает это
02:02:43
линия прямо здесь и сейчас, если я пойду и нажму кнопку
02:02:45
средней кнопкой мыши над Local 54, вы
02:02:48
см. Это выделит свет на других местных
02:02:50
54 в контексте это своего рода
02:02:52
Отличная маленькая функция и что
02:02:54
Происходящее: вот вы заметили, что есть
02:02:56
вот эта номенклатура, в которой написано dword
02:02:58
указатель, и теперь у него есть RBP плюс Local 54
02:03:03
Я бы предложил заняться
02:03:05
дизассемблирование и язык ассемблера будут
02:03:07
быть просто целым видео в нем
02:03:09
и само по себе и, вероятно, есть
02:03:11
там много таких, я мог бы сделать
02:03:13
один, я не знаю, согласитесь ли вы, ребята,
02:03:14
интересно глубже погрузиться в это
02:03:17
эээ, но с чего бы я начал
02:03:19
это, вероятно, попытка объяснить
02:03:21
немного о процессоре и различных
02:03:23
зарегистрируйся сейчас, наверное, многие из вас
02:03:25
наверное, уже знаю об этом, но для
02:03:27
те из вас, кто этого не делает, на самом деле
02:03:28
быстро процессор имеет много регистров, таких как
02:03:31
Rax и RBX и rcx и RDX и RBP для
02:03:38
пример и они все разные
02:03:39
регистров и в зависимости от модели
02:03:41
У вас есть процессор и какая эпоха процессора в
02:03:46
2000-е или 1990-е, хм
02:03:49
имена регистров могут быть разными и
02:03:51
они могут иметь разные размеры, когда мы
02:03:53
поговорим о Раксе, о котором мы говорим
02:03:55
64-битные регистры значений, поэтому эти значения
02:03:59
эти регистры 64-битного процессора могут хранить
02:04:02
такие большие значения, но вы можете
02:04:04
также представляют 32-битные значения в 64-битном
02:04:09
зарегистрируйтесь, и это делается постоянно
02:04:10
и вы также можете иметь способы ссылки
02:04:13
к частям определенного регистра
02:04:16
так что если вы ссылаетесь на EA, вы имеете в виду
02:04:20
в 32-битную часть регистра Rax
02:04:24
и ты знаешь, что было время
02:04:26
когда у вас были только 32-битные процессоры, где
02:04:30
Регистр eax рассматривался как
02:04:33
большой, типа «о, это больше»
02:04:35
значение, которое оно может содержать 32 бита.
02:04:37
продвинулись вперед, теперь у нас есть Ракс, который
02:04:40
это 64-битный регистр, и он составлен
02:04:43
частично с помощью старого регистра eax, который
02:04:46
половина из этих 64 бит, потому что, поскольку они
02:04:49
продвинулись вперед, они как бы просто удвоились
02:04:51
вещи и придумали новые названия для
02:04:53
новые вещи, сохраняя при этом назад
02:04:55
совместимость со старыми названиями и
02:04:57
они тоже так делали, когда уходили из
02:04:59
От 16 до 32 бит, так что, если вы заметили здесь, э-э
02:05:03
у вас это fffff равно Local 54 и
02:05:07
что он здесь делает, так это сохраняет
02:05:10
в RBP плюс Local 54 он хранит это
02:05:14
значение fffff, поэтому Local 54 по сути является
02:05:19
расположение стека, и мы не собираемся
02:05:21
углубиться в подробности этого права
02:05:23
сейчас, но на самом деле то, что он здесь делает, это
02:05:25
здесь нужно немного посчитать, чтобы
02:05:27
вычислить местоположение в стеке
02:05:31
где он будет хранить это значение
02:05:34
что является neg1, и хотя это выглядит
02:05:36
как f f f f FF, если посмотреть на это как на
02:05:39
32-битное значение теперь рассматривается как ne1, если мы
02:05:42
перейдите к нашему маленькому калькулятору здесь, и мы
02:05:44
иди, давай пойдём в квадро, давай проясним
02:05:47
все и вставить ффффф ффффф и
02:05:51
вы можете видеть, что оно также равно 4
02:05:54
миллиард и т. д. и т. п., верно, но если мы пойдем
02:05:57
и измените величину на dword и
02:06:00
затем мы набираем FF FF FFF FF, вы можете увидеть
02:06:04
в десятичном формате, когда все, что у вас есть, это 32 бита
02:06:08
и у тебя там все Fs на высоте
02:06:10
бит установлен в единицу, что делает число
02:06:14
отрицательный, и так уж получилось, что
02:06:15
fffff F FFF FF в 30-битном значении
02:06:19
рассматривается как Нега -1 и еще можно
02:06:21
сохраните это в 64-битном значении, но если
02:06:25
понимание заключается в том, что ты только собираешься
02:06:27
посмотреть на 32 бита больших 30
02:06:30
64-битное значение, тогда компьютер сможет
02:06:32
посмотри на это или посмотри на это в зависимости от
02:06:34
контекст и какие операции
02:06:36
выполняется, он может рассматривать это как
02:06:38
отрицательный, и это звучит как-то
02:06:41
типа вовлечен в какие-то дела прямо сейчас, потому что
02:06:43
это не пошаговое руководство по
02:06:46
процессор или его регистры и тому подобное
02:06:49
поэтому не позволяйте этому краткому объяснению
02:06:51
бросить тебя или заставить тебя почувствовать, что это
02:06:53
действительно сложно, это легко
02:06:56
понять, как только вы начнете сосредотачиваться на этом
02:06:58
и как только у вас будет правильное представление и
02:07:00
такие вещи, поэтому я просто даю
02:07:02
небольшой небольшой намек на некоторые вещи
02:07:04
вот так это тоже может быть немного
02:07:06
сбивает с толку, и просто не позволяйте этому сбивать с толку
02:07:08
ты в порядке, так что в основном происходит то, что происходит
02:07:11
это сохранение отрицательного в этом
02:07:13
местоположение и то, что вы увидите, будет позже
02:07:16
на него загружается тот негатив, который он
02:07:19
сохранено ранее в секретной строке
02:07:22
указатель, и вы, возможно, хорошо скажете, почему
02:07:24
это загружает его в секретную строку
02:07:26
указатель, если это возвращаемое значение
02:07:28
Нега -1 в случае отказа почему это
02:07:31
ну, положив это туда, это просто
02:07:32
потому что мы назвали эту переменную ранее
02:07:36
потому что эта переменная использовалась для
02:07:38
что-то еще раньше, и мы назвали это
02:07:40
в зависимости от того, как он использовался, поэтому, если мы
02:07:44
щелкните указатель секретной строки, а затем
02:07:46
нажмите среднюю кнопку мыши, чтобы
02:07:48
активируйте выделение и затем наведите курсор
02:07:50
над этим в G в гидре здесь в гидре так
02:07:54
вы можете увидеть в небольшом всплывающем окне
02:07:56
гидра, это маленькое полезное всплывающее окно
02:07:58
показывая нам, что указатель секретной строки
02:08:00
регистр Rax, так что на самом деле это не
02:08:04
ячейка памяти, но на самом деле это процессор
02:08:07
зарегистрируйтесь так раньше, когда мы были
02:08:09
присваивая указателю секретной строки, мы
02:08:11
на самом деле присваивали значение
02:08:14
Регистр Rax, давайте вернемся к этому
02:08:17
местоположение, так что, если я смогу найти, найди наше
02:08:19
использование секретного указателя строки, где было
02:08:22
это было прямо здесь
02:08:25
где-то я верю, да, позволь мне, позволь мне
02:08:27
на самом деле UNH подчеркивает это, а затем
02:08:29
мы собираемся пойти сюда, вообще-то, позволь мне
02:08:31
позвольте мне удалить второстепенное выделение
02:08:33
давайте удалим это выделение, а затем
02:08:35
давайте нажмем на указатель секретной строки и
02:08:38
давайте на самом деле добавим второстепенный момент
02:08:41
на это, так что теперь у нас это выделено
02:08:43
вот и это то место, где мы были
02:08:45
звонил Систеру и мы назначали
02:08:48
этот указатель на указатель секретной строки
02:08:52
который мы передавали в эту функцию
02:08:55
здесь называется получить код и что
02:08:57
на самом деле здесь происходит, если ты посмотришь, эээ
02:09:00
этот вызов, если мы выделим эту строку и
02:09:03
идем и смотрим, что там подсвечивается
02:09:05
в окне разборки вы можете увидеть
02:09:07
на самом деле это звонок на
02:09:10
функция, называемая базовой строкой, двоеточие, двоеточие
02:09:13
Сестер, это не должно нас удивлять
02:09:15
но одну вещь, которую вы должны знать о
02:09:17
соглашение о двоеточии в 64-битной программе
02:09:21
вот так в среде Windows
02:09:23
что когда вы вызываете такую ​​функцию
02:09:26
возвращаемое значение, если есть возврат
02:09:29
значение из этой функции, которое есть
02:09:31
возвращаемое значение является указателем на
02:09:34
первый символ строки, которая
02:09:36
возвращаемое значение возвращается в Rax
02:09:40
зарегистрируйтесь, поэтому позвольте мне объяснить это, и если мы
02:09:42
выделите эту строку и давайте ее выведем
02:09:44
к нашей доске, которая у нас была
02:09:47
раньше здесь, где мы были вроде как
02:09:48
объясняя это, мы показали
02:09:51
это раньше и что я хочу
02:09:53
do - это своего рода дополнение, давайте просто
02:09:55
просто переместите эту штуку вниз на секунду
02:09:57
что я делаю, так это разборку
02:10:00
вот это функция вызова
02:10:03
что мы только что видели и что он делает, я
02:10:05
собираемся избавиться от всего этого, так что если мы пойдем
02:10:07
G gidra здесь вы можете видеть, что он делает
02:10:09
этот вызов прямо здесь, вызов базовой строки
02:10:12
Seaster и то, что он делает, это
02:10:14
вызов этой функции и этой функции
02:10:17
собирается вернуться в реестр Rax
02:10:20
адрес первого символа
02:10:24
эта строка и причина, по которой она
02:10:25
собираюсь вернуть этот адрес в Раксе
02:10:28
потому что это стандарт для
02:10:31
соглашение о вызовах по этому конкретному вопросу
02:10:33
платформа, чтобы вы могли найти вызов
02:10:36
соглашение для любой конкретной платформы
02:10:38
конкретный двоичный файл, который вы используете, и
02:10:40
как он скомпилирован и что использует
02:10:43
внутри себя, потому что там есть
02:10:45
ничего о процессоре, который говорит хорошо вам
02:10:47
знайте, что вам нужно вернуть возвращаемое значение
02:10:50
в Рексе тема о конвенциях вызова
02:10:53
может быть весьма затруднительно, эта вставка не
02:10:55
собираюсь обсудить все аспекты всего
02:10:58
соглашения о вызовах, конечно, поскольку в
02:11:00
в этом видео мы ориентируемся на 64-битную версию
02:11:03
Исполняемый файл Windows PE, давайте типа
02:11:06
обсудить некоторые основы x64
02:11:09
соглашения о вызовах как для окон, так и для
02:11:11
Linux для обеих окон и Linux Rax
02:11:13
регистр, который является 64-битным регистром,
02:11:16
используется для возврата 64-битных значений
02:11:19
или меньше как в 64-битных Windows, так и в Linux
02:11:22
этого достаточно, чтобы хранить значение указателя, поэтому
02:11:24
возвращаемое значение, которое является указателем, может быть
02:11:26
возвращается в регистр Rax, но Rax
02:11:29
регистр также можно использовать для возврата
02:11:31
что-то вроде целого числа или что-то в этом роде
02:11:33
даже так просто, как символьное значение, когда
02:11:36
когда код в 64-битной версии Windows или
02:11:38
Приложение Linux вызывает другую функцию
02:11:41
в этом приложении начальный
02:11:44
аргументы попадают в регистры в Windows
02:11:47
эти начальные регистры будут rcx RDX
02:11:50
R8 и R9 в Linux — это RDI RSI.
02:11:54
RDX rcx R8 и R9 для случаев, выходящих за рамки этих
02:11:59
начальные аргументы функции
02:12:01
соответствующее соглашение о вызовах для
02:12:03
ситуация определяет, насколько дополнительные
02:12:06
аргументы обрабатываются, имейте в виду, что
02:12:08
мы говорим об одном и том же процессоре
02:12:11
вот прямо так учитывая любой Intel или AMD
02:12:13
процессор, который у тебя будет
02:12:15
те же регистры, но обратите внимание, как опер
02:12:18
в системах используют их по-разному, вот это
02:12:20
просто чтобы подчеркнуть, что с учетом любого
02:12:22
один процессор и имеющиеся у него регистры
02:12:25
ничего такого, что действительно могло бы диктовать кому-либо
02:12:28
операционная система должна использовать эти
02:12:30
регистрируется определенным образом независимо от
02:12:32
о различиях между этими двумя
02:12:34
случаях полезно знать, что 64-битная версия
02:12:37
или меньшее целое число возвращается в Rax, но
02:12:40
действительно, когда имеешь дело с очень распространенным
02:12:41
сценарий, подобный 64-битной Windows
02:12:44
приложения или 64-битный Linux
02:12:46
приложения ищут вызов
02:12:48
конвенция и выяснение деталей
02:12:50
в данный момент, если ты не был
02:12:52
погрузиться в это на какое-то время - это супер
02:12:54
легко, я прыгаю по множеству разных
02:12:57
языки во многих разных
02:12:58
среды и и одна из вещей, которые я
02:13:01
не трать мозги, циклы пытаются
02:13:03
сохранить информацию, которой я не являюсь
02:13:05
немедленно используя и более подробную информацию
02:13:07
что вы берете на себя, углубляясь в
02:13:10
различные области, которые вы также можете найти
02:13:12
это хороший способ не тратить зря
02:13:14
мозговые циклы дали этому возможность
02:13:17
быстро искать информацию очень
02:13:19
распространен среди исследователей и разработчиков
02:13:22
и еще много чего, если ты новичок в этом
02:13:23
где ты немного напуган тем, как
02:13:25
ты все это запомнишь, может быть
02:13:27
ты должен иметь в виду, что ты не
02:13:28
действительно нужно все это запомнить, просто
02:13:30
нужно уметь быть достаточно изобретательным
02:13:32
чтобы получить информацию перед вашим
02:13:34
лицо, когда оно вам нужно, так что конечный эффект
02:13:37
этого вызова - вернуть этот адрес
02:13:39
в регистре Ракса, что для этого сделала гидра
02:13:42
мы здесь вместо того, чтобы поместить сюда Ракса
02:13:46
что он мог бы сделать, это дало нам
02:13:47
удобочитаемая версия текста, которую мы
02:13:50
на самом деле переименован во что-то, чтобы быть четным
02:13:52
больше, э-э, имеет отношение к тому, кем мы были
02:13:54
анализируя, мы назвали это секретной строкой
02:13:57
указатель, но реальность такова, что если ты пойдешь
02:13:59
вот и секрет разборки
02:14:01
строковый указатель действительно будет, если я выделю
02:14:04
это и наведя курсор, вы можете увидеть в
02:14:06
наведите курсор на указатель на секретную строку здесь
02:14:09
на самом деле это Rax, который является регистром RX
02:14:12
возвращаясь к концу
02:14:13
функция здесь, давайте назовем ее
02:14:16
здесь переменная, назовем это э-э
02:14:18
возвращаемое значение или назовем это кодом выхода
02:14:22
в случае неудачи все в порядке, а затем это
02:14:25
один из них — код выхода в случае успеха
02:14:29
они просто используют разные
02:14:30
места, э-э, учитывая другой контекст
02:14:33
в котором они происходят, но оба они
02:14:35
попадаем в регистр Rax, так что мы
02:14:38
собираюсь следить за этим прямо сейчас, поэтому, если мы
02:14:39
иди сюда, ты увидишь, что идет FFF
02:14:42
загружен в код выхода EBP и не работает
02:14:45
случае, а затем здесь выполняются какие-то вещи
02:14:47
здесь, чтобы очистить некоторые строки
02:14:50
которые были в использовании и после всего этого чистые
02:14:52
происходит up, затем он принимает значение, которое
02:14:55
хранился здесь, и он загружает его
02:14:57
в секретный указатель строки, а секретно
02:14:59
Строковый указатель на самом деле является Rax, поэтому для
02:15:02
прямо сейчас, так как мы закончили с
02:15:04
более ранний анализ, в котором мы хотели
02:15:07
секретный указатель на строку, на которую вы знаете, что мы
02:15:09
хотели представить его под тем именем, которое мы
02:15:11
мог бы переименовать это прямо сейчас, если бы
02:15:14
мы хотели, и я собираюсь переименовать
02:15:16
эта переменная, и я назову ее
02:15:19
хм, я назову это значением Ракса
02:15:23
окей, и когда мы это сделаем, теперь это называется
02:15:25
Значение Rax, по которому можно сказать, что оно было переименовано
02:15:28
здесь тоже все в порядке и что такое
02:15:30
происходит, давайте перейдем к этому делу вот так
02:15:32
мы идем сюда и теперь он загружает это
02:15:34
отрицательный в регистр Rax и
02:15:37
затем он переходит на вот этот ярлык, так что
02:15:40
давайте выделим эту метку, нажав
02:15:42
среднюю кнопку мыши и прокрутите вниз
02:15:44
и если ты увидишь, что оно прыгает сюда и
02:15:46
это код, который будет
02:15:48
уберите кучу вещей и выйдите так
02:15:49
давайте нажмем L, чтобы изменить этот ярлык, и
02:15:52
давайте назовем этот выход «Фанк», и теперь это
02:15:54
называется выходом из фанка, так что если мы вернемся к
02:15:57
что это звонило, давай вернемся сюда
02:15:59
пойдем отсюда, так что давайте выделим
02:16:01
это снова этот код выхода EVP не работает
02:16:04
кейс загружается отрицательным
02:16:06
Значение FFF, и вы можете увидеть двоичный файл
02:16:09
это прямо здесь, а потом давай сделаем середину
02:16:11
Нажмите кнопку мыши на этом, и мы увидим это
02:16:13
загружается обратно в Rax
02:16:16
зарегистрируйтесь прямо здесь, а затем вот это
02:16:18
прыгает на лейбл под названием Exit Funk, так что
02:16:22
в основном это загружает Rax с NE -1 и
02:16:26
затем он прыгает сюда, чтобы выйти из Funk
02:16:28
выход Funk примет значение, которое
02:16:31
в Rax, и теперь он сохранит его в RDI.
02:16:35
кажется, это делается временно
02:16:38
потому что для этого нужно использовать Rax
02:16:41
здесь вещи, и он не хочет
02:16:42
стереть то, что там есть, потому что
02:16:45
это значение должно вернуться вызывающему абоненту
02:16:47
поэтому он временно сохраняет это в
02:16:50
Регистр RDI, который является еще одним 64-битным
02:16:53
зарегистрируйтесь, и если мы перейдем сюда к этим
02:16:56
регистрируется, что есть RDI и RSI, и мы
02:16:59
можно зайти, там много всего
02:17:00
Флаги регистрируются и многое другое мы
02:17:02
можно было бы поговорить об этом, так что это ставит
02:17:04
значение Rax, и на самом деле мы могли бы
02:17:07
на самом деле мы сделаем этот ярлык еще яснее,
02:17:08
вообще-то, мог бы просто сказать Ракс, давай просто
02:17:11
назовите это значение Rax, окей, и это
02:17:14
загружаем это в регистр RDI и
02:17:18
тогда, эм, оно загрузится правильно
02:17:20
обратно из RDI обратно в Ракс, а затем в Ракс
02:17:24
его больше не трогают, и это просто любезно
02:17:27
из спускается сюда и возвращается в
02:17:30
вызывающий абонент, и вот как выглядит код выхода
02:17:32
возвращается к вызывающему абоненту в случае неудачи
02:17:34
случае, если мы перейдем к успешному делу, мы
02:17:36
здесь можно увидеть, что он устанавливает эту вещь
02:17:38
код выхода в случае успеха устанавливает его на
02:17:41
ноль, давайте подчеркнем, что это
02:17:43
место в стеке, чтобы вы могли видеть
02:17:45
он показывает расположение стека, и это
02:17:47
загружая ноль в этом месте, и вы
02:17:50
вижу, здесь те же нули, которые ты знаешь
02:17:52
раньше у нас был FFF, но в данном случае это
02:17:54
все нули, давайте сделаем среднюю кнопку мыши
02:17:56
по этому поводу, и мы видим нечто подобное
02:17:58
шаблон: он очищает некоторые строки
02:18:00
и после того, как он очистит эти строки, он
02:18:02
приходит сюда и начинает загружаться
02:18:05
тот ноль, который он хранил в
02:18:07
расположение стека прямо в Ракс
02:18:09
зарегистрируйтесь и заметьте, здесь этого нет
02:18:12
нужно пойти и прыгнуть, чтобы выйти из функции
02:18:15
потому что функция выхода оказывается
02:18:17
следующий сразу после этого, это очень
02:18:20
часто встречается, когда вы смотрите на сборку
02:18:22
Язык, если мы вернемся сюда, вот
02:18:24
этот неудачный случай, и он не хочет
02:18:26
запустите весь этот код в случае успеха
02:18:28
и ты увидишь, как он перепрыгнет через все это
02:18:31
код здесь и здесь, но успех
02:18:34
кейс не должен ничего перепрыгивать
02:18:36
потому что это происходит прямо перед
02:18:39
естественно успешный код функции выхода
02:18:42
так что это просто естественным образом вливается прямо в
02:18:45
этот код и, э-э, и это не
02:18:48
необычная вещь: загружается ноль
02:18:50
в регистр Rax, а затем это происходит
02:18:52
та же самая обработка, это на самом деле
02:18:54
собираюсь сохранить это значение в RDI, а затем
02:18:58
он собирается кое-что почистить
02:18:59
а затем он загрузит эту резервную копию
02:19:02
в Rax, а затем возвращает ноль в
02:19:04
звонивший и, кстати, если мы пойдем сюда и
02:19:07
мы вводим, как демо-приложение, и я ввожу
02:19:12
эээ, от двери назад, а теперь позвольте вам печатать
02:19:16
в неправильном коде, и я спросил Powershell
02:19:19
какой был последний код выхода, который вы можете увидеть
02:19:20
будет минус 1, если я приду сюда и скажу Лор
02:19:24
де назад, окей, и я думаю, что это очень важно
02:19:29
секрет, и я нажал Enter, это успех и
02:19:31
если мы посмотрим на код последнего выхода в
02:19:34
случай успеха, это ноль, это наше
02:19:35
анализ от разборки вещей, если мы
02:19:38
перейдите и посмотрите исходный код
02:19:40
в случае сбоя он возвращает netive -1
02:19:43
и когда он успешен, он возвращается
02:19:46
ноль, так что BAS, по сути, то, чем мы были
02:19:48
можно сделать с помощью гидры, у нас есть
02:19:51
смог понять, что
02:19:53
этот исходный код может выглядеть так и
02:19:55
gedra на самом деле в своем декомпиляторе
02:19:58
на самом деле очень помог нам в этом
02:20:00
эта гидра гораздо более продвинута, чем
02:20:03
как это было раньше
02:20:05
дней, если вы вернетесь на пару десятилетий назад
02:20:07
прежние времена дизассемблеров и
02:20:10
реверс-инжиниринг, которого вы не получили
02:20:12
декомпилировать вообще что угодно
02:20:14
буквально пришлось пройти сборку
02:20:16
и начните разбирать это на части и использовать
02:20:18
этикетки и все такое
02:20:20
мы сделали это с декомпилированным кодом, но ты
02:20:22
не получил декомпилированный код, поэтому ты
02:20:24
пришлось очень много поработать, так что теперь
02:20:26
с декомпиляцией, и это здорово
02:20:29
роскошь, доступная в инструменте
02:20:31
как гедра, сегодня ты получишь все это
02:20:33
преимущества, потому что вы можете посмотреть
02:20:35
в гораздо более простом коде для интерпретации как
02:20:37
как бы запутанно это ни выглядело, поверьте мне
02:20:40
это очень роскошно, ты получаешь много
02:20:42
вещей, которые дают вам то, что если
02:20:45
ты возвращаешься на десятилетие или два назад или
02:20:47
что-то в этом роде, ну ты
02:20:48
не надо этой роскоши наоборот
02:20:50
инженерные инструменты вчерашнего дня, окей, так
02:20:53
это был краткий обзор реверса
02:20:55
путем сосредоточения внимания на декомпиляции
02:20:58
окно здесь, в гидре, теперь следующее
02:21:00
дело в том, что я хочу пойти туда, где эти
02:21:02
двоичные файлы и на самом деле не первое, что
02:21:04
Я хочу выйти из гедры, так что давай
02:21:07
на самом деле сохраним нашу информацию, так что давайте
02:21:09
закройте этот проект, и вот где
02:21:12
отладочная версия - это та, которую мы
02:21:14
только что работали, и вот
02:21:17
релизную версию, поэтому я хочу взять эти
02:21:19
и отрежь это, а потом я хочу переехать
02:21:21
они здесь, и давай просто позвоним сюда
02:21:26
переместите приложения или приложение правильно, поэтому мы просто переместим
02:21:30
приложение здесь, я не могу этого сделать
02:21:33
файлы открыты в другой программе, посмотрим
02:21:35
это эта программа, попробуй еще раз, мы?
02:21:38
в командной строке, может быть, ах да, давайте
02:21:41
закрой это и попробуй еще раз, поехали
02:21:44
может быть, хорошо сказать, почему ты только что
02:21:46
переместите те, которые я собираюсь объяснить
02:21:47
здесь вы видите две аранжировки
02:21:49
верхняя — оригинальная аранжировка
02:21:52
где exe и pdb находились рядом
02:21:56
сторона, когда PDB находится в том же самом
02:21:58
каталог, поскольку exe gedra может
02:22:01
найдите его, загрузите и используйте его символы
02:22:04
вторая композиция внизу имеет
02:22:06
переместил exe и PDB в
02:22:09
совершенно другие каталоги, чем
02:22:11
исходный каталог сборки, перемещающий
02:22:14
pdb из исходного каталога сборки
02:22:16
очень похоже на эффективно
02:22:19
удаление PDB, чтобы ни отладчик
02:22:22
ни Гедра не может найти PDB, который у нас мог бы быть
02:22:25
только что удалил PDB, но я хотел
02:22:27
держи это на случай, если я захочу пойти
02:22:30
туда и обратно между гедрами, используя
02:22:32
pdb с его символической информацией и
02:22:35
у гидры нет такого символического значения
02:22:38
информация доступна для этого
02:22:40
демонстрации мы собираемся использовать
02:22:42
расположение, подобное показанному на
02:22:44
нижняя часть экрана здесь, где
02:22:46
pdb недоступен для gedra и поэтому
02:22:49
все, что есть у gedra, это исполняемый файл
02:22:52
двоичный хм, пойдем, что я хочу
02:22:55
сделать, я хочу открыть только отладку
02:22:58
версия, но без файла символов, поэтому
02:23:01
что я хочу сделать, так это порезаться
02:23:03
и переместим файл символов, давайте просто позвоним
02:23:06
это символы отладки, окей, это просто
02:23:09
можно назвать как угодно, просто
02:23:11
переместите его в другую папку, потому что
02:23:13
Я не хочу, чтобы Гидра смогла его найти.
02:23:15
Я хочу иметь только exe и давайте сделаем
02:23:17
то же самое для выпуска, так что давайте возьмем
02:23:20
символы выпуска и вырезаем, окей, давай
02:23:22
создайте папку под названием «символы выпуска» и
02:23:26
мы собираемся вставить это релиз
02:23:28
символы теперь у нас есть бинарный файл выпуска
02:23:31
в своей папке, и у нас также есть
02:23:34
отладочный двоичный файл в отдельной папке, и если мы
02:23:37
ссылаться на те, что в гедре, гедра не будет
02:23:40
теперь смогу найти символы, хорошо
02:23:42
что мы изолировали двоичные файлы для
02:23:45
релизная и отладочная версии
02:23:46
без каких-либо символов, что мы собираемся сделать
02:23:48
мы собираемся запустить гидру, так что
02:23:50
пойдем туда, где наша копия гедры
02:23:53
это прямо здесь, поэтому мы собираемся удвоить
02:23:54
нажмите на это, и это должно запуститься
02:23:58
гидра, окей, гидра запущена, ну, мы
02:24:00
собираемся создать новый проект и мы
02:24:02
собираюсь сказать, что это не подлежит совместному использованию, и эээ
02:24:05
мы назовем это демо-приложением
02:24:09
отладка без символов, нажмите «Готово», и мы
02:24:12
собираюсь перейти к демо-версии, о нет, не демо-приложению
02:24:15
мы собираемся войти в перемещенное приложение и
02:24:18
затем мы перейдем к отладке и сейчас
02:24:20
мы собираемся перетащить это сюда
02:24:22
и мы собираемся нажать на все
02:24:24
значения по умолчанию
02:24:26
здесь и сейчас мы просто щелкнем
02:24:29
окей, и мы собираемся удвоить
02:24:31
нажмите, чтобы запустить анализатор э-эээ по умолчанию
02:24:34
здесь мы скажем да, что хотим
02:24:35
проанализировать, и сейчас мы просто собираемся
02:24:37
нажмите «Анализ» и, как и прежде, эээ
02:24:39
там будет какой-то статус на
02:24:41
анализ в нижнем углу и в
02:24:43
вообще-то, позволь мне починить окно
02:24:44
вот так, чтобы ты мог это видеть, позволь мне
02:24:46
на самом деле двигаться, двигаться, этот хруст, это
02:24:48
немного здесь, подожди, мы пойдем, окей
02:24:50
так что мы можем увидеть, что мы здесь
02:24:53
в этой точке входа, хорошо, поэтому я собираюсь
02:24:55
дважды щелкните по этому общему главному и
02:24:58
затем это переходит в общий основной SE и
02:25:01
тогда мы заглянем сюда и посмотрим
02:25:04
если мы сможем найти точку входа, вот
02:25:06
вызвать Main, и если мы перейдем к вызову
02:25:09
главное, что мы видим, это мысль и
02:25:12
тогда это подводит нас к тому, что выглядит
02:25:15
функция, теперь обратите внимание, что она называется fun1
02:25:18
141 у него есть имя, которое имеет
02:25:21
адрес, встроенный в него, так что если вы посмотрите
02:25:23
здесь, в этом окне, вы можете увидеть
02:25:25
вот начало основного
02:25:26
функция по этому адресу хедра не имеет
02:25:28
символы, поэтому он понятия не имеет, как назвать
02:25:30
это просто будет называться развлечением
02:25:33
функцию и дает ей имя, которое
02:25:35
соответствует адресу, по которому он расположен
02:25:37
нам решать, дать ему имя, и если мы
02:25:38
прокрути сюда вниз, ты сможешь увидеть
02:25:40
и позвольте мне расширить это сейчас, если вы войдете
02:25:42
здесь вы можете увидеть то же самое
02:25:44
строки, которые мы видели раньше, так что это
02:25:46
во многом это та же самая функция, что и
02:25:48
та же функция отладки, которой на самом деле нет
02:25:49
изменилось, но посмотрите, насколько это загадочнее
02:25:53
выглядит, потому что у нас нет символа
02:25:55
информация, это отладочная сборка
02:25:57
хм, в зависимости от характера кода
02:25:58
релизных сборок может быть еще больше
02:26:01
трудно понять, потому что они
02:26:02
выполнить большую оптимизацию, чтобы
02:26:04
код будет очень оптимизирован для
02:26:06
процессор не для разработчика
02:26:09
понимание в некотором смысле отладочной сборки
02:26:10
оптимизирован для целей отладки
02:26:14
это означает, что он на самом деле не оптимизирован
02:26:16
э-э, оптимум, если хотите, не оптимизируя
02:26:20
это более оптимально для отладки
02:26:24
цели, на которые разработчики могут обратить внимание
02:26:26
вещи и увидеть структуру больше
02:26:28
явно выпускать сборки, брать лицензию на
02:26:31
выбросить любую конструкцию из окна, если
02:26:33
это улучшит скорость работы программы
02:26:35
поэтому он может делать все, что хочет
02:26:37
эта программа была настроена на то, чтобы хорошо работать на
02:26:40
учитывая процессор, и это не особо беспокоит, так что
02:26:43
много о том, легко ли его отлаживать или
02:26:46
еще много чего, он просто хочет создать
02:26:47
самый быстрый код, поэтому мы все еще ищем
02:26:49
отладочный код здесь и так даже без
02:26:51
символы, это довольно роскошно, ух
02:26:54
ты знаешь, что это на самом деле было бы
02:26:55
считается Easy Street из-за
02:26:58
точка зрения обратного инжиниринга, так что
02:27:01
что мы могли бы сделать, так это как будто мы это знаем
02:27:03
это главное, чтобы мы могли действительно попасть
02:27:04
нажмите клавишу L и введите main, окей, ууу, мы
02:27:07
сделал это немного проще, и ты
02:27:10
знаю, что мы могли бы прийти сюда и
02:27:11
возможно, основываясь на памяти о том, что мы уже
02:27:13
знаю, если бы мы не знали программу
02:27:15
нам уже, возможно, придется серьезно посмотреть
02:27:16
это немного осторожнее, потому что мы
02:27:18
не получим ничего, нам будет нелегко
02:27:20
используйте имена в любом из этих прав, чтобы там
02:27:22
нет ничего, что нам могло бы понравиться, добрый
02:27:24
я пойду разберусь, но когда мы увидим
02:27:26
такая строка сейчас, если бы эта строка имела
02:27:28
было бы закодировано, это было бы больше
02:27:29
сложно понять, но эта строка
02:27:31
вроде как вы знаете, что можете посмотреть
02:27:33
это и типа что это за Лор?
02:27:35
похоже, это черный ход, так что мы
02:27:37
не знаю, что это за забавная штука
02:27:40
делает здесь, но он что-то делает с
02:27:42
Лор де вернулся сюда, чтобы мы могли увидеть это.
02:27:45
это подсказка какого-то разума и
02:27:47
так что похоже, что это может быть
02:27:49
выполнение некоторого вывода, так что по ходу дела
02:27:51
через это и во всем разобраться мы
02:27:53
действительно мог бы начать называть вещи так
02:27:55
как будто я мог бы назвать это счетом за
02:27:58
консоль уже вышла, хотя это не так
02:27:59
настоящее имя функции, это не так
02:28:01
действительно имеет значение, потому что имя функции
02:28:02
вообще-то, просто символично, пока я
02:28:05
придумать что-нибудь, что я смогу
02:28:06
понимаю, что я еду задним ходом, это нормально
02:28:09
вызываемая функция является
02:28:10
функция оператора вставки, которая находится
02:28:13
P два аргумента подсчитывают xre и строку
02:28:16
для вывода при реверсировании создания
02:28:18
идеальные этикетки не так важны, как
02:28:20
создание ярлыков, которые помогут вам достичь
02:28:22
ваши реверсивные цели в этом примере выберите C
02:28:25
потому что это просто и понятно
02:28:27
указывает, что вызов ведет к консоли
02:28:29
откровенно говоря, если вы знакомы с
02:28:31
традиционный C, например printf или print Lin
02:28:35
с другого языка, который вы могли бы использовать
02:28:37
здесь это символы вместо cout или
02:28:40
вместо оператора вставки вы
02:28:41
не обязательно тратить кучу времени
02:28:43
говорю: «Ой, как точно называется»
02:28:46
что это за звонок здесь, а потом иди и найди
02:28:49
выходит, что это оператор вставки
02:28:51
функции, могут быть случаи, когда
02:28:53
конкретный ярлык, который вы используете, действительно
02:28:55
важно, но в большинстве случаев, когда
02:28:57
ты имеешь дело с периферией
02:28:59
вещи, которых на самом деле нет на конкретном лейбле
02:29:01
важно, ты просто хочешь иметь возможность
02:29:03
понять в целом, что происходит, как
02:29:05
вы углубитесь в программу в этом
02:29:07
в конкретном случае мы знаем, что эта строка
02:29:09
выводится на экран и все ясно
02:29:11
он вызывает функцию, которая достигает
02:29:13
эта цель, поэтому нам просто нужно дать ей
02:29:15
ярлык, который позволит нам помнить, что мы можем
02:29:18
в данном случае даже не нужно это маркировать
02:29:20
но поставив там простой ярлык, возможно,
02:29:22
просто сделай так, чтобы все это выглядело немного меньше
02:29:23
загромождено и немного более понятно для нас
02:29:26
когда мы переходим к более важным областям
02:29:28
Итак, просматривая это и расшифровывая
02:29:32
все это немного сложнее
02:29:34
и есть разные подходы
02:29:35
в зависимости от контекста, но вы можете видеть
02:29:37
общий вид такого рода шоу
02:29:39
тебе нравятся струны, пожалуйста
02:29:41
введите это, чтобы это выглядело так
02:29:43
спрашиваю какое-нибудь имя и, если
02:29:45
вы вводите имя, оно входит в это
02:29:48
ld0 кажется это локальный ld0 кажется
02:29:52
типа это на самом деле звонит кому-то
02:29:55
функция с струнным ладором на спине и
02:29:58
возможно, это похоже на сравнение и
02:29:59
тебе придется пойти и начать выбирать
02:30:01
эти вещи отдельно, и это может стать совсем
02:30:03
задействовано в зависимости от контекста, но как
02:30:05
мы видим, что есть еще кое-что очень хорошее
02:30:07
структура здесь и с такого рода
02:30:10
простая программа, я не уверен, насколько она плоха
02:30:12
будет с выпуском кода без
02:30:15
символы, но почему бы нам не взглянуть на
02:30:16
выпустите двоичный файл и просто быстро
02:30:18
заглянем и посмотрим, как это выглядит, так что давайте
02:30:20
на самом деле возьми копию
02:30:24
отладка с помощью символов, а затем давайте получим
02:30:27
символы и сделайте копию оттуда
02:30:31
в
02:30:32
здесь и тогда давайте создадим релиз с
02:30:38
символы и давайте поместим релиз с
02:30:41
символы здесь, так что это первый выпуск
02:30:43
давайте возьмем
02:30:45
символы
02:30:48
и на самом деле теперь, когда у нас есть
02:30:49
релиз с символами, которые мы на самом деле
02:30:50
мне больше не нужны эти папки, так что я
02:30:53
можно удалить это и удалить это
02:30:55
так что теперь у нас есть только отладка и
02:30:58
тогда у нас есть отладка с символами
02:31:00
и то же самое, вот только релиз
02:31:02
а вот релиз с символами
02:31:04
сейчас мы запустим гидру
02:31:08
дважды, и мы собираемся создать новый
02:31:13
проект, и я назову его
02:31:15
отлаживать
02:31:17
с символами я собираюсь пойти в
02:31:20
перенес отладку приложения с помощью символов, и я
02:31:24
собираюсь вставить это
02:31:26
вот и скажи
02:31:29
да, нажму, окей, удвоится
02:31:35
нажмите да, давайте проанализируем
02:31:43
анализируем, окей, вот мы и подошли к главному
02:31:46
функция, и вы можете видеть, потому что у нас есть
02:31:48
символы, здесь есть некоторая информация
02:31:50
теперь это очень легко понять
02:31:53
не имеет наших переменных, которые мы
02:31:54
переименован, потому что это совершенно новый
02:31:56
проект, но то, что я хотел сделать, это просто
02:31:58
сравнить новый проект с символами
02:32:01
выпускать и отлаживать сборки, и что мы делаем
02:32:03
собираюсь сделать это снова пойти в Гидру, мы
02:32:06
собираюсь начать еще один
02:32:13
экземпляр, и мы собираемся сказать новый
02:32:15
проект, и мы собираемся сказать релиз
02:32:19
с символами эээ демо
02:32:21
релиз приложения с символами и мы собираемся
02:32:24
перейти к перемещенной версии приложения с символами
02:32:28
принесите сюда демо-приложение, это
02:32:29
релизная версия демо-версии
02:32:32
приложение нажмите ОК, возьмите все
02:32:45
значения по умолчанию
02:32:47
да, мы проанализируем, давайте перенесем это
02:32:51
вот, окей, ты видишь начало
02:32:54
здесь привели нас к действительно хорошему
02:32:56
Основная функция, давайте нажмем «ОК»
02:32:59
это и это привело нас к хорошему
02:33:01
основная функция тоже, но если мы сравним
02:33:03
релизная версия с отладкой
02:33:05
версия сейчас чё это не особо
02:33:09
эээ, такой код не получит
02:33:11
совершенно разные между ними двумя, но
02:33:15
будет какая-то разница, говорит сейчас
02:33:16
если вы посмотрите на это, в этом есть что-то вроде
02:33:18
структура, это отладочная версия и
02:33:20
поэтому, если вы пройдете этот урок и
02:33:22
ты делаешь это сам и сравниваешь
02:33:24
два, вы сможете увидеть, что
02:33:27
первый выпуск немного сложнее
02:33:30
расшифровать, если ты, если ты представляешь, что ты
02:33:32
не знаю оригинала
02:33:34
программа, потому что компилятор и
02:33:36
Linker собирается взять лицензию на работу
02:33:38
вперед и переставить все это по порядку
02:33:40
чтобы сделать его оптимальным для процессора, а не для
02:33:42
отладка не для разработчиков ты
02:33:44
знать рассмотрение с точки зрения
02:33:47
Логическая структура программы, поэтому мы
02:33:49
мы не собираемся проходить через это, но
02:33:51
здесь можно увидеть кучу
02:33:53
здесь происходит все, и это просто
02:33:56
меньше, чем этот приходит, и это вроде как
02:33:59
начинается сразу, как будто спрашиваешь типа
02:34:01
введите свое полное имя и прочее, и это
02:34:03
у кого-то это есть, введите свой полный
02:34:06
имя, а затем оно приходит сюда и
02:34:08
вот чек, есть кое-что
02:34:10
идет какая-то проверка, где он находится
02:34:12
ищу 15, вот что-то есть 15
02:34:16
это может быть встраивание некоторого C++
02:34:18
функциональность из библиотеки, которая может
02:34:20
быть сложным, другими словами, вы
02:34:23
фактически видя функции, которые были
02:34:25
поставил в очередь пришедшего компоновщика
02:34:28
из библиотеки C++ они могут иметь
02:34:29
был помещен прямо сюда, чтобы вы видели
02:34:31
встроенные вещи и причина, по которой
02:34:33
встроенный является оптимальным, это то, что в любое время, э-э
02:34:37
программе необходимо вызвать функцию или перейти
02:34:41
где-то инструкция перехода или вызов
02:34:43
инструкция особенно звонок
02:34:45
инструкция, где у вас есть параметры
02:34:46
тебе нужно настроиться, а потом звонить
02:34:48
другая функция, есть определенная
02:34:49
степень влияния на производительность, когда вы
02:34:52
когда вам нужно позвонить, если процессор
02:34:54
можно избежать необходимости
02:34:57
позвонить в другое место по коду
02:34:59
будет выполняться быстрее, так что вы будете
02:35:01
обратите внимание, что в оптимизированной программе это
02:35:04
действительно может воспользоваться
02:35:06
возможности встроенного функционала
02:35:09
из библиотеки в качестве примера или это
02:35:11
может быть даже ваш собственный код будет встроен
02:35:13
в другие области вашей программы вы можете
02:35:15
подумайте, что встраивание — это процесс принятия
02:35:17
какой-то код, который у вас есть в функции и
02:35:19
вместо того, чтобы вызывать ту функцию, которую вы приносите
02:35:22
функцию в то место, где она находится
02:35:24
назвал так вместо того, чтобы называть это
02:35:26
вы просто запускаете функцию прямо здесь
02:35:28
где это так называлось не подбирая
02:35:30
кроме этого, есть память
02:35:33
здесь происходит сравнение, мы этого не сделали
02:35:35
выполнить прямое сравнение памяти, мой
02:35:37
думаю, это заняло строковый класс
02:35:40
оператор равен функции и он встроен
02:35:42
это прямо здесь, в главном, потому что мы делаем
02:35:45
выполнить проверку качества, чтобы убедиться, что
02:35:48
пользователь ввел Лор, чтобы вернуться и что это
02:35:50
чем занимается, я случайно знаю от кого-то
02:35:53
прошлый опыт показал, что класс stlc
02:35:56
у него есть буфер для небольших строк, которые я
02:35:59
думаю, это где-то 15 16 символов и
02:36:01
помимо этого, он выполнит распределение
02:36:03
и когда я увидел это 15, вот это
02:36:06
0xf, что равно 15, я типа ох
02:36:09
здесь происходит какая-то проверка буфера
02:36:11
чтобы вы могли видеть, что он выполняет некоторые проверки
02:36:13
и говорю хорошо, если если это так
02:36:17
затем перейдите и используйте переменную указателя uh
02:36:19
в классе строк, иначе вы знаете
02:36:22
иди и сделай это, как будто их много
02:36:24
вещей, которые были помещены в нашу основную
02:36:26
функция, которую мы даже не писали
02:36:28
оригинальная программа, которой даже нет в
02:36:30
оригинальная программа, потому что это
02:36:32
более Оптимально, когда программа работает до
02:36:34
вытащить все это и встроить
02:36:36
вот так что не обязательно идти и звонить
02:36:38
в другие места, но когда мы отлаживаем
02:36:40
программу, и мы вызываем функцию, если
02:36:43
Компоновщик сохраняет эту функцию
02:36:46
где-то еще, где наша программа наша
02:36:49
небольшая функция, которую мы рассматриваем
02:36:50
не сильно меняется, когда мы смотрим на
02:36:53
нашу функцию, и мы видим, что она вызывает
02:36:55
где-то Логическая структура нашего
02:36:57
функция будет нам более понятна, потому что
02:36:59
мы увидим нашу функцию, мы увидим, что это
02:37:01
звонит куда-то еще, чтобы сделать что-то, что мы
02:37:03
могу пойти посмотреть это в другом месте
02:37:05
посмотрите, что делает эта функция, а затем
02:37:08
рассматривая эти вещи по отдельности, мы можем
02:37:10
я как бы понимаю, это немного
02:37:12
что эта функция похожа на черный ящик
02:37:14
он делает что-то, мы знаем, что он делает
02:37:17
и поэтому нам не обязательно это видеть
02:37:19
inter смешивается с нашим кодом, но когда
02:37:21
вы смотрите на оптимизацию кода
02:37:23
компилятор и компоновщик говорят: о боже
02:37:25
разработчик компилирует и связывает это
02:37:27
программа и разработчик хочет
02:37:29
выпустить сборку, чтобы разработчик не
02:37:31
обеспокоен тем, как мы все это сворачиваем
02:37:34
давайте просто смешаем все это в одну
02:37:36
кстати, это действительно оптимально для нашего процессора
02:37:38
мне на самом деле плевать на то, чтобы все это сохранить
02:37:40
организовано и все такое, чтобы кто-то
02:37:42
отладка программы может понять ее
02:37:44
структуру, пока они ее отлаживают, мы
02:37:46
действительно беспокоюсь об оптимизации, так что давайте
02:37:48
просто создайте какой-нибудь двоичный объект, который
02:37:50
собираюсь сделать то же самое, что и логика
02:37:53
они есть в этой программе на C++, но давайте
02:37:55
не беспокойся о логической структуре, так что
02:37:57
я примерно об этом и говорил
02:37:58
ранее между отладочными и выпускными сборками
02:38:00
но это как бы подчеркивает это, когда ты
02:38:02
сравни хотя бы что-то настолько простое, как ты
02:38:05
вижу, что это приносит
02:38:06
функциональность из какой-то другой библиотеки
02:38:09
и это помещает это прямо посередине
02:38:11
исходной функции, так что это своего рода
02:38:13
делает это немного более загадочным
02:38:15
чтобы как-то понять и разобраться в
02:38:18
следующие пару разделов, которые мы собираемся
02:38:20
рассмотреть некоторые подробности о прохождении
02:38:22
в окне декомпиляции, а также в
02:38:24
окно дизассемблирования для некоторой оптимизации
02:38:26
код, это может быть своего рода вовлечено и
02:38:29
в первый раз вам может понадобиться
02:38:30
чтобы пропустить это, вы можете использовать таблицу
02:38:33
содержимое, чтобы пропустить то, что я хочу
02:38:35
сосредоточьтесь на этой области между строкой получения
02:38:38
и это утверждение if, если мы перейдем к
02:38:40
в программе демо-приложения мы видим это

Описание:

Happy Cybersecurity Month 2023! In this video, you are introduced to Ghidra, a software reverse engineering framework. I take you from setup through to the disassembly window, with a few twists and turns between. This video focuses on setup/use of Ghidra on Windows... we reverse engineer a small Windows PE binary created using Visual Studio 2022 Community Edition. Even if you do not know C++ or Ghidra or anything about reverse engineering, if you have a curiosity about these tools, I recommend you try to follow along... even if it's over your head, that's where many begin the journey and it simply means you will get more out of each moment than someone who knows "everything." If you are familiar with Ghidra, feel free to jump ahead to later sections as you wish. See clickable Table of Contents below. DemoApp source code: 1. git clone https://github.com/AshleyT3/tutorial-sample-code 2. open ./src/Intro-to-Ghidra-Tutorial/DemoApp/DemoApp.sln in Visual Studio. ...okay, let's get going! Table of Contents 0:00:00 Start 0:01:54 Download Ghidra 0:03:03 Ghidra Requirements/Setup 0:03:36 Download OpenJDK from Microsoft 0:04:49 Download OpenJDK from Amazon 0:06:15 Install OpenJDK from Microsoft 0:06:56 Install Ghidra 0:08:09 SmartScreen block 0:09:49 Ghidra first run, fix scaling, small font issue 0:11:36 ZIP file JDK (i.e., Amazon Corretto) 0:13:21 Run Ghidra, fix scaling issues (ZIP file JDK) 0:14:28 Install Visual Studio 0:15:09 Visual Studio initial startup 0:15:24 Create DemoApp project 0:16:16 Visual Studio quick test drive 0:17:33 Debug vs Release build intro 0:27:07 The DemoApp source, building, initial use. 0:30:50 Visual Studio binary hex editor 0:31:30 VSCode Hex Editor 0:33:37 Caution, do not edit the binary! 0:34:03 Create a Ghidra Project 0:37:39 The 'main' function 0:38:26 Initial analysis 0:39:39 The Luxury of Decompiling 0:41:06 Top-down not required 0:41:19 Lucky helpful strings 0:43:10 C++ Console Output 0:45:35 The binary is not the source code 0:46:57 Adding Labels 0:50:17 An adventure with levels 0:51:24 Secondary highlights 0:51:59 The art of names and more 0:53:00 STL string intro 0:58:16 Variable naming pt1 0:58:59 The operator != function 1:01:52 Le door de back 1:04:11 Another label 1:04:56 Add a comment 1:05:25 Fearless naming. 1:07:40 C++ Console Input 1:08:08 Removing secondary highlight 1:08:41 STL string, C-string, pointers pt1 1:12:49 Navigate to a function 1:13:50 Shortcuts==saved brain cycles 1:14:52 Function arguments pt1 1:16:10 Strings and pointers pt2 1:19:42 C++ this pointer 1:21:33 The purity of source code 1:22:35 Coach Ghidra, Reset/Recap 1:26:37 Strings/bytes and pointers pt3 1:32:27 Copying hex from Ghidra 1:34:28 Naming pt2 1:38:07 Top-down not required pt2 1:43:07 The 'for' loop 1:48:09 Decoding the_big_secret 1:57:11 Exiting the 'for' loop 1:58:56 The 'flag' 2:00:59 Fundamental Data Types (x86/x64) 2:02:33 Middle mouse button highlight 2:03:17 General Purpose CPU Registers 2:07:09 Register variables 2:08:43 Calling conventions 2:09:23 Return values in RAX 2:10:34 x64 Calling Conventions Summary 2:14:05 Rename register variable 2:16:21 Temp-saving RAX during other operations 2:21:00 Hiding symbols from Ghidra 2:23:41 Ghidra without symbols 2:27:43 Naming pt3: Use what works! 2:30:19 Release vs Debug w/symbols 2:34:07 Inlined functions 2:38:17 Rel vs Dbg: Decompile Window 2:43:30 Inline example 2:46:24 Finding, examining the _Myptr() function 2:51:00 &_Buf vs _Ptr value 2:54:59 Disassembly Window, inviting coach Visual Studio to help 2:56:01 LEA instruction pt1 2:57:12 Register variables 2:57:26 Calling conventions pt3 2:58:35 Easy/Nuanced register variable naming 2:59:49 Renaming an existing register variable 3:01:00 Nuanced register variable renaming 3:01:19 Undo/Redo to observe changes 3:05:43 Processor Manual Setup 3:08:45 LEA instruction pt2 3:09:12 CMP instruction 3:10:27 CPU Flags, EFLAGS register 3:11:27 Ghidra and 'string' memory layout pt1 3:14:37 CPU Carry Flag (CF) 3:17:06 CMOVNC instruction, 'string' mem layout pt3 3:20:18 LEA/CMP/CMOVNC recap 3:22:20 MOV instruction 3:23:07 CMP instruction pt2 3:23:56 JNZ instruction 3:24:19 JNZ/JNE, JZ/JE instructions 3:25:25 LEA instruction pt3 3:25:52 Compiler as strategist 3:29:52 TEST instruction 3:32:29 Outro... Thank you! Happy reversing! Buy Me a Coffee https://buymeacoffee.com/ricochettech Subscribe to the the RicochetTech email list: https://ricochettech.net/subscribe/ if you liked this video, don't forget to click the Like button! (Thank you!) If you want to see more of this content, click the 'Subscribe' button to receive RicochetTech channel updates! The appearance of U.S. Department of Defense (DoD) visual information does not imply or constitute DoD endorsement.

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Intro to Ghidra Tutorial 2023 | Setup to Disassembly Window | Ghidra SRE"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

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