- scanmem(1) — Linux man page
- Synopsis
- Description
- Usage
- Commands
- Examples
- Notes
- Author
- scanmem: сканер памяти для Linux
- Графический интерфейс пользователя
- Сборка и установка
- Android сборка
- Использование
- scanmem: memory scanner for Linux
- Scanmem linux ��� ������������
- Символы Unicode: о чём должен знать каждый разработчик
- Введение в кодировку
- Краткая история кодировки
- Проблемы с ASCII
- Что такое кодовые страницы ASCII?
- Безумие какое-то.
- Так появился Unicode
- Unicode Transform Protocol (UTF)
- Что такое UTF-8 и как она работает?
- Напоследок про UTF
- Это всё?
- Заключение
scanmem(1) — Linux man page
Synopsis
Description
Once a variable has been found, scanmem can monitor the variable, or change it to a user specified value, either once, or continually over a period of time.
scanmem works similarly to the » pokefinders » once commonly used to cheat at video games, this function is a good demonstration of how to use scanmem , and is used in the documentation.
Usage
The target-program-pid can be specified in decimal, hexadecimal, or octal using the standard C language notation (leading 0x for hexadecimal, leading 0 for octal, anything else is assumed to be decimal).
Print version and exit.
Print a short description of command line options then exit.
Commands
While in interactive mode, scanmem prints a decimal number followed by > , the number is the current number of possible candidates for the target variable that are known. 0 indicates that no possible variables have been eliminated yet.
Where n represents any number in decimal, octal or hexadecimal, this command tells scanmem that the current value of the target variable is exactly n. scanmem will begin a search of the entire address space, or the existsing known matches (if any), eliminating any variable that does not have this value.
Set the value value into the match numbers match-id , or if just value is specified, all known matches. value can be specified in standard C language notation. All known matches, along with their match-id’s can be displayed using the list command. Multiple match-id’s can be specified, separated with commas and terminated with an = sign. To set a value continually, suffix the command with / followed by the number of seconds wo wait between sets. You can interrupt the set command with ^C to return to the scanmem prompt. This can be used to sustain the value of a variable which decreases overtime, for example a timer that is decremented every second can be set to 100 every 10 seconds to prevent some property from ever changing.
This command is used to change the value of the variable(s) once found by elimination. Please note, some applications will store values in multiple locations.
Tells scanmem that it should eliminate all matched variables that have not increased since the last search. For example, if the value of a variable is known to be zero when a program is executed, but increases over time, this command can be used several times to eliminate variables that have decreased or not changed.
but indicates that the target variable has decreased since the last scan.
As for > but indicates that the target variable has not changed since last scan.
Save a snapshot of existing program state, for use with > , CThe value could be a char.SThe value could be a short.IThe value could be an int.LThe value could be a long.FThe value could be a float.NThe value is known to be signed.ZThis flag is not currently used. delete [match-id]
Delete match match-id , which can be found from the output of the list command. To delete all matches, see the reset command, or to delete all matches associated with a particular library, see the dregion command, which also removes any associated matches. Pleae note that match-ids may be recalculated after matches are removed or added.
Monitor the value of match-id , and print its value as it changes. Every change is printed along with a timestamp, you can interrupt this command with ^C to stop monitoring.
Print out the process id of the current target program, or change the target to new-pid , which will reset existing regions and matches.
List all the known regions, this can be used in combination with the dregion command to eliminate regions that the user believes are not related to the variable in question, thus reducing the address space required to search. The value in the first column is the region-id which must be passed to the dregion command. The size and path (if applicable) is also printed. This can be used to eliminate regions located in shared libraries that are unlikely to be relevant to the variable required.
Delete the region region-id , which can be found in the output of the lregions command.
Forget all known matches and start again.
Execute shell-command using /bin/sh, then return.
Print the version of scanmem in use.
Print a short summary of available commands.
Detach from the target program and exit immediately.
Examples
Notes
scanmem has been tested on multiple large programs, including the 3d shoot-em-up quake3 linux.
Obviously, scanmem can crash your program if used incorrectly.
Some programs store values in multiple locations, this is why set will change all known matches.
The first scan can be very slow on large programs, this is not a problem for subsequent scans as huge portions of the address space are usually eliminated. This could be improved in future, perhaps by assuming all integers are aligned by default. Suggestions welcome.
The snapshot command uses memory inefficiently, and should probably not be used on large programs. In future this will use a more intelligent format.
Author
All bug reports, suggestions or feedback welcome.
Источник
scanmem: сканер памяти для Linux
scanmem – это утилита отладки, предназначенная для изоляции адреса произвольной переменной в процессе выполнения.
Scanmem просто нужно сообщить pid процесса и значение переменной в несколько раз.
После нескольких сканирований процесса scanmem изолирует положение переменной и позволяет изменить ее значение.
Графический интерфейс пользователя
GameConqueror – это графический интерфейс для scanmem, предоставляющий дополнительные функции, такие как:
- Гибкий синтаксис для поиска
- Более простая и множественная блокировка переменных
- Лучший процесс поиска
- Память браузер / редактор
- Требования к сборке
- Для сборки требуются autotools-dev, libtool, libreadline-dev, intltool и python.
Сборка и установка
Чтобы сгенерировать файлы, необходимые для сборки:
git clone https://github.com/scanmem/scanmem.git
./autogen.sh
Чтобы собрать с GUI:
./configure –prefix=/usr –enable-gui && make
sudo make install
Чтобы собрать без графического интерфейса:
./configure –prefix=/usr && make
sudo make install
scanmem и GameConqueror используют статические пути к libscanmem.
Поэтому выполнение ldconfig не требуется.
Рассмотрите возможность установки –libdir=/usr/lib/ scanmem или –libdir=/usr/lib64/ scanmem, чтобы избежать попадания libscanmem в путь поиска библиотеки.
Запустите ./configure –help для получения более подробной информации.
Android сборка
Вам нужен автономный набор инструментов Android NDK (расширенный метод) для создания интерактивных возможностей для Android.
Для получения дополнительной информации запустите:
Использование
Интерфейс похож на Cheat Engine для Windows.
- Введите значение для поиска в поле «Value, затем нажмите клавишу «Enter» или кнопки сканирования.
- Проверьте поддерживаемый синтаксис, находящийся над знаком «?»
- Вы сканируете, выбирая область поиска / тип через выпадающие списки.
- Количество совпадений будет показано в «Foud: XX» в верхней части
- Матчи будут отображаться в левом списке, если их не слишком много.
- Добавьте адрес кандидата в приведенный ниже список, дважды щелкнув по нему или воспользовавшись контекстным меню.
- Там вы можете отредактировать описание, значение и заблокировать его.
Источник
scanmem: memory scanner for Linux
by do son · Published February 4, 2019 · Updated February 4, 2019
scanmem is a debugging utility designed to isolate the address of an arbitrary variable in an executing process. scanmem simply needs to be told the pid of the process and the value of the variable at several different times.
After several scans of the process, scanmem isolates the position of the variable and allows you to modify its value.
GUI
GameConqueror is a GUI front-end for scanmem, providing more features, such as:
- Flexible syntax for searching
- Easier and multiple variable locking
- Better process finder
- Memory browser/editor
Build Requirements
The build requires autotools-dev, libtool, libreadline-dev, intltool, and python.
Build and Install
To generate files required for the build:
To build with GUI:
./configure –prefix=/usr –enable-gui && make
sudo make install
To build without GUI:
scanmem and GameConqueror use static paths to libscanmem. So executing ldconfig is not required. Consider setting –libdir=/usr/lib/scanmem or –libdir=/usr/lib64/scanmem to avoid that libscanmem is in a library search path.
Run ./configure –help for more details.
Android Build
You need a standalone toolchain of Android NDK (Advanced method) to build interactive capabilities for Android. For more information, run:
Usage
The interface is similar to the Windows-only Cheat Engine.
- Enter a value to search in the Value entry, then press Enter or the scan buttons
- Check supported syntax hovering over the ‘?’ mark
- You scan choose the search region/type via the dropdowns.
- Number of matches will be shown in ‘Found: XX’ at topleft
- Matches will be displayed in the left list if there are not too many
- Add a candidate address to the list below by double-click on it or use the context menu
- There you can edit description, value, and lock it.
Copyright (C) WANG Lu
Andrea Stacchiotti
Источник
Scanmem linux ��� ������������
scanmem & GameConqueror
scanmem is a debugging utility designed to isolate the address of an arbitrary variable in an executing process. scanmem simply needs to be told the pid of the process and the value of the variable at several different times.
After several scans of the process, scanmem isolates the position of the variable and allows you to modify its value.
GameConqueror is a GUI front-end for scanmem, providing more features, such as:
- Flexible syntax for searching
- Easier and multiple variable locking
- Better process finder
- Memory browser/editor
See gui/README for more details.
scanmem requires libreadline to read commands interactively, and /proc must be mounted. GameConqueror requirements are documented in gui/README.
To read documentation:
- man scanmem
- man gameconqueror
- scanmem —help
- enter help at the scanmem prompt
- use the interactive help of GameConqueror
The build requires autotools-dev, libtool, libreadline-dev, intltool, and python.
Build and Install
To generate files required for the build:
To build with GUI:
To build without GUI:
scanmem and GameConqueror use static paths to libscanmem. So executing ldconfig is not required. Consider setting —libdir=/usr/lib/scanmem or —libdir=/usr/lib64/scanmem to avoid that libscanmem is in a library search path.
Run ./configure —help for more details.
You need a standalone toolchain of Android NDK (Advanced method) to build interactive capabilities for Android. For more information, run:
Источник
Символы Unicode: о чём должен знать каждый разработчик
Если вы пишете международное приложение, использующее несколько языков, то вам нужно кое-что знать о кодировке. Она отвечает за то, как текст отображается на экране. Я вкратце расскажу об истории кодировки и о её стандартизации, а затем мы поговорим о её использовании. Затронем немного и теорию информатики.
Введение в кодировку
Компьютеры понимают лишь двоичные числа — нули и единицы, это их язык. Больше ничего. Одно число называется байтом, каждый байт состоит из восьми битов. То есть восемь нулей и единиц составляют один байт. Внутри компьютеров всё сводится к двоичности — языки программирования, движений мыши, нажатия клавиш и все слова на экране. Но если статья, которую вы читаете, раньше была набором нулей и единиц, то как двоичные числа превратились в текст? Давайте разберёмся.
Краткая история кодировки
На заре своего развития интернет был исключительно англоязычным. Его авторам и пользователям не нужно было заботиться о символах других языков, и все нужды полностью покрывала кодировка American Standard Code for Information Interchange (ASCII).
ASCII — это таблица сопоставления бинарных обозначений знакам алфавита. Когда компьютер получает такую запись:
то с помощью ASCII он преобразует её во фразу «Hello world».
Один байт (восемь бит) был достаточно велик, чтобы вместить в себя любую англоязычную букву, как и управляющие символы, часть из которых использовалась телепринтерами, так что в те годы они были полезны (сегодня уже не особо). К управляющим символам относился, например 7 (0111 в двоичном представлении), который заставлял компьютер издавать сигнал; 8 (1000 в двоичном представлении) — выводил последний напечатанный символ; или 12 (1100 в двоичном представлении) — стирал весь написанный на видеотерминале текст.
В те времена компьютеры считали 8 бит за один байт (так было не всегда), так что проблем не возникало. Мы могли хранить все управляющие символы, все числа и англоязычные буквы, и даже ещё оставалось место, поскольку один байт может кодировать 255 символов, а для ASCII нужно только 127. То есть неиспользованными оставалось ещё 128 позиций в кодировке.
Вот как выглядит таблица ASCII. Двоичными числами кодируются все строчные и прописные буквы от A до Z и числа от 0 до 9. Первые 32 позиции отведены для непечатаемых управляющих символов.
Проблемы с ASCII
Позиции со 128 по 255 были пустыми. Общественность задумалась, чем их заполнить. Но у всех были разные идеи. Американский национальный институт стандартов (American National Standards Institute, ANSI) формулирует стандарты для разных отраслей. Там утвердили позиции ASCII с 0 по 127. Их никто не оспаривал. Проблема была с остальными позициями.
Вот чем были заполнены позиции 128-255 в первых компьютерах IBM:
Какие-то загогулины, фоновые иконки, математические операторы и символы с диакретическим знаком вроде é. Но разработчики других компьютерных архитектур не поддержали инициативу. Всем хотелось внедрить свою собственную кодировку во второй половине ASCII.
Все эти различные концовки назвали кодовыми страницами.
Что такое кодовые страницы ASCII?
Здесь собрана коллекция из более чем 465 разных кодовых страниц! Существовали разные страницы даже в рамках какого-то одного языка, например, для греческого и китайского. Как можно было стандартизировать этот бардак? Или хотя бы заставить его работать между разными языками? Или между разными кодовыми страницами для одного языка? В языках, отличающихся от английского? У китайцев больше 100 000 иероглифов. ASCII даже не может всех их вместить, даже если бы решили отдать все пустые позиции под китайские символы.
Эта проблема даже получила название Mojibake (бнопня, кракозябры). Так говорят про искажённый текст, который получается при использовании некорректной кодировки. В переводе с японского mojibake означает «преобразование символов».
Пример бнопни (кракозябров).
Безумие какое-то.
Именно! Не было ни единого шанса надёжно преобразовывать данные. Интернет — это лишь монструозное соединение компьютеров по всему миру. Представьте, что все страны решили использовать собственные стандарты. Например, греческие компьютеры принимают только греческий язык, а английские отправляют только английский. Это как кричать в пустой пещере, тебя никто не услышит.
ASCII уже не удовлетворял жизненным требованиям. Для всемирного интернета нужно было создать что-то другое, либо пришлось бы иметь дело с сотнями кодовых страниц.
��� Если только ������ вы не хотели ��� бы ��� читать подобные параграфы. �֎֏0590��׀ׁׂ׃ׅׄ׆ׇ
Так появился Unicode
Unicode расшифровывают как Universal Coded Character Set (UCS), и у него есть официальное обозначение ISO/IEC 10646. Но обычно все используют название Unicode.
Этот стандарт помог решить проблемы, возникавшие из-за кодировки и кодовых страниц. Он содержит множество кодовых пунктов (кодовых точек), присвоенных символам из языков и культур со всего мира. То есть Unicode — это набор символов. С его помощью можно сопоставить некую абстракцию с буквой, на которую мы хотим ссылаться. И так сделано для каждого символа, даже египетских иероглифов.
Кто-то проделал огромную работу, сопоставляя каждый символ во всех языках с уникальными кодами. Вот как это выглядит:
Префикс U+ говорит о том, что это стандарт Unicode, а число — это результат преобразования двоичных чисел. Стандарт использует шестнадцатеричную нотацию, которая является упрощённым представлением двоичных чисел. Здесь вы можете ввести в поле что угодно и посмотреть, как это будет преобразовано в Unicode. А здесь можно полюбоваться на все 143 859 кодовых пунктов.
Уточню на всякий случай: речь идёт о большом словаре кодовых пунктов, присвоенных всевозможным символам. Это очень большой набор символов, не более того.
Осталось добавить последний ингредиент.
Unicode Transform Protocol (UTF)
UTF — протокол кодирования кодовых пунктов в Unicode. Он прописан в стандарте и позволяет кодировать любой кодовый пункт. Однако существуют разные типы UTF. Они различаются количеством байтов, используемых для кодировки одного пункта. В UTF-8 используется один байт на пункт, в UTF-16 — два байта, в UTF-32 — четыре байта.
Но если у нас есть три разные кодировки, то как узнать, какая из них применяется в конкретном файле? Для этого используют маркер последовательности байтов (Byte Order Mark, BOM), который ещё называют сигнатурой кодировки (Encoding Signature). BOM — это двухбайтный маркер в начале файл, который говорит о том, какая именно кодировка тут применена.
В интернете чаще всего используют UTF-8, она также прописана как предпочтительная в стандарте HTML5, так что уделю ей больше всего внимания.
Этот график построен в 2012-м, UTF-8 становилась доминирующей кодировкой. И всё ещё ею является.
Что такое UTF-8 и как она работает?
UTF-8 кодирует с помощью одного байта каждый кодовый пункт Unicode с 0 по 127 (как в ASCII). То есть если вы писали программу с использованием ASCII, а ваши пользователи применяют UTF-8, они не заметят ничего необычного. Всё будет работать как задумано. Обратите внимание, как это важно. Нам нужно было сохранить обратную совместимость с ASCII в ходе массового внедрения UTF-8. И эта кодировка ничего не ломает.
Как следует из названия, кодовый пункт состоит из 8 битов (один байт). В Unicode есть символы, которые занимают несколько байтов (вплоть до 6). Это называют переменной длиной. В разных языках удельное количество байтов разное. В английском — 1, европейские языки (с латинским алфавитом), иврит и арабский представлены с помощью двух байтов на кодовый пункт. Для китайского, японского, корейского и других азиатских языков используют по три байта.
Если нужно, чтобы символ занимал больше одного байта, то применяется битовая комбинация, обозначающая переход — он говорит о том, что символ продолжается в нескольких следующих байтах.
И теперь мы, как по волшебству, пришли к соглашению, как закодировать шумерскую клинопись (Хабр её не отображает), а также значки emoji!
Подытожив сказанное: сначала читаем BOM, чтобы определить версию кодировки, затем преобразуем файл в кодовые пункты Unicode, а потом выводим на экран символы из набора Unicode.
Напоследок про UTF
Коды являются ключами. Если я отправлю ошибочную кодировку, вы не сможете ничего прочесть. Не забывайте об этом при отправке и получении данных. В наших повседневных инструментах это часто абстрагировано, но нам, программистам, важно понимать, что происходит под капотом.
Как нам задавать кодировку? Поскольку HTML пишется на английском, и почти все кодировки прекрасно работают с английским, мы можем указать кодировку в начале раздела .
Важно сделать это в самом начале , поскольку парсинг HTML может начаться заново, если в данный момент используется неправильная кодировка. Также узнать версию кодировки можно из заголовка Content-Type HTTP-запроса/ответа.
Если HTML-документ не содержит упоминания кодировки, спецификация HTML5 предлагает такое интересное решение, как BOM-сниффинг. С его помощью мы по маркеру порядка байтов (BOM) можем определить используемую кодировку.
Это всё?
Unicode ещё не завершён. Как и в случае с любым стандартом, мы что-то добавляем, убираем, предлагаем новое. Никакие спецификации нельзя назвать «завершёнными». Обычно в год бывает 1-2 релиза, найти их описание можно здесь.
Если вы дочитали до конца, то вы молодцы. Предлагаю сделать домашнюю работу. Посмотрите, как могут ломаться сайты при использовании неправильной кодировки. Я воспользовался этим расширением для Google Chrome, поменял кодировку и попытался открывать разные страницы. Информация была совершенно нечитаемой. Попробуйте сами, как выглядит бнопня. Это поможет понять, насколько важна кодировка.
Заключение
При написании этой статьи я узнал о Майкле Эверсоне. С 1993 года он предложил больше 200 изменений в Unicode, добавил в стандарт тысячи символов. По состоянию на 2003 год он считался самым продуктивным участником. Он один очень сильно повлиял на облик Unicode. Майкл — один из тех, кто сделал интернет таким, каким мы его сегодня знаем. Очень впечатляет.
Надеюсь, мне удалось показать вам, для чего нужны кодировки, какие проблемы они решают, и что происходит при их сбоях.
Источник