<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5004136677874416566</id><updated>2026-08-23T01:47:58.643-07:00</updated><category term="Gray Hat Python"/><category term="планы"/><category term="python"/><category term="книги"/><category term="Java"/><category term="MySQL"/><category term="linux"/><category term="study english"/><category term="wimax"/><category term="yota"/><category term="афоризмы"/><category term="блог"/><category term="будни"/><category term="записки"/><category term="копипаста"/><category term="кривые руки"/><category term="форензика"/><title type='text'>Записки, статьи, работы.</title><subtitle type='html'>Блог заброшен, но быть может и будет расконсервирован.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-8625933355341477745</id><published>2011-12-27T04:59:00.000-08:00</published><updated>2011-12-27T04:59:45.214-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="планы"/><title type='text'>Касательно 3 и 4-й глав.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Уважаемые читатели. Пока я краплю над переводом 3-ей и 4-ой глав, уважаемый Prosper-H&amp;nbsp;&lt;a href=&quot;http://forum.reverse4you.org/showthread.php?t=1186&quot;&gt;разместил&lt;/a&gt;&amp;nbsp;на форуме&amp;nbsp;reverse4you.org перводы &lt;a href=&quot;http://forum.reverse4you.org/showthread.php?t=1197&quot;&gt;3-ей&lt;/a&gt;, &lt;a href=&quot;http://forum.reverse4you.org/showthread.php?t=1198&quot;&gt;4-ой&lt;/a&gt; и &lt;a href=&quot;http://forum.reverse4you.org/showthread.php?t=1207&quot;&gt;5-ой&lt;/a&gt; глав. Всем заинтересованным крайне рекомендую ознакомится. Собственно, полагаю он закончит с переводом книги явно раньше меня. Но я над работой останавливаться не собираюсь, кроме самой книги, я так же переведу все комментарии к исходникам, да и вообще эта работа &quot;for fun&quot;. Однако тем, кому скорость перевода критична, настоятельно рекомендую пройти по ссылкам.&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/8625933355341477745/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2011/12/3-4.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/8625933355341477745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/8625933355341477745'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2011/12/3-4.html' title='Касательно 3 и 4-й глав.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-1243203988990602497</id><published>2011-12-03T12:28:00.001-08:00</published><updated>2011-12-03T12:39:40.791-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="записки"/><category scheme="http://www.blogger.com/atom/ns#" term="планы"/><category scheme="http://www.blogger.com/atom/ns#" term="форензика"/><title type='text'>После спячки</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Во-первых снова здравствуйте!&lt;br /&gt;
Во-вторых, наконец-то устаканив мою бурную жизнь, приступаю к регулярному ведению данного блога.&lt;br /&gt;
Работы по переводу замечательной книги&amp;nbsp;&lt;a href=&quot;http://chumichev.blogspot.com/2010/04/gray-hat-pyton.html&quot;&gt;Gray hat python&lt;/a&gt;&amp;nbsp;будут продолжены. До конца года планируется выход перевода 3-й и 4-й глав.&lt;br /&gt;
&lt;br /&gt;
Последнее время я очень сильно заинтересовался темой компьютерной форензики. Поэтому многие записи будут посвящены этой занимательной теме. Да и вообще я планирую переквалифицироваться из специалиста по защита информации широкого профиля к чему-нибудь более узкоспециализированному.&lt;br /&gt;
&lt;br /&gt;
Кроме того, наверняка буду размещать различные мысли и соображения по поводу пресловутого 152-ФЗ, хотя оскомину он мне набил конкретную.&lt;br /&gt;
&lt;br /&gt;
Так что, добро пожаловать!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/1243203988990602497/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2011/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/1243203988990602497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/1243203988990602497'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2011/12/blog-post.html' title='После спячки'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-2725950901796343474</id><published>2010-04-05T08:07:00.000-07:00</published><updated>2011-12-14T05:06:09.872-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="книги"/><category scheme="http://www.blogger.com/atom/ns#" term="планы"/><title type='text'>Gray Hat Pyton содержание</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s1600/2011-12-05+13.52.34.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s320/2011-12-05+13.52.34.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
По просьбам трудящихся выкладываю полное содержание книги.&lt;br /&gt;
&lt;a href=&quot;http://chumichev.blogspot.com/2010/03/gray-hat-python-v08.html&quot;&gt;Введение.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://chumichev.blogspot.com/2010/03/gray-hat-python-01-v-05.html&quot;&gt;1. Настройка вашего рабочего окружения.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://chumichev.blogspot.com/2010/03/gray-hat-python-02-v-05.html&quot;&gt;2. Отладчики и устройство отладчика&lt;/a&gt;&lt;br /&gt;
3. Создание отладчика в Windows.&lt;br /&gt;
4. PyDbg - Windows отладчик на чистом Python.&lt;br /&gt;
5. Immunity Debugger - лучший в обоих мирах.&lt;br /&gt;
6. Хукинг (перехват).&lt;br /&gt;
7. DLL и внедрение кода(code injection).&lt;br /&gt;
8. Фаззинг.&lt;br /&gt;
9. Салли(Sulley).&lt;br /&gt;
10. Фаззинг драйверов Windows.&lt;br /&gt;
11. IDAPython - сценарии для IDA Pro.&lt;br /&gt;
12. PyEmu - Эмулятор с сценариями.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/2725950901796343474/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/04/gray-hat-pyton.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/2725950901796343474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/2725950901796343474'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/04/gray-hat-pyton.html' title='Gray Hat Pyton содержание'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s72-c/2011-12-05+13.52.34.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-6240198299552129998</id><published>2010-04-04T14:19:00.000-07:00</published><updated>2010-04-05T03:45:05.087-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="блог"/><category scheme="http://www.blogger.com/atom/ns#" term="будни"/><category scheme="http://www.blogger.com/atom/ns#" term="кривые руки"/><category scheme="http://www.blogger.com/atom/ns#" term="планы"/><title type='text'>Небольшой косяк  и анонсы</title><content type='html'>Благодаря внимательным читателям обнаружилось, что по причине косячной разметки блогспота в листингах Python не отображаются пробелы, что весьма критично. Сегодня времени исправить это нет, но завтра обязательно исправлю. Еще раз спасибо внимательным. Так же, по просьбе нескольких человек введу каты, ибо действительно блог читать невозможно. Публикация следующей главы ориентировочно в пятницу-субботу. Еще раз, огромное спасибо всем читателям блога, всем замечаниям и критике.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;UPD&lt;/span&gt; исправил ситуацию с пробелами.&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;UPD2&lt;/span&gt; спасибо Google за &lt;a href=&quot;http://www.google.com/support/blogger/bin/answer.py?hl=ru&amp;answer=154172&quot;&gt;инструкцию&lt;/a&gt; как прикрутить нормальный кат.</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/6240198299552129998/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/04/blog-post_04.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/6240198299552129998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/6240198299552129998'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/04/blog-post_04.html' title='Небольшой косяк  и анонсы'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-3982024754522633660</id><published>2010-03-25T11:19:00.000-07:00</published><updated>2011-12-14T07:11:38.503-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="книги"/><title type='text'>Gray Hat Python Глава 02 v. 0.5</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s1600/2011-12-05+13.52.34.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s320/2011-12-05+13.52.34.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
#есть небольшой косяк с отображением картинок в блоге. Но они все кликабельны.&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Глава 2 Отладчики и устройство отладчика.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;Отладчик - глазное яблоко хакера. Отладчики позволяют вам выполнять трассировку (отслеживание) выполнения процесса, или проводить &lt;span style=&quot;font-style: italic;&quot;&gt;динамический анализ&lt;/span&gt;. Возможность выполнения динамического анализа &lt;br /&gt;абсолютно необходима, когда речь заходит о создании эксплойтов&lt;/span&gt;, поддержки фазеров и проверки вредоносного ПО. Это очень важно, чтобы вы понимали что такое отладчик, и принцип его работы. Отладчики предоставляют целое множество конкретных расширений и функционала, которое очень полезно при оценке ошибок в программах. Большинство из них предоставляют возможность запускать, останавливать, или выполнять пошагово процесс, устанавливать точки останова, манипулировать регистрами и памятью, и отлавливать случающиеся исключения в исследуемом процессе.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Но прежде чем мы двинемся дальше, давайте обсудим разницу между отладчиком белого ящика(white-box debugger) и отладчиком черного(black-box debugger). Большинство платформ разработки или IDE, содержат встроенный отладчик, который позволяет разработчикам отслеживать процесс выполнения программы, имея исходный код, и контролируя очень многое. Это называется &lt;span style=&quot;font-style: italic;&quot;&gt;отладкой белого ящика&lt;/span&gt;. Эти отладчики полезны во время разработки ПО, но реверс-инженер, или &lt;span style=&quot;font-style: italic;&quot;&gt;охотник за багами&lt;/span&gt;, редко имеет доступ к исходным кодам, и ему приходится использовать отладчики черного ящика, во время пошагового выполнения программы (трассировки). &lt;span style=&quot;font-style: italic;&quot;&gt;Отладчик черного ящика&lt;/span&gt; предполагает, что исследуемая программа полностью непрозрачна для хакера, и единственная доступная информация - это дизассемблированный  код. При этом методе нахождения ошибок, более сложном и затратном по времени, хорошо подготовленный реверс-инженер в состоянии понять устройство программы на очень высоком уровне. Иногда ребята, ломающие программы, могут получить более глубокие знания и понимание того, как работает программа, нежели разработчик ее создавший!&lt;br /&gt;
&lt;br /&gt;
Очень важно различать два подкласса отладчиков черного ящика: уровня пользователя и уровня ядра. Уровень пользователя (как правило т.н. &lt;span style=&quot;font-style: italic;&quot;&gt;ring 3&lt;/span&gt; (кольцо третьего уровня, прим.)) - это режим процессора, в котором запускаются ваши пользовательские приложения. Приложения уровня пользователя выполняются с наименьшим количеством привилегий. Когда вы запускаете &lt;span style=&quot;font-style: italic;&quot;&gt;calc.exe&lt;/span&gt; чтобы что-то посчитать, вы порождаете процесс на уровне пользователя; если вы будете пошагово выполнять (тресировать) этот процесс, это будет отладка на уровне пользователя. &lt;span style=&quot;font-style: italic;&quot;&gt;Уровень ядра&lt;/span&gt; (&lt;span style=&quot;font-style: italic;&quot;&gt;ring 0&lt;/span&gt;) - это наибольший уровень привилегий. Это уровень, где работает ядро операционной системы вместе с драйверами и другими низкоуровневыми компонентами. Когда вы анализируете сетевой трафик (сниффаете, от sniffing - &quot;нюхать&quot;, прим.) с помощью &lt;a href=&quot;http://www.wireshark.org/&quot; target=&quot;_blank&quot;&gt;Wireshark&lt;/a&gt;, вы взаимодействуете с драйвером, который работает на уровне ядра. Если вы хотите остановить драйвер, и исследовать его состояние в любой точке, то вам понадобится отладчик уровня ядра.&lt;br /&gt;
&lt;br /&gt;
Сейчас я приведу вам короткий список отладчиков уровня ядра, часто используемых реверс-инженерами и хакерами: &lt;span style=&quot;font-style: italic;&quot;&gt;WinDbg&lt;/span&gt; от Microsoft и &lt;span style=&quot;font-style: italic;&quot;&gt;OllyDbg&lt;/span&gt;, бесплатный отладчик от Oleh Yuschuk. При отладке под Linux, обычно используют &lt;span style=&quot;font-style: italic;&quot;&gt;GNU Debugger (gdb)&lt;/span&gt;. Все три отладчика достаточно мощны, и каждый предлагает такие возможности, которые не доступны другим отладчикам.&lt;br /&gt;
&lt;br /&gt;
Однако в последние годы стала проявляться тенденция в &lt;span style=&quot;font-style: italic;&quot;&gt;интеллектуальной отладке&lt;/span&gt;, особенно на платформе Windows. Интеллектуальный отладчик поддерживает скрипты (сценарии), поддерживает расширенные возможности, например такие, как вызов перехвата, и что самое главное, имеют много возможностей используемых для охоты на баги(bug hunting) и реверс-инженеринга. Два новых лидера в этой сфере: PyDbg от Pedram Amini и Immunity Debugger от Immunity inc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.1. Регистры общего назначения центрального процессора.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Регистр&lt;/span&gt; - это небольшой объем памяти находящийся прямо на центральном процессоре, и доступ к нему - быстрейший метод для процессора, чтобы получить данные. В наборе инструкций архитектуры x86 используются восемь регистров общего назначения: EAX, EDX, ECX, ESI, EDI, EBP, ESP и EBX. Большинство регистров доступны процессору, но мы рассмотрим их только в конкретных обстоятельствах, когда они потребуются. Каждый из восьми регистров общего назначения разработан для своей конкретной работы, и каждый выполняет свою функцию, которая позволяет процессору эффективно выполнять инструкции. Это очень важно - понимать, какой регистр для чего используется, ибо это знание положит фундамент понимания того, как устроен отладчик. Давайте пройдемся по каждому регистру и его функциям. Мы закончим выполнением простым упражнением реверс-инженерии, для иллюстрации их использования. &lt;br /&gt;
&lt;br /&gt;
Регистр EAX, так же называемый &lt;span style=&quot;font-style: italic;&quot;&gt;регистром аккумуляции &lt;/span&gt;(или аккумулятором), используется для выполнения расчетов, а так же для хранения значений возвращаемых вызванными функциями. Многие оптимизированные инструкции в наборе инструкций x86 разработаны для перемещения данных именно в регистр EAX и извлечения данных из него, а так же для выполнения расчетов с этими данными. Большинство простых операций, таких как сложение, вычитание и сравнение оптимизированы для использования регистра EAX. Кроме того, многие определенные операции, такие как умножение или деление, могут выполняться &lt;span style=&quot;font-style: italic;&quot;&gt;только&lt;/span&gt; в регистре EAX.&lt;br /&gt;
&lt;br /&gt;
Как было замечено ранее, возвращенные значения из вызываемых функций хранятся в EAX. Это важно запомнить, что вы можете легко определить, если не удалось вызвать функцию или наоборот удалось в зависимости от значения находящегося в EAX. Кроме того, вы можете определить &lt;span style=&quot;font-style: italic;&quot;&gt;актуальное значение&lt;/span&gt;, которое возвращает функция.&lt;br /&gt;
&lt;br /&gt;
Регистр EDX это &lt;span style=&quot;font-style: italic;&quot;&gt;регистр данных&lt;/span&gt;(data register). Этот регистр в основном является дополнительным для регистра EAX, и он помогает хранить дополнительные данные для более сложных вычислений, таких как умножение и деление. Он так же может быть хранилищем данных общего назначения, но обычно он используется в расчетах, выполненных в сочетании с регистром EAX.&lt;br /&gt;
&lt;br /&gt;
Регистр ECX так же называется регистром-счетчиком (count register), он используется в операциях цикла. Часто повторяющиеся операции стоит хранить в упорядоченной пронумерованной строке. Очень важно понимать, что счетчик регистра ECX уменьшает, а не увеличивает значение. Продемонстрируем это на примере отрывка, написанного на Python:&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
counter = 0&lt;br /&gt;
&lt;br /&gt;
while counter &amp;lt; 10:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print &quot;Loop number: %d&quot; % counter&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter +=1&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Если мы переведем этот код в язык ассемблера, то в первом цикле значение в ECX будет равно 10, 9 в следующем цикле и так далее. Вас может немного смутить, что это противоречит тому, что написано в листинге на Python, но просто запомните, что он уменьшается, и все будет хорошо.&lt;br /&gt;
&lt;br /&gt;
В ассемблере x86 циклы, которые обрабатывают данные, полагаются на регистры ESI и EDI для продуктивной манипуляции данными. Регистр ESI это индекс источника (&lt;span style=&quot;font-style: italic;&quot;&gt;source index&lt;/span&gt;) данных операции, и хранит адрес входящего потока данных. Регистр EDI указывает на место, где находится результат обработанных данных, поэтому он называется индексом назначения(приемника) (&lt;span style=&quot;font-style: italic;&quot;&gt;destination index&lt;/span&gt;). Это легко запомнить таким образом: регистр ESI используется для чтения данных, а EDI для записи. Использование регистров индексов источника и приемника значительно увеличивает производительность выполняемой программы.&lt;br /&gt;
&lt;br /&gt;
Регистры ESP и EBP соответственно &lt;span style=&quot;font-style: italic;&quot;&gt;указатель стека &lt;/span&gt;(stack pointer) и &lt;span style=&quot;font-weight: bold;&quot;&gt;указатель базы&lt;/span&gt;(base pointer). Эти регистры используются для управления вызовами функций и операциями со стеком. Когда функция вызвана, аргументы функции перемещаются (проталкиваются) в стек и следуют по адресу возврата. Регистр ESP указывает на самый верх стека, поэтому он будет указывать на адрес возврата. Регистр EBP указывает на самый низ стека вызовов. В некоторых случаях компилятор может использовать оптимизацию для удаления регистра EBP как указателя кадра, в этих случаях регистр EBP освобождается и может использоваться точно так же, как любой другой регистр общего назначения. &lt;br /&gt;
&lt;br /&gt;
Единственный регистр, который не был разработан для чего-то конкретного - это EBX. Он может использоваться, как дополнительное хранилище данных. &lt;br /&gt;
&lt;br /&gt;
Единственный дополнительный регистр, который стоит упомянуть отдельно, это регистр EIP. Он указывает на инструкцию, которая выполняется в данный момент. Как процессор проходит по двоичному исполняемому коду, EIP обновляется для отображения адреса, по которому в данный момент происходит выполнение. &lt;br /&gt;
&lt;br /&gt;
Отладчик должен уметь легко читать и изменять содержимое этих регистров. Каждая операционная система предоставляет интерфейс отладчикам для взаимодействия с процессором, возможности извлекать и модифицировать данные в регистрах. Мы рассмотрим отдельные интерфейсы в главах о конкретных операционных системах.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.2 Стек.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Стек&lt;/span&gt; - это очень важная структура, которую надо знать при разработке отладчика. Стек хранит информацию о том, как вызывается функция, какие параметры она забирает, и что надо вернуть после выполнения функции. Структура стека представляет собой модель &quot;Первый пришел, последний вышел&quot; (FILO, First In, Last Out), когда аргументы проталкиваются в стек для вызова функции, и извлекаются из стека после того, как функция завершит свое выполнение. Регистр ESP используется для отслеживания самой вершины кадра стека, а регистр EBP используется для отслеживания самого низа стека. Стек &quot;растет&quot; от верхних адресов памяти к нижним адресам памяти. Давайте используем нашу предыдущую рассмотренную функцию my_socks(), как простейший пример того, как работает стек.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;На языке C&lt;/span&gt;&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
int my_socks(color_one, color_two, color_three);&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Вызов функции в ассемблере x86&lt;/span&gt;&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
push color_three&lt;br /&gt;
push color_two&lt;br /&gt;
push color_one&lt;br /&gt;
call my_socks&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как будет выглядеть стек изображено на Рисунке 2-1.&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.ru/lh/photo/NSCZ12JfLO06eVvhEToYTw?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguwrh3WCYTQvJ9A2SPqlHy1_y8-xEG731eduX16PLxDIq1M3ef1UinbviQpJpcBsOeFDP9hS20Km8axlp1jZlT13rktEV3uCG-_C5H2VC7AEXR91QoKFc82saEKHkbZbqCyRoOVMbH_ESZ/s800/Stack.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.ru/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Рисунок 2-1: кадр стека для вызова функции my_socks()&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Перевод обозначений:&lt;br /&gt;
Stack growth direciton - направление роста стека.&lt;br /&gt;
Base of stack frame - основание (база) кадра стека.&lt;br /&gt;
Return adress - адрес возвращаемого значения.&lt;br /&gt;
&lt;br /&gt;
Как вы можете видеть, это прямая структура данных и это основа для всех вызываемых функций в двоичном коде. Когда функция my_socks() завершает работу (и возвращает какое-либо значение), она выталкивает из стека все значения и переходит к адресу возврата для продолжения выполнения родительской функции, которая её вызвала. Рассмотрим понятие локальных переменных. &lt;span style=&quot;font-style: italic;&quot;&gt;Локальные переменные&lt;/span&gt; это часть памяти, которая доступна только для функции, которая выполняется в данный момент. Немного расширим функцию my_socks(), давайте предположим, что первое, что будет делать эта функция - это создавать массив символов, в который будет скопирован параметр color_one. Код будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
int my_socks(color_one, color_two, color_three)&lt;br /&gt;
{&lt;br /&gt;
char stinky_sock_color_one[10];&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Переменная stinky_sock_color_one будет находится в стеке так, что ее можно использовать в конкретном кадре стека. Как только произошло это распределение, кадр стека будет выглядеть как на Рисунке 2-2.&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.ru/lh/photo/xjovhzvmktgJ_usew_UAlw?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoqh6wxSSyRmyTbZMRvx-l5Dwy-vzCfjBj8sI5y6M_pyDPZJAfErBcndLbQF2iI-TEAfE9weUhwvUrpgt0YTQGFqwDtbQ1lX5YLocIeTWMWXbG_8urhcNNtkJWqqYRYBlXHrnGqentadt2/s800/Stack2.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.ru/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Рисунок 2-2. &lt;span style=&quot;font-style: italic;&quot;&gt;Кадр стека после того, как была объявлена локальная переменная stinky_sock_color_one.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь вы увидели, как локальная переменная размещается в стеке, и как указатель стека увеличивается вплоть до точки вершины стека. Способность захватить кадр стека в отладчике очень полезно для пошагового выполнения (трассировки) функций, захвата состояния стека при аварии программы, и отслеживания переполнений стека.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.3 События отладчика.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Отладчик работает как бесконечный цикл который ждет события отладки. Когда событие для отладки случается, цикл прерывается, и вызывается соответствующий обработчик событий.&lt;br /&gt;
&lt;br /&gt;
Когда вызван обработчик событий, отладчик останавливается и ждет указаний, что ему делать дальше. Вот несколько обычных событий, которые должен улавливать отладчик:&lt;br /&gt;
&lt;br /&gt;
* Встреча точки останова (breakpoint)&lt;br /&gt;
&lt;br /&gt;
* Нарушения памяти (так же называемые нарушениями доступа или нарушением сегментации)&lt;br /&gt;
&lt;br /&gt;
* Исключения, сгенерированные отлаживаемой программой&lt;br /&gt;
&lt;br /&gt;
У каждой операционной системы разный способ отправки этих событий отладчику, которые будут описаны в главах, посвященных операционным системам. В разных операционных системах могут быть перехвачены другие события, например такие, как создание потока и процесса, или загрузка динамической библиотеки во время выполнения. Мы рассмотрим эти конкретные события, когда понадобится. &lt;br /&gt;
&lt;br /&gt;
Преимущество отладчика с возможностью создания сценариев (скриптов) - возможность построить собственные обработчики событий для автоматизации определенных задач отладки. Для примера, обычная причина переполнения буфера - нарушения целостности памяти, и это представляет большой интерес для хакера. В течение обычной сессии отладки, если случаются переполнение буфера и нарушения памяти, то вы должны перехватить отладчиком и в ручную получить информацию, которая вам интересна. Возможность создавать эти настроенные вами обработчики, не только сохраняют ваше время, но и так же позволяют вам расширить возможность управлять процессом отладки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.4 Точки останова.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Возможность остановить отлаживаемый процесс достигается установкой &lt;span style=&quot;font-style: italic;&quot;&gt;точек останова&lt;/span&gt; (breakpoints). Остановив процесс, у вас появляется возможность проверить переменные, аргументы стека, и что находится в памяти без изменения переменных процесса, прежде чем вы сможете записать их. Точки останова - это определенно самая частая вещь, которую вы можете использовать при отладке процесса, и рассмотрим их очень внимательно. Есть три основных вида точек останова: программные (soft breakponit), аппаратные (hardware breakpoint), и памяти (memory breakpoint). Они ведут себя очень похоже, но выполняются очень разными способами.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.4.1 Программные точки останова&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Программные точки &lt;/span&gt;останова используются специально для остановки процессора при выполнении инструкций и это самый частый вид точек останова, который вы будете использовать при отладке приложений. Программный брейкпоинт - это однобитная интсрукция, которая останавливает выполнение отлаживаемого процесса и передает управление обработчику исключений точек останова. В целях понимания как это работает, вам следует знать разницу между &lt;span style=&quot;font-style: italic;&quot;&gt;инструкцией&lt;/span&gt; (instruction) и &lt;span style=&quot;font-style: italic;&quot;&gt;опкодом&lt;/span&gt; (opcode) в ассемблере x86.&lt;br /&gt;
&lt;br /&gt;
Инструкция ассемблера - это высокоуровневое представление команды на выполнение для процессора. Пример:&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
MOV EAX, EBX&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Эта инструкция говорит процессору переместить значение, хранящееся в регистре EBX в регистр EAX. Очень просто, правда? Однако, процессор не знает, как интерпретировать эту инструкцию, ему нужно конвертировать её в что-то, называемое опкодом. &lt;span style=&quot;font-style: italic;&quot;&gt;Код операции&lt;/span&gt; (code operation) или &lt;span style=&quot;font-style: italic;&quot;&gt;опкод&lt;/span&gt; это команда машинного языка, которую выполняет процессор. Для иллюстрации, давайте переведем предыдущий пример инструкции в его &quot;родной&quot; опкод:&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
8BC3&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как вы можете видеть, он затемняет (обфусцирует) то, что реально происходит &quot;за сценой&quot;, но это язык, на котором говорит процессор. Думать о инструкциях ассемблера, как DNS (прим. Сервер имён) для процесора. Инструкции упрощают возможность запомнить команды выполнения (имена сайтов, хостов), вместо запоминания всех индивидуальных опкодов (IP адреса). Вам очень редко понадобится использовать опкоды в вашей обыденной отладке, но они важны для понимания целей программных точек останова. &lt;br /&gt;
&lt;br /&gt;
Если инструкция, которую мы рассматривали ранее, будет находится по адресу 0x44332211, общее представление будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
0x44332211:    8BC3      MOV EAX, EBX&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Это отображаются адрес, опкод, и высокоуровневая инструкция ассеблера. Для того, чтобы установить программный брейкпоинт по этому адресу и остановить процессор, мы заменим один байт из 2-байтного опкода 8BC3. Этот одиночный байт представляет собой инструкцию прерывания (interrupt) 3 (INT 3), которая &quot;приказывает&quot; процессору остановится. Инструкция INT3 конвертируется в однобайтный опкод 0xCC. Вот наш предыдущий пример до и после установки точки останова.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Опкод до установки точки останова&lt;/span&gt;&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
0x44332211:    &lt;span style=&quot;font-weight: bold;&quot;&gt;8B&lt;/span&gt;C3      MOV EAX, EBX&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Модифицированный опкод после установки точки останова&lt;/span&gt;&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
0x44332211:    &lt;span style=&quot;font-weight: bold;&quot;&gt;CC&lt;/span&gt;C3      MOV EAX, EBX&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Вы можете видеть, что заменили байт 8B на байт CC. Когда процессор идет вприпрыжку (кроме шуток, comes skipping along) и натыкается на этот байт, он останавливается и запускает событие INT 3. Отладчики имеют встроенную возможность обрабатывать это событие, но прежде чем вы разработаете ваш собственный отладчик, надо хорошо понимать, как они делают это. Когда отладчик говорит установить точку останова в желаемый адрес, он сначала читает первый байт опкода по запрошенному адресу и сохраняет его. Затем отладчик записывает CC байт по этому адресу. Когда точка останова, или INT 3, срабатывает при интерпретации процессором опкода CC, отладчик перехватывает это. Затем отладчик проверяет указывает ли &lt;span style=&quot;font-style: italic;&quot;&gt;указатель инструкций&lt;/span&gt; (регистр EIP) на адрес, на который предварительно была установлена точка останова. Если адрес находится во внутреннем списке точек останова, он записывает обратно сохраненный байт по этому адресу, чтобы опкод мог выполниться правильно, после продолжения выполнения процесса. Рисунок 2-3 детально описывает этот процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/ftYjecvyOSjemwTi9WQ6XA?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2jB7_j4yxKzCBOu3noWk5GTscfzjgWEOb-IqyfLnSLu2bEaY1pQxLxZxzlL7PLQO0rdPEb98_OCAy0rOVl__xJrcAP29zBvaZa6OlrYcCegzDI7WGUXkeajrsr3n6yf3qGxM1RoKsXmxX/s800/breakpoint.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.com/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Рисунок 2-3. &lt;span style=&quot;font-style: italic;&quot;&gt;Процесс установки программной точки останова.&lt;/span&gt;&lt;br /&gt;
Перевод:&lt;br /&gt;
1) Отладчик посылает инструкцию установить точку останова по адресу 0x44332211; он считывает и сохраняет первый байт.&lt;br /&gt;
2) Переписывает первый байт на опкод 0xCC (INT 3).&lt;br /&gt;
3) Когда процессор встречает точку останова, происходит внутренний поиск, и байт возвращается на место.&lt;br /&gt;
Breakpoint List - список точек останова.&lt;br /&gt;
&lt;br /&gt;
Как видите, отладчик должен словно станцевать, чтобы обработать программную точку останова. Есть два типа точек останова, которые вы можете установить: одноразовые (one-shot) брейкпоинты и стойкие (persistent) точки остановы. &lt;span style=&quot;font-style: italic;&quot;&gt;Одноразовые точки останова&lt;/span&gt; подразумевают то, что точка останова встречается, она удаляется из внутреннего списка точек останова отладчика, они удобны для только одной установки. &lt;span style=&quot;font-style: italic;&quot;&gt;Стойкая точка останова&lt;/span&gt; восстанавливается после того, как процессор выполнит оригинальный опкод, поэтому запись в списке отладчика сохраняется.&lt;br /&gt;
&lt;br /&gt;
Однако программные точки останова имеют одно ограничение, когда вы меняете байт исполняемого в памяти, вы изменяете контрольную сумму &lt;span style=&quot;font-style: italic;&quot;&gt;циклического избыточного кода&lt;/span&gt; (Cyclic redundancy code, CRC) выполняемого приложения. CRC - это тип функции, которая используется для определения изменения данных каким либо способом, и она может быть применена к файлам, памяти, тексту, сетевым пакетам, или чего-нибудь еще, за изменением данных которого вам надо наблюдать. CRC возьмет диапазон данных, в данном случае память выполняемого процесса, и получит хэш содержимого. Затем она сравнивает хеш с контрольной суммой для определения были ли изменены данные. Если контрольная сумма отличается от контрольной суммы, которая хранится для подтверждения, проверка CRC собьется. Важно заметить, как часто вредоносное ПО будет проверять свой исполняемый код в памяти для любых изменений CRC и убьёт себя, если обнаружится сбой. Это очень эффективная техника для замедления реверс-инженерии, таким образом предотвращается использование программных точек останова, ограничивая динамический анализ его поведения. Для того, чтобы обойти эти особенности используются аппаратные точки останова.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;2.4.2 Аппаратные точки останова.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Аппаратные точки останова&lt;/span&gt; (hardware breakpoints) полезны, когда нужно установить небольшое число точек останова, и отлаживаемая программа не может быть модифицирована. Этот тип точек устанавливается на уровне процессора, в специальных регистрах, называемых &lt;span style=&quot;font-style: italic;&quot;&gt;регистрами отладки&lt;/span&gt;. Типичный процессор имеет 8 регистров отладки (по порядку с DR0 до DR7 соответственно), которые используются для установки и управлением аппаратных точек. Регистры отладки с DR0 до DR3 зарезервированы для адресов точек останова. Это означает, что вы можете использовать лишь 4 аппаратных точки одновременно. Регистры DR4 и DR5 зарезервированы, а регистр DR6 используется, как регистр статуса, который определяет тип события отладки, вызванного встречей точки останова. Регистр отладки DR7 по существу является выключателем (вкл/выкл) аппаратных точек останова, а так же хранит разные состояния точек останова. При установке специальных флагов в регистр DR7, вы можете создать точки останова в следующих состояниях:&lt;br /&gt;
&lt;br /&gt;
* Останов, когда инструкция выполняется по определенному адресу.&lt;br /&gt;
&lt;br /&gt;
* Останов, когда данные записываются по адресу.&lt;br /&gt;
&lt;br /&gt;
* Останов на чтение или запись, но не выполнение.&lt;br /&gt;
&lt;br /&gt;
Это очень полезно, если у вас есть возможность выставить до четырех точек останова в конкретные состояния без модифицирования выполняемого процесса. Рисунок 2-4 покажет вам как поля в DR7 связанны с поведением аппаратных точек останова, длиной и адресом.&lt;br /&gt;
&lt;br /&gt;
Биты 0-7 по существу переключатели (вкл/выкл) для активации точек останова. Поля L и G в битах 0-7 стоят для глобального и локального масштаба. Я изобразил оба бита, как установленные. Тем не менее, установка только одного из них будет работать, и на моем опыте у меня не было каких либо проблем в отладке на уровне пользователя. Биты 8-15 в DR7 не используются для нормальных целей отладки, которые мы будем осуществлять. Обратитесь к мануалу по архитектуре Intel x86 для дополнительного разъяснения назначения этих битов. Биты 16-31 определяют тип и длину точки останова, которая была установлена для связанного регистра отладки.&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/3V72dPkN7X6cZuqCitBEYg?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitJG47zNMlv-RCi6tGu6varBg9dFMYj1ZWtXcecG3Eat_BnhxJY-pg3EVa8QBPPu8qvKiAv8y3KMuFUk3Qy2RYn2DgmJ2wY2RtY15v_o2yYQ_gTZDVQydUal05snLCZ_V-dBN3POFXKQ83/s800/DR7.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.com/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/Cl7Bn6MF6tHRmCA4njz-Cg?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiz_SMFDUClMOW2DsRXhNSuwAOSERFmsFaS1NXAUrhb_xy_fW9f83aFs96u7RqkSgF5yWdk4nC6XV1sZtXFYjJBX-QGj9GuJEK_i0ss9vh0F1t-pb2hP2QO161TnwEQ2BtRg1DnCKpz2DN/s800/flags.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.com/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Рисунок 2-4. &lt;span style=&quot;font-style: italic;&quot;&gt;Вы можете видеть, как установка флагов в регистре DR7 указывает тип используемой точки останова.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Перевод:&lt;br /&gt;
Layout of DR7 register - вывод регистра DR7.&lt;br /&gt;
Type - тип&lt;br /&gt;
Len - сокр. длина.&lt;br /&gt;
DR7 with 1-byte Execution Breakpoint Set at... - DR7 с точкой останова на исполнение 1 байта установленной по адресу...&lt;br /&gt;
DR7 with Additional 2-byte Read/Write Breakpoint at... - DR7 с точкой останова на исполнение дополнительного 2-байтного чтения/записи по адресу...&lt;br /&gt;
Breakpoint Flags - флаги точек останова&lt;br /&gt;
Breakpoint Length Flags - фдаги длины точек останова&lt;br /&gt;
Break on execution - останов, когда инструкция выполняется.&lt;br /&gt;
Break on data writes - останов на запись данных.&lt;br /&gt;
Break on read or write but not execution - останов на чтение или запись, но не выполнение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В отличие от программных, которые используют событие INT3, аппаратные точки используют прерывание 1 (INT1). INT1 случается для аппаратных точек останова и одноступенчатых событий.  &lt;span style=&quot;font-style: italic;&quot;&gt;Одноступенчатый&lt;/span&gt; означает проход по порядку по инструкциям, что позволяет вам очень близко исследовать критические участки кода во время изменения наблюдаемых данных. &lt;br /&gt;
&lt;br /&gt;
Аппаратные точки останова обрабатываются таким же способом, как и программные, но их механизм находится на низком уровне. Прежде чем процессор попытается выполнить инструкцию, он сначала проверит, не установлена ли на адрес аппаратная точка. Он так же проверит операторов инструкции, не имеют ли они доступ к адресу, на который установлена аппаратная точка. Если адрес хранится в регистрах отладки DR0-DR3 и условия чтения, записи, или выполнения встречаются, прерывание INT1 приказывает процессору остановиться. Если адрес не хранится в регистрах отладки, процессор выполняет инструкцию и переходит к следующей, и эта проверка выполняется снова, и так далее.&lt;br /&gt;
&lt;br /&gt;
Аппаратные точки очень полезны, но у них есть некоторые ограничения. Помимо того, что вы можете выставить только четыре ваших точки в одно время, вы так же можете установить точку только на данные длинной 2 байта. Это может сильно ограничить вас, если вы собираетесь получить доступ к большому участку памяти. Как правило, для обхода этих ограничений вы можете использовать точки останова памяти.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;2.4.3. Точки останова памяти.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Точки останова памяти&lt;/span&gt; являются не совсем точками останова. Когда отладчик устанавливает точку памяти, он меняет разрешения на регион, или &lt;span style=&quot;font-style: italic;&quot;&gt;страницу&lt;/span&gt; (page) памяти. Страница памяти - это наименьшая порция памяти, которую обрабатывает операционная система. Когда страница памяти выделяется, у нее устанавливаются конкретные разрешения на доступ, которые указывают как эта память может быть доступна. Вот некоторые примеры разрешений на страницу памяти:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Выполнение страницы &lt;/span&gt;(page execution)  Дает возможность выполнять, но выдает нарушение, если процесс попытается прочитать или записать данные на страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Чтение страницы&lt;/span&gt; (Page read)  Позволяет процессу только считывать со страницы; любая запись или попытка выполнения вызовут нарушение доступа.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Запись страницы&lt;/span&gt; (Page write)  Позволяет процессу записывать на страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Сторожевая страница &lt;/span&gt;(Guard page)  Любой доступ к сторожевой странице возвращает единовременное исключение, и затем страница возвращается к своему первоначальному статусу.&lt;br /&gt;
&lt;br /&gt;
Большинство операционных систем позволяют вам комбинировать эти разрешения. Например, вы можете иметь страницу памяти, куда вы можете писать и читать, в то время, как другая страница может позволить вам прочитать или выполнить. Каждая операционная система так же имеет присущие функции, позволяющие вам запрашивать конкретные разрешения памяти в месте для особой страницы и изменять их, если понадобится. Посмотрите на Рисунок 2-5, чтобы увидеть, как доступ к данным работает с разными установленными разрешениями страницы памяти.&lt;br /&gt;
&lt;br /&gt;
Главная интересующее нас разрешение для страницы - &lt;span style=&quot;font-style: italic;&quot;&gt;сторожевая страница&lt;/span&gt;. Этот тип страниц очень полезен для таких вещей, как отделение кучи от стека или убеждения в том, что часть памяти не разрастется за пределы ожидаемого диапазона. Она так же хороша для остановки процесса, когда он встречает особую часть памяти. Например, если мы реверс-инженируем сетевое серверное приложение, мы должны будем установить точку останова памяти на регион памяти, где хранится полезная нагрузка пакета, после его получения. Это позволит нам определить когда и как приложение использует содержимое полученного пакета, как и любой имеющий доступ к этой странице памяти будет останавливать процессор, кидая отладочное исключение сторожевой страницы. Затем мы можем проверить инструкцию, которая имеет доступ к буферу в памяти и определить, что происходит с содержимым. Эта техника точек останова так же работает с проблемами деформации данных, которые имеют программные точки останова, так как мы не изменяем исполняемый код.&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width: auto;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/ZonNAsisdCGj8w1h4FLmJg?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitELuaf01g3xXNadv2heSnU08CI48ioeqcFIF17qTjhSQLdo_OKrW9bR0666rbzS0CAzcVxYetPSnNOTgim-vVdQSY3DUQyjOOyb_FqQ2bB87Xvi8wZdFopC5FfZPtZ0RK2jHQFWT5TB3Q/s800/premission.PNG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;font-family: arial,sans-serif; font-size: 11px; text-align: right;&quot;&gt;Альбом: &lt;a href=&quot;http://picasaweb.google.com/mikhail.chumichev/RHYCDB?authkey=Gv1sRgCJfsp5aVlujA9AE&amp;amp;feat=embedwebsite&quot;&gt;Записки, статьи, работы.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Рисунок 2-5. &lt;span style=&quot;font-style: italic;&quot;&gt;Поведение разных разрешений страниц памяти.&lt;/span&gt;&lt;br /&gt;
Перевод:&lt;br /&gt;
Read, Write, or Execute flags on a memory page allow data to be moved in and out or executed on - Флаги на чтение, запись или выполнение на странице памяти позволяют данным быть записанными и полученными или выполненным на странице.&lt;br /&gt;
&lt;br /&gt;
Any type of data access on a guard page will result in an exception being raised. The original data operation will fail. - Любой тип доступа к данным на сторожевой странице приведут к возникновению исключения. Оригинальная операция с данными не выполнится.&lt;br /&gt;
&lt;br /&gt;
GUARD PAGE EXCEPTION - исключение сторожевой страницы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наконец, мы рассмотрели некоторые простейшие аспекты того, как работает отладчик и как он взаимодействует с операционной системой, теперь пришло время написать наш первый легковесный отладчик на Python. Мы начнем с создание простенького отладчика в Windows, где накопленные знания о ctypes и внутренностях отладчика нам очень пригодятся. Давайте разогреем наши пальцы для кодинга.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/3982024754522633660/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-02-v-05.html#comment-form' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3982024754522633660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3982024754522633660'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-02-v-05.html' title='Gray Hat Python Глава 02 v. 0.5'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s72-c/2011-12-05+13.52.34.jpg" height="72" width="72"/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-7712611505203779121</id><published>2010-03-25T04:34:00.000-07:00</published><updated>2010-04-07T03:03:55.342-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>Настройка JDBC и MySQL</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobilmedia.ucoz.ru/Java.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 181px; height: 150px;&quot; src=&quot;http://mobilmedia.ucoz.ru/Java.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://wiki.realxtend.org/images/2/2f/Logo-mysql.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 145px;&quot; src=&quot;http://wiki.realxtend.org/images/2/2f/Logo-mysql.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Недавно столкнулся со следующей проблемой: настройка драйвера JDBC для MySQL. JDBC - это такая хрень, позволяющая кодить на java для работы с базами данных. Перерыв n-ое количество литературы, нашел оптимальное для меня решение. И так по порядку.&lt;br /&gt;&lt;br /&gt;Нам понадобится:&lt;br /&gt;* сам MySQL. Установить и настроить его - &lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;гугл &lt;/a&gt;в помощь.&lt;br /&gt;* коннектор с JDBC. Лежит &lt;a href=&quot;http://dev.mysql.com/downloads/connector/j/&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; (из всего, что там будет, нам понадобится один файл вида mysql-connector-java-версия-bin.jar )&lt;br /&gt;* кривые руки - 2 шт.&lt;br /&gt;&lt;br /&gt;Поехали.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Запускаем MySQL. Создаем новую БД. Например &lt;span style=&quot;font-weight: bold;&quot;&gt;test&lt;/span&gt;. *.jar файл копируем в lib&#39;ы виртуальной машины. Т.к. работаю под виндой, то кидаем это приблизительно сюда: C:\Program Files\Java\jre6\lib\ext .&lt;br /&gt;&lt;br /&gt;Ну а теперь переходим к самому кодингу.&lt;br /&gt;&lt;br /&gt;Для начала создадим файл &lt;span style=&quot;font-weight:bold;&quot;&gt;database.properties&lt;/span&gt;.&lt;br /&gt;В нем пропишем:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;jdbc.drivers=com.mysql.jdbc.Driver&lt;br /&gt;jdbc.url=jdbc:mysql://localhost/test&lt;br /&gt;jdbc.username=username&lt;br /&gt;jdbc.password=password&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Первая строчка указывает драйвер БД. Вторая саму БД, к которой будем обращаться. Третья и четвертая соответственно имя пользователя и пароль (заведенные в MySQL). Да, к сожалению в данном примере пароль будет лежать в открытом виде. Но для данного случая нам не столь актуально.&lt;br /&gt;&lt;br /&gt;Теперь касательно подключения к БД в коде java. Самый удачный лично для меня пример лежит &lt;a href=&quot;http://www.horstmann.com/corejava.html&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; В архиве в папке v2ch04\TestDB (в *nix соотвественно ~\v2ch04\TestDB) в файле TestDB.java есть следующий код:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; /**&lt;br /&gt;  * Установка соединения с использованием свойств,&lt;br /&gt;  * заданных в файле database.properties&lt;br /&gt;  * @return Соединение с базой данных&lt;br /&gt;  */&lt;br /&gt; public static Connection getConnection() throws SQLException, IOException {&lt;br /&gt;  Properties props = new Properties();&lt;br /&gt;  FileInputStream in = new&lt;br /&gt;   FileInputStream(&quot;database.properties&quot;);&lt;br /&gt;  props.load(in);&lt;br /&gt;  in.close();&lt;br /&gt;  &lt;br /&gt;  String drivers = props.getProperty(&quot;jdbc.drivers&quot;);&lt;br /&gt;  &lt;br /&gt;  if (drivers != null) System.setProperty(&quot;jdbc.drivers&quot;,drivers);&lt;br /&gt;  &lt;br /&gt;  String url = props.getProperty(&quot;jdbc.url&quot;);&lt;br /&gt;  String username = props.getProperty(&quot;jdbc.username&quot;);&lt;br /&gt;  String password = props.getProperty(&quot;jdbc.password&quot;);&lt;br /&gt;  &lt;br /&gt;  return DriverManager.getConnection(url,username,password);&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Как-то так. Если что-то мне понадобиться, обращайтесь, допилю.</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/7712611505203779121/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/jdbc-mysql.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/7712611505203779121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/7712611505203779121'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/jdbc-mysql.html' title='Настройка JDBC и MySQL'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-8542967863037181243</id><published>2010-03-25T04:32:00.000-07:00</published><updated>2010-04-05T03:32:19.217-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="wimax"/><category scheme="http://www.blogger.com/atom/ns#" term="yota"/><title type='text'>Yota или аспекты настройки wimax в Ubuntu 9.10 на samsung nc10</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://httplog.ru/wp-content/yota_11.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 397px; height: 265px;&quot; src=&quot;http://httplog.ru/wp-content/yota_11.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Возникали у меня один раз некоторые трудности при запуске встроенного wimax модема от небезызвестной  компании Yota™ на моем уютном нетбуке Samsung NC10 в ОС Ubuntu 9.10. Было это относительно давно, но инструкцию я на всякий случай сохранил.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Начал я за здравие по следующей &lt;a href=&quot;http://habrahabr.ru/blogs/linux/60040/&quot; target=&quot;_blank&quot;&gt;инструкции&lt;/a&gt;. Цитирую полезное:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Установка.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Берем нужную библиотеку &lt;a href=&quot;http://sourceforge.net/projects/libusb/files/&quot; target=&quot;_blank&quot;&gt;libusb&lt;/a&gt; (советую libusb 1.0.0 ибо она сама стабильная)&lt;br /&gt;Ставим ее:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family: courier new;&quot;&gt;~$ tar xvjf libusb-1.0.0.tar.bz2&lt;br /&gt;~$ cd libusb-1.0.0&lt;br /&gt;~/libusb-1.0.0$ ./configure&lt;br /&gt;~/libusb-1.0.0$ make&lt;br /&gt;~/libusb-1.0.0$ sudo make install&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Далее берем сами дрова. Берем их &lt;a href=&quot;http://code.google.com/p/madwimax/downloads/list&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;. (Опять же, из соображений стабильности лучше брать версию 0.1.0).&lt;br /&gt;Ставим:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family: courier new;&quot;&gt;~$ tar zxvf madwimax-0.1.0.tar.gz&lt;br /&gt;~$ cd madwimax-0.1.0&lt;br /&gt;~/madwimax-0.1.0$ ./configure&lt;br /&gt;~/madwimax-0.1.0$ make&lt;br /&gt;~/madwimax-0.1.0$ sudo make install&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;По идее тут уже можно и запустить, что мы сейчас и попробуем:&lt;br /&gt;&lt;blockquote&gt;~$ sudo /usr/local/madwimax/sbin/madwimax&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Если пошла связь, то поздравляю, и переходим к пункту &quot;окончательная допилка&quot;.&lt;br /&gt;&lt;br /&gt;Однако, как показывает практика, очень часто люди сталкиваются с ошибкой&lt;br /&gt;&lt;blockquote&gt;error while loading shared libraries: libusb-1.0.so.0: cannot open shared object file: No such file or directory&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Устранение возможных ошибок и допилка.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Тогда выполняем следующую команду:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;~$ ldd /usr/local/madwimax/sbin/madwimax&lt;br /&gt;linux-gate.so.1 =&gt;  (0xb7fc7000)&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;libusb-1.0.so.0 =&gt; not found&lt;/span&gt;&lt;br /&gt;libpthread.so.0 =&gt; /lib/tls/i686/cmov/libpthread.so.0 (0xb7f83000)&lt;br /&gt;libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0xb7e24000)&lt;br /&gt;/lib/ld-linux.so.2 (0xb7fad000)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Видим, что драйвера wimax библиотеку libusb не видят. Поэтому делаем следующее:&lt;br /&gt;Редактируем файл &lt;span style=&quot;font-weight: bold;&quot;&gt;/etc/ld.so.conf&lt;/span&gt;.&lt;br /&gt;Он должен состоять только из одной строчки&lt;br /&gt;&lt;blockquote&gt;include /etc/ld.so.conf.d/*.conf&lt;/blockquote&gt;&lt;br /&gt;Дописываем перед этой строчкой еще одну, чтобы выглядело так:&lt;br /&gt;&lt;blockquote&gt;/usr/local/lib&lt;br /&gt;include /etc/ld.so.conf.d/*.conf&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Затем обновляем это дело:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;~$ sudo ldconfig&lt;/blockquote&gt;&lt;br /&gt;И вновь смотрим как будут вести себя дрова:&lt;blockquote&gt;&lt;br /&gt;~$ ldd /usr/local/madwimax/sbin/madwimax&lt;br /&gt;linux-gate.so.1 =&gt;  (0xb8008000)&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;libusb-1.0.so.0 =&gt; /usr/local/lib/libusb-1.0.so.0 (0xb7fd0000)&lt;/span&gt;&lt;br /&gt;libpthread.so.0 =&gt; /lib/tls/i686/cmov/libpthread.so.0 (0xb7f83000)&lt;br /&gt;libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0xb7e24000)&lt;br /&gt;     librt.so.1 =&gt; /lib/tls/i686/cmov/librt.so.1 (0xb7e4f000)&lt;br /&gt;/lib/ld-linux.so.2 (0xb7fad000)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;И видим, что все дрова видят. Теперь еще раз пробуем запускать:&lt;br /&gt;&lt;blockquote&gt;~$ sudo /usr/local/madwimax/sbin/madwimax&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Окончательная допилка.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Спасибо за это &lt;a href=&quot;http://community.livejournal.com/yota_ru/126960.html&quot; target=&quot;_blank&quot;&gt;комьюнити Yota в жж.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;После удачного запуска драйвера появится интерфейс wimax0 (или что-то в этом духе, это так и так отобразится при запуске дров: Allocated tap interface: wimax0 ), ну а терминал будет недоступен. Поэтому в следующем терминале останется сделать еще чуть-чуть:&lt;br /&gt;&lt;blockquote&gt;~$ sudo ifconfig wimax0 up&lt;br /&gt;~$ sudo dhclient wimax0&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;И теперь можно пользоваться интернетом. Правда есть один баг (цитирую):&lt;br /&gt;&lt;blockquote&gt;Сегодня при тестировании обнаружил, что если после подключения некоторое время нет траффика, соединение обрывается и почему-то не восстанавливается. Помогает только перезапуск драйвера. Это, очевидно, баг, с ним будем бороться. Пока же можно просто что-нибудь все время пинговать, чтобы был траффик и соединение не обрывалось.&lt;/blockquote&gt;&lt;br /&gt;Ну, думаю, пинговать тот же ya.ru особого труда ни для кого сложности не составит.&lt;br /&gt;&lt;br /&gt;Ну и на сладкое.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;А теперь мой случай.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Однако на моем нетбуке эти дрова повели себя совершенно по-другому и выдали мне ошибку:&lt;br /&gt;&lt;blockquote&gt;Could not find/open device&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Весь вчерашний вечер я ломал себе мозг, что с этим делать. Перелопатил некоторое количество документации. И вот, наконец нашел &lt;a href=&quot;http://forum.yotatester.ru/showthread.php?p=8088#post8088&quot; target=&quot;_blank&quot;&gt;решение&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Смотрим следующее. Команда &lt;span style=&quot;font-weight: bold;&quot;&gt;lsusb&lt;/span&gt; отображает все USB устройства. Наш встроенный модем, как бы это не было парадоксально, к ним так же относится. Поэтому выполняем:&lt;br /&gt;&lt;blockquote&gt;~$: lsusb&lt;br /&gt;Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;Bus 003 Device 002: ID 0a5c:2101 Broadcom Corp. A-Link BlueUsbA2 Bluetooth&lt;br /&gt;Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;Bus 001 Device 004: ID 0ac8:c326 Z-Star Microelectronics Corp.&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Bus 001 Device 003: ID 04e8:6731 Samsung Electronics Co., Ltd&lt;/span&gt;&lt;br /&gt;Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Число 6731 в ID нам еще очень пригодится.&lt;br /&gt;Далее займемся быдлокодингом.&lt;br /&gt;Строчку&lt;blockquote&gt;&lt;br /&gt;{ 0x04e8, 0x6731 },&lt;/blockquote&gt;&lt;br /&gt;вставим в файле &lt;span style=&quot;font-weight: bold;&quot;&gt;~/madwimax-0.1.0/src/wimax.c&lt;/span&gt; в массив  &lt;blockquote&gt;static usb_device_id_t wimax_dev_ids[] = {&lt;/blockquote&gt;&lt;br /&gt;Т.е. выглядеть это будет так:&lt;br /&gt;Где-то в дебрях &lt;span style=&quot;font-weight: bold;&quot;&gt;wimax.c&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;/* list of all known devices */&lt;br /&gt;static usb_device_id_t wimax_dev_ids[] = {&lt;br /&gt;{ 0x04e8, 0x6761 },&lt;br /&gt;{ 0x04e9, 0x6761 },&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;        { 0x04e8, 0x6731 },&lt;/span&gt;//это и есть ID встроенного модема&lt;br /&gt;};&lt;/blockquote&gt;&lt;br /&gt;Ну а далее заново собираем madwimax.&lt;br /&gt;Затем, на всякий случай правим файл &lt;span style=&quot;font-weight: bold;&quot;&gt;/etc/udev/rules.d/z60_madwimax.rules&lt;/span&gt; чтобы выглядело так:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# udev rules file for madwimax supported devices&lt;br /&gt;SUBSYSTEM!=&quot;usb|usb_device&quot;, GOTO=&quot;madwimax_rules_end&quot;&lt;br /&gt;ACTION!=&quot;add&quot;, GOTO=&quot;madwimax_rules_end&quot;&lt;br /&gt;&lt;br /&gt;ATTRS{idVendor}==&quot;04e8&quot;, ATTRS{idProduct}==&quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;6731&lt;/span&gt;&quot;, ATTR{bInterfaceNumber}==&quot;01&quot;, RUN+=&quot;/bin/sh -c &#39;/bin/echo -n $kernel &gt; /sys/$devpath/driver/unbind&#39;&quot;&lt;br /&gt;ATTRS{idVendor}==&quot;04e9&quot;, ATTRS{idProduct}==&quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;6731&lt;/span&gt;&quot;, ATTR{bInterfaceNumber}==&quot;01&quot;, RUN+=&quot;/bin/sh -c &#39;/bin/echo -n $kernel &gt; /sys/$devpath/driver/unbind&#39;&quot;&lt;br /&gt;ATTR{idVendor}==&quot;04e8&quot;, ATTR{idProduct}==&quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;6731&lt;/span&gt;&quot;, RUN+=&quot;/usr/local/madwimax/sbin/madwimax -qd --exact-device=$attr{busnum}/$attr{devnum}&quot;&lt;br /&gt;ATTR{idVendor}==&quot;04e9&quot;, ATTR{idProduct}==&quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;6731&lt;/span&gt;&quot;, RUN+=&quot;/usr/local/madwimax/sbin/madwimax -qd --exact-device=$attr{busnum}/$attr{devnum}&quot;&lt;br /&gt;&lt;br /&gt;LABEL=&quot;madwimax_rules_end&quot;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Т.е. меняем 6761 на 6731 и раскоментируем все строчки.&lt;br /&gt;После этого у меня модем заскакал, как сивый мерин.</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/8542967863037181243/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/yota-wimax-ubuntu-910-samsung-nc10.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/8542967863037181243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/8542967863037181243'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/yota-wimax-ubuntu-910-samsung-nc10.html' title='Yota или аспекты настройки wimax в Ubuntu 9.10 на samsung nc10'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-3579259667003528287</id><published>2010-03-23T03:50:00.000-07:00</published><updated>2010-03-23T04:02:47.100-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="афоризмы"/><category scheme="http://www.blogger.com/atom/ns#" term="копипаста"/><title type='text'>Жизненное</title><content type='html'>Ученик спросил Учителя:&lt;br /&gt;&lt;br /&gt;        * Правда ли, что любой шифр можно сломать?&lt;br /&gt;&lt;br /&gt;    Учитель ответил:&lt;br /&gt;&lt;br /&gt;        * Можно. Но не «шифр», а систему из четырёх сотавляющих: алгоритм, реализация, окружение и оператор.&lt;br /&gt;&lt;br /&gt;    Тогда Сисадмин задал ещё один вопрос:&lt;br /&gt;&lt;br /&gt;        * А что из этих четырёх самое непрочное?&lt;br /&gt;        * Стыки между ними, – ответил Учитель.</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/3579259667003528287/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3579259667003528287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3579259667003528287'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/blog-post.html' title='Жизненное'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-691924750166410621</id><published>2010-03-11T12:26:00.000-08:00</published><updated>2011-12-14T05:09:21.791-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Gray Hat Python Глава 01 v. 0.6</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s1600/2011-12-05+13.52.34.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s320/2011-12-05+13.52.34.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Как и обещал, выкладываю перевод первой главы весьма интересной книги &quot;Gray Hat Python&quot;. Перевод пока весьма сыроват, но зато он есть. Буду рад замечаниям в переводе, вопросам и техническим уточнениям. И так, поехали.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Глава 1. Настройка вашего рабочего окружения.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Прежде чем вы начнете совершенствоваться в искусстве программирования в Серой Шляпе на языке Python, вам следует пройти самую неинтересную часть этой книги - настройки вашей будущей рабочей среды разработки. Весьма важно, чтобы вы имели хорошую и удобную среду разработки, которая позволит вам провести время в поглощении крайне интересной информации в данной книге, а не спотыкаться и набивать шишки, пытаясь заставить ваш код выполняться.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Эта глава быстро покрывает тему установки и настройки Python 2.5 (на момент перевода версия Python уже 2.6, как будет работать с 3 версией без понятия, но всё равно для всех примеров в книге будет использоваться Python именно версии 2.5. прим. пер.), конфигурирования вашего рабочего окружения Eclipse, и основы написания Си-совместимого кода на Python. Как только вы настроите окружение и поймете основы,&lt;br /&gt;
мир будет для вас устрицей, а эта книга покажет вам, как её открыть.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.1. Требования к системе.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Я предполагаю, что вы используете 32-битную ОС, основанную на базе Windows (XP, Vista, 7). Windows имеет широкий спектр инструментов и хорошо поддается для программирования на Python. Все главы этой книги ориентированны в первую очередь на Windows, и большинство примеров будут работать только с ОС Windows.&lt;br /&gt;
&lt;br /&gt;
Однако, будет несколько примеров, которые вы можете запустить на дистрибутиве Linux. Для разработки под Linux я рекомендую вам скачать 32-битный дистрибутив Linux&#39;a как VMware устройства. Проигрыватель VMware устройств бесплатен, и позволяет вам быстро перемещать файлы с вашей рабочей системы на виртуальную Linux машину. Если у вас завалялся лишний компьютер, можете попробовать свои силы и установить полноценную Linux систему. Для целей книги использовался основанный на Red Hat Linux дистрибутив, вроде Fedora Core 7 или Centos 5. Конечно, в качестве альтернативы, вы можете запустить Linux и сэмулировать на нём Windows. Это дело вашего вкуса.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;br /&gt;
/==============================================\&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Бесплатные образы для VMware.&lt;/span&gt;&lt;br /&gt;
На сайте VMware есть каталог бесплатных устройств. Эти устройства позволяют обратному разработчику (реверс инженеру) или исследователю уязвимостей разместить вредоносную программу (malware) или приложения на виртуальной машине, сокращая к минимуму риски для физической инфраструктуры и предоставляют изолированный &quot;черновик&quot; для работы. Вы можете посетить страницу виртуальных устройств по адресу &lt;a href=&quot;http://www.vmware.com/appliances/&quot;&gt;&lt;/a&gt; и скачать плеер по адресу &lt;a href=&quot;http://www.vmware.com/products/player/&quot;&gt;&lt;/a&gt; .&lt;br /&gt;
\==============================================/&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.2 Получение и установка Python 2.5&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Среда Python устанавливается быстро и безболезненно как на Linux так и на Windows. Пользователям Windows облегчит жизнь установщик, который позаботится обо всех настройках, однако на Linux вы будете собирать и устанавливать Python из исходных кодов (Однако на очень многих дистрибутивах Linux Python 2.5 установлен &quot;из коробки&quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.2.1 Установка Python в Windows.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Пользователи Windows могут получить установщик с официального сайта Python &lt;a href=&quot;http://www.python.org/ftp/python/2.5.1/python-2.5.1.msi&quot;&gt;&lt;/a&gt;. Только дважды щелкните мышкой по файлу установщика и следуйте далее шаг за шагом по этапам установки. Установщик создаст каталог &lt;span style=&quot;font-style: italic;&quot;&gt;C:\Python25/&lt;/span&gt;. В этом каталоге будут установлены файл &lt;span style=&quot;font-style: italic;&quot;&gt;python.exe&lt;/span&gt; - интерпретатор команд Python, а так же все стандартные библиотеки.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Примечание:&lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;Вместо этого вы можете установить отладчик Immunity Debugger, который содержит не только сам отладчик, но и установщик Python 2.5. В последних главах книги вы будете использовать Immunity Debugger для многих задач, поэтому вы можете &quot;убить двух зайцев&quot; одной установкой. Чтобы скачать и установить Immunity Debugger, посетите &lt;a href=&quot;http://debugger.immunityinc.com/&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.2.2 Установка Python в Linux&lt;/span&gt;&lt;br /&gt;
Для установки Python 2.5 в ОС Linux, вам следует скачать и скомпилировать исходные коды. Это дает вам полный контроль над настройками в процессе установки Python в ОС на базе Red Hat. Процесс установки подразумевает, что вы будете выполнять все следующие команды от имени пользователя root(суперпользователя).&lt;br /&gt;
&lt;br /&gt;
Первым шагом будет загрузка и распаковка исходного кода Python 2.5. В командном терминале (консоли) вводите следующее:&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;# cd /usr/local&lt;br /&gt;# wget http://python.org/ftp/pyton/2.5.1/Python-2.5.1.tgz&lt;br /&gt;# tar -zxvf Python-2.5.1.tgz&lt;br /&gt;# mv Python-2.5.1 Python25&lt;br /&gt;# cd Python25&lt;/span&gt;&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Вы только что скачали и распаковали исходный код в &lt;span style=&quot;font-style: italic;&quot;&gt;/usr/local/Python25&lt;/span&gt;. Следующим шагом будет компиляция исходного кода и проверки работоспособности интерпретатора Python:&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;# ./configure --prefix=/usr/local/Python25&lt;br /&gt;# make &amp;amp;&amp;amp; make install&lt;br /&gt;# pwd&lt;/span&gt;&lt;br /&gt;
/usr/local/Python25&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;#python&lt;/span&gt;&lt;br /&gt;
Python 2.5.1 (r251:54863, Mar 14 2012, 07:39:18)&lt;br /&gt;
[GCC 3.4.6 20060404 (Red Hat 3.4.6-8)] on Linux2&lt;br /&gt;
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Теперь вы находитесь в интерактивной оболочке Python, которая предоставляет вам полный доступ к интерпретатору Python и любой встроенной библиотеке. Быстрая проверка покажет, что команды интерпретируются верно:&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print &quot;Hello World!&quot;&lt;/span&gt;&lt;br /&gt;
Hello World!&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; exit()&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;#&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Отлично! Все работает, как вам надо. Чтобы застраховаться, что ваше пользовательское окружение находит, где находится интерпретатор Pyton, автоматически, вам следует изменить файл &lt;span style=&quot;font-style: italic;&quot;&gt;/root/.bashrc&lt;/span&gt; . Лично я использую текстовый редактор nano для всех моих работ с текстом, но вы вольны выбрать любой текстовый редактор, с которым вам комфортно работать. Откройте файл /root/.bashrc и в конце файла добавьте следующую строку:&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;export PATH=/urs/local/Pyton25/:$PATH&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Эта строка укажет окружению Linux что пользователь root может иметь доступ к интерпретатору Python без указания полного пути к нему. Если вы закончите сессию root и затем войдете под root снова, когда вы введете &lt;span style=&quot;font-style: italic;&quot;&gt;python&lt;/span&gt; в любом месте в командной строке, вы незамедлительно окажетесь в интерпретаторе Python.&lt;br /&gt;
&lt;br /&gt;
====================================================&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Примечание переводчика:&lt;/span&gt; В Windows можно сделать то же самое. Для этого нужно щелкнуть правой кнопкой мыши на &quot;Мой компьютер&quot; -&amp;gt; &quot;Свойства&quot; -&amp;gt; &quot;Дополнительно&quot; -&amp;gt; &quot;Переменные среды&quot; -&amp;gt; Выбрать переменную &quot;Path&quot; -&amp;gt; &quot;Изменить&quot; -&amp;gt; В строке &quot;Значение переменной&quot; в конце дописать &lt;span style=&quot;font-style: italic;&quot;&gt;;C:\Python25&lt;/span&gt;. Далее проверяем в командной строке. Вводим &lt;span style=&quot;font-style: italic;&quot;&gt;python&lt;/span&gt; и смотрим, запустился ли интерпретатор, как в случае с Linux или нет.&lt;br /&gt;
====================================================&lt;br /&gt;
&lt;br /&gt;
И так, теперь у вас полностью рабочие интерпретаторы Python как в Windows так и в Linux. Настало время настроить вашу интегрированную среду разработки (IDE). Если у вас есть IDE в которой вам комфортно работать, то можете пропустить следующий раздел.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.3. Настройка среды Eclipse и PyDev&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
Как правило для быстрой разработки и отладки Python приложений, абсолютно необходимо использовать полноценную IDE. Взаимодействие популярной среды разработки Eclipse и модуля PyDev к нему дает вам в руки огромное число мощных возможностей, которые не предлагают большинство других средств разработки. Кроме того, Eclipse запускается одинаково в Windows, Linux, и Mac, а так же имеет отличную группу поддержки и разработки. Давайте быстро пройдем все этапы как установить и настроить Eclipse и PyDev:&lt;br /&gt;
&lt;br /&gt;
1. Скачиваете архив Eclipse Classic для вашей платформы с сайта &lt;a href=&quot;http://eclipse.org/downloads/&quot;&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
2. Распаковываете его в &lt;span style=&quot;font-style: italic;&quot;&gt;C:\Eclipse &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
3. Запускаете &lt;span style=&quot;font-weight: bold;&quot;&gt;C:\Eclipse\eclipse.exe&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
4. При первом запуске Eclipse спросит вас где хранить ваше рабочее место, вы можете принять предлагаемое место по умолчанию, и поставить галочку в графу &lt;span style=&quot;font-weight: bold;&quot;&gt;Use this as default and do not ask again&lt;/span&gt;. Щелкните на &lt;span style=&quot;font-weight: bold;&quot;&gt;OK&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
5. Как только Eclipse запустится выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;Help &amp;gt; Install new Software...&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
6. Переходите к полю  &lt;span style=&quot;font-weight: bold;&quot;&gt;Work with:&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
7. Кликните на  кнопку &lt;span style=&quot;font-weight: bold;&quot;&gt;Add...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
8. В поле Name введите описывающую строку, вроде &lt;span style=&quot;font-weight: bold;&quot;&gt;PyDev Update&lt;/span&gt;. Убедитесь, что поле URL содержит &lt;span style=&quot;font-style: italic;&quot;&gt; http://pydev.org/updates&lt;/span&gt; и щёлкните &lt;span style=&quot;font-weight: bold;&quot;&gt;OK&lt;/span&gt;. Затем щелкните &lt;span style=&quot;font-weight: bold;&quot;&gt;Finish&lt;/span&gt;, и вас выбросит в установщик обновлений Eclipse.&lt;br /&gt;
&lt;br /&gt;
9. Диалог обновлений появится через несколько мгновений. Когда он появится, выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;PyDev&lt;/span&gt; и нажмите &lt;span style=&quot;font-weight: bold;&quot;&gt;Next&lt;/span&gt; для продолжения. &lt;br /&gt;
&lt;br /&gt;
10. Затем прочитайте и примите лицензионное соглашение для PyDev. Если вы согласны с ним, то выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;I accept the terms in the license agreement.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
11. Щелкните &lt;span style=&quot;font-weight: bold;&quot;&gt;Next&lt;/span&gt; и наконец &lt;span style=&quot;font-weight: bold;&quot;&gt;Finish&lt;/span&gt;. Вы увидите, как Eclipse установит PyDev дополнение. &lt;br /&gt;
&lt;br /&gt;
12. В конце кликните &lt;span style=&quot;font-weight: bold;&quot;&gt;Yes&lt;/span&gt; в диалоговом меню, которое появится после установки PyDev. Это перезагрузит Eclipse, и запустит его с вашим новеньким PyDev.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На следующей стадии конфигурирования Eclipse вы убедитесь, что PyDev может найти правильный интерпретатор Python для последующего использования, когда вы будете запускать скрипты в PyDev:&lt;br /&gt;
&lt;br /&gt;
1. Когда запустится Eclipse, выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;Window &amp;gt; Preferences&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
2. Разверните ветвь &lt;span style=&quot;font-weight: bold;&quot;&gt;PyDev&lt;/span&gt;, и выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;Interpreter - Python&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
3. Нажмите кнопку &lt;span style=&quot;font-weight: bold;&quot;&gt;New...&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
4. Укажите путь в Browse &lt;span style=&quot;font-style: italic;&quot;&gt;C:\Python25]python.exe&lt;/span&gt; и кликните &lt;span style=&quot;font-weight: bold;&quot;&gt;Open&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
5. Следующее диалоговое окно покажет вам список включенных библиотек для интерпретатора. Оставьте все как есть и кликните &lt;span style=&quot;font-weight: bold;&quot;&gt;OK&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
6. Затем кликните &lt;span style=&quot;font-weight: bold;&quot;&gt;OK&lt;/span&gt; еще раз, чтобы закончить настройку интерпретатора.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь у вас есть установленный и работоспособный PyDev, настроенный для использования свежеустановленного интерпретатора Python 2.5. Прежде чем начнете программировать, вам следует создать новый PyDev проект. Этот проект будет содержать все исходные файлы, данные далее в этой книге. Чтобы настроить новый проект, следуйте следующим образом:&lt;br /&gt;
&lt;br /&gt;
1. Выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;File &amp;gt; New &amp;gt; Project&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
2. Разверните ветку &lt;span style=&quot;font-weight: bold;&quot;&gt;PyDev&lt;/span&gt;, и выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;PyDev Project&lt;/span&gt;. Кликните &lt;span style=&quot;font-weight: bold;&quot;&gt;Next&lt;/span&gt; для продолжения.&lt;br /&gt;
&lt;br /&gt;
3. Назовите &lt;span style=&quot;font-style: italic;&quot;&gt;Gray Hat Python&lt;/span&gt;. Щёлкните &lt;span style=&quot;font-weight: bold;&quot;&gt;Finish.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Вы заметите, что экран Eclipse перегруппирует себя, и вы увидите проект Gray Hat Python проект в наверху слева. Теперь щелкните правой кнопкой мыши папу &lt;span style=&quot;font-weight: bold;&quot;&gt;src&lt;/span&gt; и выберите &lt;span style=&quot;font-weight: bold;&quot;&gt;New &amp;gt; PyDev Module&lt;/span&gt;. В графе &lt;span style=&quot;font-weight: bold;&quot;&gt;Name&lt;/span&gt; введите &lt;span style=&quot;font-weight: bold;&quot;&gt;chapter1-test&lt;/span&gt;, и кликните на &lt;span style=&quot;font-weight: bold;&quot;&gt;Finish&lt;/span&gt;. Вы увидите, что панель вашего проекта обновится, и в этот список будет добавлен файл &lt;span style=&quot;font-style: italic;&quot;&gt;chapter1-test.py&lt;/span&gt;. &lt;br /&gt;
&lt;br /&gt;
Чтобы запустить скрипт Python в среде Eclipse, только кликните кнопку &lt;span style=&quot;font-weight: bold;&quot;&gt;Run As&lt;/span&gt;  (зеленый кружок с белой стрелкой внутри) на панели инструментов. Чтобы заново запустить последний запущенный скрипт нажмите Ctrl+F11. Когда вы запустите скрипт в Eclipse, вместо командной строки Windows, вы увидите панель внизу среды Eclipse, обозначенной, как &lt;span style=&quot;font-style: italic;&quot;&gt;Console&lt;/span&gt;. Весь вывод ваших скриптов будет отображаться на панели Console. Вы так же можете обратить внимание, что текстовый редактор уже открыл &lt;span style=&quot;font-style: italic;&quot;&gt;chapter1-test.py&lt;/span&gt; и уже ожидает немного сладкого нектара Python.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.3.1. Лучшие друзья Хакера: ctypes.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Модуль ctypes для Python  является безусловно одной из самых мощных библиотек, доступных разработчику на Python. Библиотека ctypes позволяет вам вызывать функции в динамически подключаемых библиотеках (dll) и имеет богатые возможности для создания комплексных типов данных языка Си и полезных функций для низкоуровневой работы с памятью. Это необходимо для того, чтобы вы понимали основы того, как использовать библиотеку ctypes, так как вы будете полагаться на эту библиотеку в значительной степени на протяжении всей книги.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.3.2 Использование динамических библиотек.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Первый шаг на пути использования ctypes это понимание, как запускать и получать доступ к функциям в динамически подключаемых библиотеках. &lt;span style=&quot;font-style: italic;&quot;&gt;Динамически подключаемая библиотека&lt;/span&gt; (dynamically linked library) - это скомпилированный бинарный файл, который подключаются к основному процессу во время его выполнения по мере надобности. На платформе Windows эти бинарные файлы называются динамически подключаемые библиотеки, а на платформе Linux - разделяемые объекты (eng. shared objects(SO)). В обоих случаях эти бинарные файлы предоставляют функции через экспортированные имена, какие получают возможность запуска по реальным адресам в памяти. Обычно во время выполнения вам приходится решать, какой будет порядок адресов функций для вызова этих функций, однако с ctypes вся эта грязная работа уже сделана.&lt;span style=&quot;font-weight: bold;&quot;&gt;//Еще не один раз перечитать и по-человечески дописать весь абзац, прим.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Есть три различных способа загрузки dll в ctypes: cdll(), windll(), и oledll(). Разница между ними в том, каким образом вызываются функции этих библиотек, и какие они возвращают значения. Метод cdll() используется для запуска библиотек, которые экспортируют функции, используя стандартное соглашение вызова &lt;span style=&quot;font-style: italic;&quot;&gt;cdecl&lt;/span&gt;. Метод windll() загружает библиотеки, которые экспортируют функции, используя соглашение вызова &lt;span style=&quot;font-style: italic;&quot;&gt;stdcall&lt;/span&gt;, которое является родным соглашением в Microsoft Win32 API. Ну а метод oledll() работает так же, как windll(), однако, он предполагает, что экспортированная функция возвращает Windows код ошибки &lt;span style=&quot;font-style: italic;&quot;&gt;HRESULT&lt;/span&gt;, который используется специально для сообщений об ошибках, возвращаемых функциями &lt;span style=&quot;font-style: italic;&quot;&gt;Объектной Модели Компонентов&lt;/span&gt; (MS Component Object Model, &lt;span style=&quot;font-style: italic;&quot;&gt;COM&lt;/span&gt;).&lt;br /&gt;
&lt;br /&gt;
В качестве небольшого примера, вы возьмете функцию printf() из библиотеки времени исполнения языка C (С runtime) в Windows и Linux, и используете её для вывода в тестовом сообщении. В Windows  C runtime находится в &lt;span style=&quot;font-style: italic;&quot;&gt;msvcrt.dll&lt;/span&gt;, находящемся в папке &lt;span style=&quot;font-style: italic;&quot;&gt;C:\WINDOWS\System32\&lt;/span&gt;, а в Linux это &lt;span style=&quot;font-style: italic;&quot;&gt;libc.so.6&lt;/span&gt;, которая по умолчанию находится в &lt;span style=&quot;font-style: italic;&quot;&gt;/lib/&lt;/span&gt;. Создайте следующий скрипт Python или в Eclipse, или в вашей обычной рабочей директории Python, и введите следующий код:&lt;br /&gt;
&lt;br /&gt;
chapter1-printf.py Код для Windows&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
from ctypes import *&lt;br /&gt;
&lt;br /&gt;
msvcrt = cdll.msvcrt&lt;br /&gt;
message_string = &quot;Hello world!\n&quot;&lt;br /&gt;
msvcrt.printf(&quot;Testing: %s&quot;, message_string)&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Этот скрипт выводит следующее:&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
C:\Python25\&lt;span style=&quot;font-weight: bold;&quot;&gt;python chapter1-printf.py&lt;/span&gt;&lt;br /&gt;
Testing: Hello world!&lt;br /&gt;
C:\Python25&amp;gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Под Linux этот пример будет немного отличаться, но делать будет то же самое. Перейдите в Linux и создайте &lt;span style=&quot;font-style: italic;&quot;&gt;chapter1-printf.py&lt;/span&gt; в вашей директории &lt;span style=&quot;font-style: italic;&quot;&gt;/root/&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
/==============================================\&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Понимание соглашений вызовов.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Соглашение вызовов &lt;/span&gt; описывает как правильно вызывать определенную функцию. Оно включает в себя порядок того, как выделяются параметры функции, какие параметры функции помещаются в стек или переходят в регистры, и как раскручивается стек при возвращении функцией значения. Вам надо научиться понимать два соглашения вызовов: &lt;span style=&quot;font-style: italic;&quot;&gt;cdecl&lt;/span&gt; и &lt;span style=&quot;font-style: italic;&quot;&gt;stdcall&lt;/span&gt;. В соглашении cdecl параметры помещаются в стек справа налево, и вызывающий функцию ответственен за очистку стека от аргументов. Это соглашение используется в большинстве C-систем на архитектуре x86.&lt;br /&gt;
&lt;br /&gt;
Вот пример вызова функции с помощью cdecl:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;На языке C&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
int python_rocks(reason_one, reason_two, reason_tree);&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;На ассемблере x86:&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
push reason_tree&lt;br /&gt;
push reason_two&lt;br /&gt;
push reason_one&lt;br /&gt;
call python_rocks&lt;br /&gt;
add esp, 12&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Вы можете ясно увидеть, как передаются аргументы функции. Последняя линия выделяет (увеличивает) стеку 12 байт (у функции 3 параметра, и каждый параметр стека занимает 4 байта, поэтому в сумме дает 12 бит), которых как раз хватает для этих параметров.&lt;br /&gt;
&lt;br /&gt;
Пример соглашения stdcall, которые используются в Win32 API демонстрируется тут:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;На языке C:&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
int my_socks(color_one, color_two, color_tree);&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;На языке ассемблера x86&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
push color_tree&lt;br /&gt;
push color_two&lt;br /&gt;
push color_one&lt;br /&gt;
call my_socks&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
В данном случае вы видите, что порядок параметров такой же, но очистка стека не проводится вызывающим функцию, а функцией перед возвращением ей полученных значений.&lt;br /&gt;
&lt;br /&gt;
Для обеих соглашений важно запомнить, что возвращенные значения функции хранятся в регистре EAX. &lt;br /&gt;
\==============================================/&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;chapter1-printf.py пример для Linux&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;from ctypes import *&lt;br /&gt;&lt;br /&gt;libc = CDLL(&quot;libc.so.6&quot;)&lt;br /&gt;message_string = &quot;Hello world!\n&quot;&lt;br /&gt;libc.printf(&quot;Testing: %s&quot;, message_string)&lt;/span&gt;-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Данный скрипт в Linux будет выводить следующее:&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;#python /root/chapter1-printf.py&lt;/span&gt;&lt;br /&gt;
Testing: Hello world!&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;#&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Это легко уметь вызывать функции в динамической библиотеке и использовать функции, которые она экспортирует. Вы будете использовать эту технику много раз на протяжении всей книги, поэтому очень важно, чтобы поняли, как это работает.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;1.3.3 Конструирование типов данных C&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Создание типа данных языка C в Python - это словно откровенная сексуальность в этом гиковском, странном способе (Дословно: Creating a C datatype in Python is just downright sexy, in that nerdy, weird way. кто предложит перевод лучше, будет молодцом ). Наличие этих особенностей позволяет вам полностью использовать компоненты, написанные на C и C++, которые значительно увеличивают мощь языка Python. Кратко просмотрите таблицу 1-1, для понимания того, как взаимосвязаны типы данных C и Python и результирующий тип ctypes.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5NjIe2Obj7PSWseBO9ydfbC8F2Yxt1CddZfWBYvNO2-61FzFSbGLNfF-5ld82DVii85JYz5hmhud8nOygOXjhLsbpAtYVhYtgRETgNLJ4m8cg2BgbIV7LBCufRMVkwmLgLh1xN5Ymc9NZ/s1600/GrayHat_ch1_type_table.PNG&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5452246256671427538&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5NjIe2Obj7PSWseBO9ydfbC8F2Yxt1CddZfWBYvNO2-61FzFSbGLNfF-5ld82DVii85JYz5hmhud8nOygOXjhLsbpAtYVhYtgRETgNLJ4m8cg2BgbIV7LBCufRMVkwmLgLh1xN5Ymc9NZ/s400/GrayHat_ch1_type_table.PNG&quot; style=&quot;cursor: hand; cursor: pointer; display: block; height: 386px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Видите, как хорошо типы данных конвертируются туда и обратно? Используйте эту таблицу для удобства, в случае, если вы забудете преобразование типов. Типы из ctypes могут быть инициализированы со значением, но оно должно быть надлежащего типа и размера. Для демонстрации, откройте вашу оболочку Python и введите несколько следующих примеров:&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
C:\Python25&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;python.exe&lt;/span&gt;&lt;br /&gt;
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32&lt;br /&gt;
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;from ctypes import *&lt;/span&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;c_int()&lt;/span&gt;&lt;br /&gt;
c_long(0)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;c_char_p(&quot;Hello, world!&quot;)&lt;/span&gt;&lt;br /&gt;
c_char_p(&#39;Hello, world!&#39;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;c_ushort(-5)&lt;/span&gt;&lt;br /&gt;
c_ushort(65531)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;seitz = c_char_p(&quot;loves the python&quot;)&lt;/span&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print seitz&lt;br /&gt;
c_char_p(&#39;loves the python&#39;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;print seitz.value&lt;/span&gt;&lt;br /&gt;
loves the python&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;exit()&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Последний пример описывает вам как переменной &lt;span style=&quot;font-style: italic;&quot;&gt;seitz&lt;/span&gt; присваивается указатель на строку &quot;loves the python&quot;. Для доступа к содержимому указателя используется метод seitz.value, который называется &lt;span style=&quot;font-style: italic;&quot;&gt;разыменовыванием&lt;/span&gt; указателя. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.3.4 Передача параметров по ссылке.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Очень часто в C и C++ есть функции, которые ожидают указатель, как один из параметров. Причина в том, что функция может как записывать в этот участок памяти, или, если при передаче по значению параметр слишком велик. В любом случае, ctypes обладает функционалом чтобы сделать именно это, используя функцию byref(). Когда функция ожидает указатель, в качестве параметра, вы вызываете её так: fuction_main(byref (parametr) ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;1.3.5 Определение структур и объединений.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Структуры и объединения - важные типы данных, которые часто используются как Win32 API, так и с libc в Linux. &lt;span style=&quot;font-style: italic;&quot;&gt;Структура&lt;/span&gt; - это простая группа переменных, которые могут быть одного или разных типов данных. Вы можете получить доступ к любой содержащейся в структуре переменной, используя точечную нотацию (dot notation), например такую: beer_recipe.amt_barley. Это даст доступ к переменной amt_barley, находящейся в структуре beer_recipe. Следующий пример определит структуру (или struct как их обычно называют для упрощения) как в C так и в Python.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Код на C.&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
structure beer_recipe&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int amt_barley;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int amt_water;&lt;br /&gt;
};&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Код на Python.&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
class beer_recipe(Structure):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_fields_ = [&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;amt_barley&quot;,c_int),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;amt_water&quot;,c_int),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как видите, ctypes делает очень легким создание C-совместимой структуры. Замечу, что это не полный рецепт пива, и я не советую вам пить смесь ячменя и воды.&lt;br /&gt;
&lt;br /&gt;
Объединения, это почти тоже самое, что и структуры. Однако в объединении все участвующие переменные находятся по одному адресу в памяти. Следующий пример демонстрирует объединение, которое позволяет вам отобразить число тремя разными способами.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Код на C&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
union {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long barley_long;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int  barley_int;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char barley_char[8];&lt;br /&gt;
}barley_amount;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Код на Python&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
class barley_amount(Union):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_fields_=[&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_long&quot;, c_long),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_int&quot;, c_int),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_char&quot;, c_char * 8),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Если вы присвоите переменной barley_int из объединения barley_amount значение 66, то затем вы сможете использовать переменную barley_char для отображения символа представляющего это число. Для демонстрации создадим новый файл chapter1-unions.py и вобъем следующий код.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;chapter1-unions.py&lt;/span&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
from ctypes import *&lt;br /&gt;
&lt;br /&gt;
class barley_amount(Union):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_fields_=[&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_long&quot;, c_long),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_int&quot;, c_int),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&quot;barley_char&quot;, c_char * 8),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;
value = raw_input(&quot;Enter the amount of barley to put into the beer vat:&quot;)&lt;br /&gt;
my_barley = barley_amount(int(value))&lt;br /&gt;
print &quot;Barley amount as a long: %ld&quot; %my_barley.barley_long&lt;br /&gt;
print &quot;Barley amount as an int: %d&quot; %my_barley.barley_long&lt;br /&gt;
print &quot;Barley amount as a char: %s&quot; %my_barley.barley_char    &lt;br /&gt;
----------------------------------------------------------- &lt;br /&gt;
Вывод будет следующим&lt;br /&gt;
----------------------------------------------------------- &lt;br /&gt;
C:\Python25&amp;gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;python chapter1-unions.py&lt;/span&gt;Enter the amount of barley to put into the beer vat:66&lt;br /&gt;
Barley amount as a long: 66&lt;br /&gt;
Barley amount as an int: 66&lt;br /&gt;
Barley amount as a char: B&lt;br /&gt;
&lt;br /&gt;
C:\Python25&amp;gt;&lt;br /&gt;
----------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
Как видите, присвоив объединению одно значение, вы можете получить три разных представления этого значения. Если вас смущает вывод значения переменной barley_char, а именно буква &#39;B&#39;, то это лишь эквивалент ASCII (американский стандарт кодировки) десятичного 66. &lt;br /&gt;
&lt;br /&gt;
Переменная barley_char из этого объединения - отличный пример того, как определять массив в ctypes. В ctypes массив определяется путем умножения типа на количество элементов, которые вы хотите выделить в массиве. В предыдущем примере, 8-элементный массив символов был определен для переменной barley_char из объединения.&lt;br /&gt;
&lt;br /&gt;
Теперь у вас есть рабочее окружение Python на двух отдельных системах, и теперь вы понимаете как взаимодействовать с низкоуровневыми библиотеками. Настало время для того, чтобы начать применять эти знания для создания широкого списка инструментов для помощи в реверс-инженерии и хакинге программ. Надеваем шлем.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/691924750166410621/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-01-v-05.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/691924750166410621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/691924750166410621'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-01-v-05.html' title='Gray Hat Python Глава 01 v. 0.6'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s72-c/2011-12-05+13.52.34.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-9155650113492174546</id><published>2010-03-07T10:30:00.000-08:00</published><updated>2011-12-14T05:07:51.048-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gray Hat Python"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Gray Hat Python - Введение v.0.8</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s1600/2011-12-05+13.52.34.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s320/2011-12-05+13.52.34.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
И так, как и обещал, я начал переводить книгу Gray Hat Python. Прошу меня сильно не ругать, ибо практики переводов почти никогда не имел, посему перевожу, как вижу и читаю сам. Любую критику, указания на ошибки и пожелания приму с удовольствием в комментариях. Ну а пока введение в эту книгу (версия 0.8).&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
===================================================&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Я изучил Python конкретно для хакинга - и я осмелюсь сказать, что это утверждение правдиво для многих других так же. Я провел достаточно много времени в изучении языка, который хорошо приспособлен для хакинга и реверс инженерии, и несколько лет назад стало весьма очевидно, что Python становится настоящим лидером среди языков ориентированных на хакинг. Однако хитрость была в том, что не было стоящего руководства по теме, как использовать Python для различных задач хакинга. Вам приходится копаться в форумах и мануалах, и обычно проводить достаточно много времени времени пошагово просматривать код, чтобы заставить его работать правильно.&lt;span style=&quot;font-style: italic;&quot;&gt;//допилить по-русски&lt;/span&gt; Эта книга нацелена на заполнение этого разрыва путем предоставления вам беглого курса как использовать Python для хакинга и реверс-инженерии различными способами.&lt;br /&gt;
&lt;br /&gt;
Книга составлена так, что позволит вам изучить некоторые теоретические основы большинства средств и техник хакинга, включающих дебаггеры, бэкдоры, фаззеры, эмуляторы, и инъекции кода, обеспечивая вам некоторое представление о том, как готовые инструменты Python могут быть использованы, когда не требуются обычные решения. Вы изучите не только как использовать инструменты, основанные на Python, но и как &lt;span style=&quot;font-style: italic;&quot;&gt;создавать&lt;/span&gt; инструменты на языке Python. Но предупреждаем, это не исчерпывающее руководство! Существует много-много инструментов для ИБ (информационной безопасности), написанных на Python, которые я не рассматривал. Однако, эта книга позволит вам освоить много подобных навыков по применению приложений, которые вы сможете использовать, отлаживать, расширять, и настраивать любое Python-приложение по вашему выбору.&lt;br /&gt;
&lt;br /&gt;
Есть несколько способов изучения этой книги. Если вы новичок в Python или в разработке инструментов для хакинга, то вам стоит читать книгу от начала до конца по порядку. Вы изучите немного необходимой теории, запрограммируете кучу кода на Python, и получите твёрдые знания о том, как решить множество задач хакинга и реверсинга по прочтению книги. Если вы уже знакомы с Python и хорошо понимаете библиотеку ctypes Python, то переходите сразу к Главе 2. Для тех из вас, кто &quot;в теме&quot;, вполне достаточно переходить к нужным разделам книги и использовать фрагменты кода или определенные разделы, как вам надо в ваших повседневных задачах.&lt;br /&gt;
&lt;br /&gt;
Я потратил много времени на отладчики, начиная с  теории отладки в Главе 2, и продолжая прямо до &lt;a href=&quot;http://www.immunitysec.com/products-immdbg.shtml&quot; target=&quot;_blank&quot;&gt;Immunity Debugger&lt;/a&gt; (модификация OllyDbg прим.) в Главе 5. Отладчики это важные инструменты для любого хакера, и я не стесняюсь рассказывать вам о них достаточно подробно. Двигаясь дальше, вы узнаете некоторые техники перехвата (hooking) и инъекций в Главах 6 и 7, которые вы можете добавить в некоторые концепции отладки управления программой и манипулирования памятью.&lt;br /&gt;
&lt;br /&gt;
Следующий раздел книги нацелен на взлом приложений используя фаззеры (fuzzers). В Главе 8 вы начнете изучать фаззинг (&lt;a href=&quot;http://wiki.xakep.ru/Default.aspx?Page=fuzzing&amp;amp;AspxAutoDetectCookieSupport=1&quot; target=&quot;_blank&quot;&gt;fuzzing&lt;/a&gt;), и создадите свой простейший файловый фаззер. В Главе 9 мы будем использовать мощный Sulley fuzzing framework чтобы сломать настоящий FTP-демон, и в Главе 10 вы узнаете как создать фаззер для взлома драйверов Windows.&lt;br /&gt;
&lt;br /&gt;
В Главе 11, вы увидите, как автоматизировать статические задачи аналитики в IDA Pro, популярного средства для бинарного статического анализа. Мы завершим книгу темой PyEmu, основанного на Python эмулятора компьютера, в Главе 12.&lt;br /&gt;
&lt;br /&gt;
Я постарался представить исходные коды несколько меньше, с детальными пояснениями о том, как работает код, вставленный в определенных точках. Часть времени при изучении нового языка, или изготовлении новых библиотек, проводится в необходимом усердном переписывании кода и отладки совершенных вами ошибок. Я поощряю ваш ручной ввод кода. Все исходные коды к вашему удовольствию представлены на &lt;a href=&quot;http://nostarch.com/ghpython.htm&quot; target=&quot;_blank&quot;&gt;официальном сайте книги&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Ну а теперь приступим к программированию!&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Перейти к&lt;br /&gt;
&lt;a href=&quot;http://chumichev.blogspot.com/2010/03/gray-hat-python-01-v-05.html&quot;&gt;Главе 1. Настройка вашего рабочего окружения.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://chumichev.blogspot.com/2010/03/gray-hat-python-02-v-05.html&quot;&gt;Главе 2. Отладчики и устройство отладчика.&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/9155650113492174546/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-v08.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/9155650113492174546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/9155650113492174546'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python-v08.html' title='Gray Hat Python - Введение v.0.8'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9W6fGl3p8jKA2XpraBkhHU3TCuPjjsdGCelBD8kXeSzp7s-vzIJeNXHMs0qCXf1srgigsxAkMqLmv7e1aFMxmfaLkDbGqi7_qFaLFzttEKgTW-w7lwgELExDJRcII1lOk2bEgL832WGdr/s72-c/2011-12-05+13.52.34.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-3386100078233734067</id><published>2010-03-05T01:23:00.000-08:00</published><updated>2010-03-05T01:27:59.688-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="study english"/><category scheme="http://www.blogger.com/atom/ns#" term="книги"/><category scheme="http://www.blogger.com/atom/ns#" term="планы"/><title type='text'>Gray Hat Python</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS-UeO0wxb8L7Z3E1sQtKG7CdRIS9ui9RzdNXna-j-S8tTtJZNGNL8GjIaJW2H2TfoFecnhM8Y87gyaZT5RMOiiXhnMrD5-6VERJGmvFJ80UrrODubOzJ33_M2UI8YDHUUYAA1asU0NKEW/s1600-h/lrg.jpg&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 242px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS-UeO0wxb8L7Z3E1sQtKG7CdRIS9ui9RzdNXna-j-S8tTtJZNGNL8GjIaJW2H2TfoFecnhM8Y87gyaZT5RMOiiXhnMrD5-6VERJGmvFJ80UrrODubOzJ33_M2UI8YDHUUYAA1asU0NKEW/s320/lrg.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5445078415655845554&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Наткнулся тут на одну занятную книгу на просторах англоязычного инета.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://oreilly.com/catalog/9781593271923&quot;&gt;Gray Hat Python: Python Programming for Hackers and Reverse Engineers&lt;/a&gt;&lt;br /&gt;А так как в сфере моих итересов как раз Python, хакинг и совершенствование своих знаний в английском, то убью сразу 3-х зайцев. А именно. Попытаюсь перевести всю книгу, благо pdf есть. План перевода пока в разработке. Но ориентировочно по главе в 2-4 дня.</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/3386100078233734067/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3386100078233734067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/3386100078233734067'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/03/gray-hat-python.html' title='Gray Hat Python'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS-UeO0wxb8L7Z3E1sQtKG7CdRIS9ui9RzdNXna-j-S8tTtJZNGNL8GjIaJW2H2TfoFecnhM8Y87gyaZT5RMOiiXhnMrD5-6VERJGmvFJ80UrrODubOzJ33_M2UI8YDHUUYAA1asU0NKEW/s72-c/lrg.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5004136677874416566.post-7608610833655145387</id><published>2010-02-12T00:36:00.000-08:00</published><updated>2010-02-12T00:40:11.596-08:00</updated><title type='text'>После 3-х дней эксперимента.</title><content type='html'>И так предварительные итоги после 3-х дней &lt;a href=&quot;http://lifeissystem.blogspot.com/&quot; target=_blank&gt;эксперимента&lt;/a&gt;. Провал полный и по всем фронтам. Нужно найти хоть какой-то способ самомотивации...</content><link rel='replies' type='application/atom+xml' href='http://chumichev.blogspot.com/feeds/7608610833655145387/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chumichev.blogspot.com/2010/02/3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/7608610833655145387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5004136677874416566/posts/default/7608610833655145387'/><link rel='alternate' type='text/html' href='http://chumichev.blogspot.com/2010/02/3.html' title='После 3-х дней эксперимента.'/><author><name>M.Chumichev</name><uri>http://www.blogger.com/profile/05024712085458966599</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQld86X77lFX7gpqSYS8mkvz500h6GuLBu7-8h5KXfQqQ6MBtVyKjCJaABqtpRkku8nT8jkxfNKMC0Zwj47hA3lyyHFBeSJ5iWq9cEzsO9z5fg-nwprJma2uGoIjFBBs/s220/a_fffc5b29.jpg'/></author><thr:total>0</thr:total></entry></feed>