<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>r0 Crew - Блоги</title>
		<link>http://blogs.reverse4you.org/blog.php</link>
		<description>r0 Crew - объединяет определенный круг людей, заинтересованных в: поиске, изучении уязвимостей и ошибок в программном коде; исследовании навесных защит; исследовании вирусов; системном программировании (kernel-mode, user-mode).</description>
		<language>ru</language>
		<lastBuildDate>Sun, 20 May 2012 16:35:41 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>1440</ttl>
		<image>
			<url>http://forum.reverse4you.org/images/misc/rss.jpg</url>
			<title>r0 Crew - Блоги</title>
			<link>http://blogs.reverse4you.org/blog.php</link>
		</image>
		<item>
			<title>Gray Hat Python: Глава 12</title>
			<link>http://blogs.reverse4you.org/entry.php?b=93</link>
			<pubDate>Sat, 18 Feb 2012 21:48:49 GMT</pubDate>
			<description>Были мысли перевести очередную главу, но руки пока до этого не доходят. Слишком занят... Скорее всего перевод будет в марте. Если удастся...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Были мысли перевести очередную главу, но руки пока до этого не доходят. Слишком занят... Скорее всего перевод будет в марте. Если удастся разгрузиться, то будет перевод еще 8 и 10 главы.</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=93</guid>
		</item>
		<item>
			<title>Учим Apache правильно отдавать RAR-архивы с помощью .htaccess</title>
			<link>http://blogs.reverse4you.org/entry.php?b=92</link>
			<pubDate>Sun, 12 Feb 2012 14:51:57 GMT</pubDate>
			<description>В некоторых браузерах, при попытке прямого обращения к RAR-архиву, находящемуся на сервере под Apache, возвращается не сам архив, а html-страница...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">В некоторых браузерах, при попытке прямого обращения к RAR-архиву, находящемуся на сервере под Apache, возвращается не сам архив, а html-страница содержащая его текстовое представление. Данная проблема связана с тем, что Apache не правильно определяет тип запрашиваемого файла. Разрешается сие безобразие добавлением следующей строки в .htaccess:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">AddType application/x-rar-compressed rar</pre>
</div> Успехов!</blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=92</guid>
		</item>
		<item>
			<title>QT 4.8.0 на Visual Studio 2010</title>
			<link>http://blogs.reverse4you.org/entry.php?b=91</link>
			<pubDate>Sat, 07 Jan 2012 12:22:02 GMT</pubDate>
			<description>Ставим *QT* на *Visual Studio 2010*.  
 
1. Прежде всего убедимся что выполнены следующие требования: 
 
---Цитата--- 
Если вы используете бинарную...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ставим <b>QT</b> на <b>Visual Studio 2010</b>. <br />
<ol class="decimal"><li>Прежде всего убедимся что выполнены следующие требования:<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Если вы используете бинарную версию Qt with Visual Studio 2005, вы должны сначала установить Visual Studio Service Pack 1, доступный <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=BB4A75AB-E2D4-4C96-B39D-37BAF6B5B1DC&amp;displaylang=en" target="_blank" rel="nofollow">здесь</a>, чтобы избежать конфликтов во время выполнения. Кроме того, вы должны воспользоваться средством Check for Updates в меню Help ИСР Visual Studio 2005, чтобы применить как минимум следующие обновления безопасности: KB937061, KB971023, KB971090, KB973673.<br />
<br />
Если вы используете версию Qt с открытыми исходными кодами, сначала вы должны установить Perl, так что может быть выполнен скрипт syncqt, вызываемый configure. Скачать его можно <a href="http://www.activestate.com/downloads/" target="_blank" rel="nofollow">здесь</a>.<br />
<br />
Для сборки Qt вместе с Phonon на Windows вам потребуются:<ul><li>Microsoft's DirectX Software Development Kit, который можно скачать <a href="http://msdn2.microsoft.com/en-us/directx/aa937788.aspx" target="_blank" rel="nofollow">здесь</a>, и</li>
<li>    Microsoft's Windows Server 2003 R2 Platform SDK, который доступен <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0baf2b35-c656-4969-ace8-e4c0c0716adb&amp;DisplayLang=en" target="_blank" rel="nofollow">здесь</a>.</li>
</ul>
			
		</div>
	</div>
</div></li>
<li>После чего переходим к загрузке <b>Qt libraries 4.8.0 for Windows</b> (<a href="http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.zip" target="_blank" rel="nofollow">Source</a>) (<a href="http://qt.nokia.com/downloads/windows-cpp-vs2010" target="_blank" rel="nofollow">Installer</a>).</li>
<li>Запускаем инсталлер и устанавливаемся в &quot;<b>C:\Qt\4.8.0</b>&quot;, или разархивируем архив в &quot;<b>C:\Qt\4.8.0</b>&quot;.</li>
<li>Обновляем в переменную среду <b>PATH</b> добавив в нее путь к &quot;<b>QT\bin</b>&quot;, в нашем случае &quot;<b>C:\Qt\4.8.0\bin;</b>&quot; (без кавычек). Сделать это можно перейдя в <i>(Start =&gt; Control Pane =&gt; System =&gt; Advanced =&gt; Environment variables)</i>.</li>
<li>Загружаем последнюю версию <a href="ftp://ftp.qt.nokia.com/jom/" target="_blank" rel="nofollow"><b>jom</b></a> (утилита для ускорения процесса сборки).</li>
<li>Разархивируем <b>jom</b> в папку &quot;<b>C:\Qt\jom</b>&quot;.</li>
<li>Переходим в консоль <b>Visual Studio 2010</b> <i>(Start =&gt; All Programs =&gt; Microsoft Visual Studio 2010 =&gt; Visual Studio Tools =&gt; Visual Studio Command Prompt (2010))</i>.</li>
<li><b>В консоле вводим:</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:48px;">cd c:\Qt\4.8.0
configure -opensource -platform win32-msvc2010</pre>
</div> Конфигурация занимает продолжительное время... У меня, на самой мощной виртуалке (4 CPU(3GHz) + 4Gb RAM), это заняло около 30 минут. Так что наберитесь терпения.<br />
<br />
<b>Затем:</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">jom\jom.exe -j N</pre>
</div> Сборка обычно занимает еще больше времени. У меня с параметром <b>N = 4</b> она заняла около 30-40 минут.<br />
<br />
Утилита <b>jom</b> является заменой устаревшей <b>nmake</b>. В отличии от <b>nmake</b>, которая выполняет сборку в один поток, <b>jom</b> - позволяет задавать раздельную сборку в несколько потоков. Делается это с помощью параметра <b>N</b>, который указывает количество процессоров, которые будут задействованы при компиляции.<br />
<br></li>
<li>Загружаем и устанавливаем <a href="http://qt.nokia.com/downloads/visual-studio-add-in" target="_blank" rel="nofollow"><b>QT Visual Studio Add-in</b></a>.</li>
<li>Запускаем <b>Visual Studio 2010</b> и проверяем или добавляем пути в <i>(Qt =&gt; Qt Options =&gt; Qt Versions =&gt; Add)</i></li>
</ol><br />
Успехов!<br />
<br />
PS: Аналогом команды <b>nmake distclean</b> есть <b>jom.exe clear</b></blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=91</guid>
		</item>
		<item>
			<title>Gray Hat Python: Глава 11</title>
			<link>http://blogs.reverse4you.org/entry.php?b=90</link>
			<pubDate>Mon, 02 Jan 2012 18:37:26 GMT</pubDate>
			<description>С Наступившими и Наступающими праздниками! Ближе к концу Января, ожидается перевод 11-й главы.</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">С Наступившими и Наступающими праздниками! Ближе к концу Января, ожидается перевод 11-й главы.</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=90</guid>
		</item>
		<item>
			<title>Gray Hat Python: Глава 5</title>
			<link>http://blogs.reverse4you.org/entry.php?b=87</link>
			<pubDate>Thu, 24 Nov 2011 16:58:43 GMT</pubDate>
			<description>Пятая глава, появится где-то в Декабре.</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Пятая глава, появится где-то в Декабре.</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=87</guid>
		</item>
		<item>
			<title>Gray Hat Python: Глава 4</title>
			<link>http://blogs.reverse4you.org/entry.php?b=86</link>
			<pubDate>Fri, 18 Nov 2011 20:13:24 GMT</pubDate>
			<description>Появился перевод *4 главы* (http://forum.reverse4you.org/showthread.php?t=1198). В некоторых местах он хромает, поэтому если возникнут вопросы (в чем...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Появился перевод <a href="http://forum.reverse4you.org/showthread.php?t=1198" target="_blank"><b>4 главы</b></a>. В некоторых местах он хромает, поэтому если возникнут вопросы (в чем я сомневаюсь), их всегда можно задать у нас на форуме ;)</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=86</guid>
		</item>
		<item>
			<title>Gray Hat Python: Глава 3</title>
			<link>http://blogs.reverse4you.org/entry.php?b=85</link>
			<pubDate>Thu, 10 Nov 2011 21:45:18 GMT</pubDate>
			<description>Если все будет в порядке, то в конце этой недели, будет готов перевод третей главы *drinks*</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Если все будет в порядке, то в конце этой недели, будет готов перевод третей главы *drinks*</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=85</guid>
		</item>
		<item>
			<title>Анализ приложений для Android на наличие уязвимостей</title>
			<link>http://blogs.reverse4you.org/entry.php?b=84</link>
			<pubDate>Sun, 02 Oct 2011 06:13:02 GMT</pubDate>
			<description>---Цитата (сообщение от Heroin)--- 
Перед тем как мы начнем понимать структуру систем защиты Android, мы должны рассмотреть работу программ на...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="http://forum.reverse4you.org/images/misc/quote_icon.png" alt="Цитата" /> Сообщение от <strong>Heroin</strong>
					<a href="showthread.php?p=3766#post3766" rel="nofollow"><img class="inlineimg" src="images/buttons/viewpost-right.png" alt="Посмотреть сообщение" /></a>
				</div>
				<div class="message">Перед тем как мы начнем понимать структуру систем защиты Android, мы должны рассмотреть работу программ на устройстве. Приложение работает в изолированной среде на устройстве. Каждое приложение имеет свои собсвенные разрешения и область рабочей памяти. Различные приложения могут взаимодействовать между собой. Приложение может запросить систему для выделения ресурсов только через предписания. Все приложения для Android скомпилированы в файл Android Package (APK). APK и устанавливается на устройство.<br />
<br />
Формат APK является вариантом формата JAR.<br />
<br />
Файл APK обычно содержит две папки:<ul><li>META-INF</li>
<li>res</li>
</ul><br />
со следующими файлами:<ul><li>AndroidManifest.xml</li>
<li>classes.dex</li>
<li>resources.arsc</li>
</ul><br />
<i>AndroidManifest.xml</i> и <i>classes.dex</i> - два основных файла, которые будем рассматривать.<br />
<br />
<i>AndroidManifest.xml</i> представляет основную информацию о приложении системе Android; система должна получить информацию о приложении до того как она выполнит какую-либо функцию приложения. Помимо этого, файл выполняет следующие функции:<ul><li>Содержит Java имя для приложения</li>
<li>Приведен список активности приложения, служб, методов предачи и получения информации, вместе с их возможностями. Этот список позволяет системе узнать, какие компоненты существуют и при каких условиях они работают</li>
<li>Указывает, какие разрешения должно иметь приложение для получения доступа к API и взаимодействия с другими приложениями</li>
<li>Также имеются предписания для доступа других приложений</li>
<li>Содержит список библиотек, необходимых для работы приложения</li>
</ul><br />
Файл <i>classes.dex</i> содержит код всего приложения для Dalvik.<br />
<br />
<b>Сканирование файлов APK ScanDroid'ом и основными утилитами</b><br />
<br />
Приложение <a href="http://blueinfy.com/ScanDroid.zip" target="_blank" rel="nofollow">ScanDroid</a> сканирует код и определяет возможные уязвимости. Эта статья показывает использование ScanDroid с использованием кода Ruby. Этот код является прототипом для показа возможности использования ScanDroid. Успростим задачу и будем рассматривать три вида уязвимостей для приложений:<br />
1) чтение/запись на локальный носитель;<br />
2) доступ к внешнему URL;<br />
3) создание сокет соединения.<br />
<br />
ScanDroid выбирает вышеуказанные файлы из файла APK. Программа конвертирует код Dalvik в Java код и затем сканирует код на возможные уязвимости по ранее установленным правилам.<br />
<br />
ScanDroid выполняет следующие операции:<ul><li><b>Распаковка</b><br />
Распаковывает файлы из APK файла</li>
<li><b>Xml</b><br />
Конвертирует файлы в xml файлы, а <i>classes</i> в формат .smali</li>
<li><b>dex2clas</b><br />
Конвертирует <i>classes.dex</i> в отдельные файлы . class</li>
<li><b>Проверка</b><br />
Выполняет проверку кода на возможные уязвимости</li>
<li><b>AndroidManifest</b><br />
Выполняет проверку <i>Androidmanifest.xml</i> на наличие дополнительной информации</li>
</ul><br />
Промежуточные файлы на каждом этапе процесса создаются для дальнейшего использования. Библиотеки ScanDroid могут быть использованы для ручного выполнения каждой стадии процесса.<br />
<br />
<b>Внутри ScanDroid'a</b><br />
<br />
ScanDroid создан с использованием Ruby.  Для запуска ScanDroid открываем консоль и пишем:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">ScanDroid.rb –apk &lt;application filename&gt; -rule &lt;rules filename&gt;</pre>
</div> Для тестирования используется приложение Android под названием scanme. У нас есть правила в файле <br />
<br />
<i>rules.cfg</i>:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">ScanDroid.rb –apk scanme.apk -rule c:\ScanDroid\bin\rules.cfg</pre>
</div> Убедись, что ScanDroid запускается из директории установки.<br />
<br />
Файл <i>rules.cfg</i> содержит список классов и методов, использующих Java код для обнаружения возможных уязвимостей. 3 возможные уязвимости,к оторые мы предположили, в <i>rules.cfg</i> как:<br />
<div align="center"><img src="http://files.getroot.ru/pics/rules.jpg" border="0" alt="" /></div><br />
Мы делаем запрос и пытаемся выполнить поиск по коду.<br />
<br />
На выходе получаем:<br />
<div align="center"><img src="http://files.getroot.ru/pics/output.jpg" border="0" alt="" /></div><br />
Создается папка с первыми 3 буквами названия приложения в папке установки:<br />
<div align="center"><img src="http://files.getroot.ru/pics/folder.jpg" border="0" alt="" /></div><br />
Эта папка содержит следующие папки:<ul><li>Class: содержит файлы .class</li>
<li>Dex: содержит файл classes.dex</li>
<li>Src: содержит сконвертированный Java код</li>
<li>Xml: содержит читабельные файлы xml</li>
<li>Output.txt: содержит строки кода, в которых возможна уязвимость</li>
<li>Permissions.txt: содержит список предписаний для приложения</li>
</ul><br />
<i>Output.txt</i><br />
<div align="center"><img src="http://files.getroot.ru/pics/outputtxt.jpg" border="0" alt="" /></div><br />
ScanDroid сравнивает правила в rules.cfg с кодом приложения Android. Имя файла, номер строки и строка кода добавляются в output.txt как только находится совпадение.<br />
<br />
В нашем примере в 4 строке выходного файла вызывается новый сокет. Код находится в 55 строке файла scanner.java. Вызов сокета делается из приложения. Этот вызов может быть отслежен с помощью ScanDroid'a. <br />
<br />
Проще говоря, в файле <i>fread.java</i> пишется информация на локальный носитель. Если информация не защищена, то возможно присутствует уязвимость. <i>OpenFileOutput</i> пишет информацию в файл на устройстве.<br />
<br />
<i>Webview</i> вызывает браузер. <i>Webview.loadUrl</i> запускает Url в браузере. ScanDroid может отследить этот вызов, идут ли данные от браузера на вызываемый сайт или еще на какие-либо другие небезопасные сайты.<br />
<br />
<i>Permissions.txt</i><br />
<div align="center"><img src="http://files.getroot.ru/pics/permissions.jpg" border="0" alt="" /></div><br />
Файл <i>Permissions.txt</i> показывает, какие инструкции приложения берутся из файла <br />
<br />
<i>Androidmanifest.xml</i>.<br />
<br />
<b>Использование библиотек ScanDroid в Interactive Ruby (Irb)</b><br />
<br />
Каждый отдельный процесс ScanDroid'a может быть использован отдельно в Irb.<br />
<br />
Запустим Irb из командной строки и загрузим библиотеку ScanDroid'a, использую команду load:<br />
<div align="center"><img src="http://files.getroot.ru/pics/load.jpg" border="0" alt="" /></div><br />
Затем создадим объект для класса ScanDroid. Пусть это будет объект <b><u>t</u></b>:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">. t=ScanDroid.new</pre>
</div> Первым делом нужно извлечь файлы из APK<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">t.extract(‘filename.apk’)</pre>
</div> Код для извлечения:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:108px;">Zip::ZipFile.open(filename) {|file|
file.each do |f|
f_path = File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
file.extract(f, f_path)
end
}</pre>
</div> Этот код использует ruby gem Zip для извлечения всех файлов из APK в нужную директорию. Все файлы проверены и располагаются согласно их структуре.<br />
<br />
Все распакованные файлы хранятся в папке <i>dex</i><br />
<div align="center"><img src="http://files.getroot.ru/pics/dex_folder.jpg" border="0" alt="" /></div><br />
Затем нужно сконвертировать файлы xml в читабельный формат:<br />
<div align="center"><img src="http://files.getroot.ru/pics/convert.jpg" border="0" alt="" /></div><br />
Для xml мы будем использовать утилиту <i>apktool</i>:<br />
<div align="center"><img src="http://files.getroot.ru/pics/apktool.jpg" border="0" alt="" /></div><br />
Выполняем apktool. Первый параметр - расположение файла apk и второй - папка для распаковки.<br />
<br />
<div align="center"><img src="http://files.getroot.ru/pics/apktree.jpg" border="0" alt="" /></div><br />
Сейчас нам нужно сконвертировать файлы dex в файлы class. Будем использовать утилиту dex2jar для конвертирования кода Dalvik в файлы Java .jar.<br />
<br />
<div align="center"><img src="http://files.getroot.ru/pics/dex2jar.jpg" border="0" alt="" /></div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:156px;">cmd=Dir.getwd+&quot;/bin/dex2jar/dex2jar.bat&quot;+cur+&quot;/#{filename[0,3]}/dex&quot;+&quot;/
ses.dex&quot;
system(cmd)
dest=Dir.getwd+&quot;/#{filename[0,3]}/class&quot;
jar2zip=Dir.getwd+&quot;/#{filename[0,3]}/dex/classes.dex.dex2jar.jar&quot;
Zip::ZipFile.open(jar2zip) {|file|
file.each do |f|
f_path = File.join(dest, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
file.extract(f, f_path)
end</pre>
</div> Сгенерированный jar распаковывается использованием Zip gem of Ruby на файлы class, которые хранятся в директории class.<br />
<br />
Полученные файлы нужно сконвертировать в Java код - clas2jav. Выполняем:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">t.clas2jav (‘applicationname.apk’)</pre>
</div> Используем Java декомпиоятор JAD. Выполняем:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">jad -o -r -sjava –d /src /class /**/*.class</pre>
</div> <i>src</i> - директория, в которую сохранятся все java файлы,<br />
<i>/class</i> - сохраняются class файлы,<br />
<i>/**/*.class</i> - JAD конвертирует все файлы .class, включая те, которые находятся в поддиректориях.<br />
<br />
Сейчас у нас есть весь код приложения. Теперь ScanDroid может проверить код ан уязвимости. Для начала мы просканируем AndroidManifest.xml для того чтобы узнать инструкции приложения:<br />
<div align="center"><img src="http://files.getroot.ru/pics/manifestscan.jpg" border="0" alt="" /></div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:72px;">File.open(&quot;#{cur}/#{filename[0,3]}/xml/AndroidManifest.xml&quot;,&quot;r&quot;) d
|infile|
while(line=infile.gets)
if line[/android.permission./]</pre>
</div> Каждая из инструкций определяется со значением &quot;android.permission&quot;. ScanDroid сканирует код в поиске этих значений и, если найдено совпадение, сохраняет строку в файл.<br />
<div align="center"><img src="http://files.getroot.ru/pics/permistext.jpg" border="0" alt="" /></div><br />
Нам нужно просканировать код, который мы декомпилировали, на наличие уязвимостей:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">t.check(‘scanme.apk’,’c:/ScanDroid/bin/rules.cfg’)</pre>
</div> <div align="center"><img src="http://files.getroot.ru/pics/scandecompl.jpg" border="0" alt="" /></div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:120px;">if File.file?(entry) and entry[/.+\.java$/]
File.open(entry,&quot;r&quot;) do |infile|
while(line = infile.gets)
c=c+1
File.open(rulefile,&quot;r&quot;) do |rule|
while(r=rule.gets)
exp= r.chomp
if line[/#{exp}/i]</pre>
</div> Сканируем все файлы в директории src и отмечаем каждую строку, определенную в файле rules.cfg. Подтвержренное совпадение выводится в output.txt.<br />
<br />
<b>Приложение. Код ScanDroid</b><br />
<i>ScanDroid.rb</i><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:372px;">require 'ScanDroid_lib.rb'
def run
t=ScanDroid.new
case ARGV[0]
when &quot;-apk&quot;
@filename=ARGV[1]
else
system('cls')
puts &quot;Error in correct syntax!\nTry: ScanDroid.rb -apk [Filename.apk] -rule [rule_file]&quot;
Process.exit
end
case ARGV[2]
when &quot;-rule&quot;
@rule=ARGV[3]
else
system('cls')
puts &quot;Error in correct syntax!\nTry: ScanDroid.rb -apk [Filename.apk] -rule [rule_file]&quot;
Process.exit
end
if !@filename
puts &quot;Enter Filename(including extension): &quot;
@filename=gets.chomp
end
if !@rule
puts &quot;Enter Rules File(including extension): &quot;
@rule=gets.chomp
end
if !File.exists?(@filename)
puts &quot;\nCannot find #{@filename}! Please make sure the path of the file is correct.&quot;
Process.exit
end
if !File.exists?(@rule)
puts &quot;\nCannot find #{@rule}! Please make sure the path of the file is correct.&quot;
Process.exit
end
puts &quot;Working on &quot;+@filename+&quot; ... &quot;
t.extract(@filename)
system('cls')
t.xml(@filename)
system('cls')
t.dex2clas(@filename)
system('cls')
t.clas2jav(@filename)
system('cls')
t.manifest(@filename)
system('cls')
t.check(@filename,@rule)
puts (&quot;\nPermissions Stored at /#{@filename[0,3]}/permissions.txt\n&quot;)
end
system('@echo off')
system('prompt.')
run()
system('prompt')</pre>
</div> <i>ScanDroid_lib.rb</i><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:372px;">require 'zip/zip'
require 'find'
class ScanDroid
def initialize
system('cls')
@flag=1
puts &quot;Checking for files.... &quot;
if File.directory?(&quot;bin&quot;)
puts &quot;'/bin' directory found.&quot;
else
puts &quot;'/bin' directory could not be found. \nPlease run the program from the correct
folder.&quot;
Process.exit
end
end
def extract(filename)
destination=Dir.getwd+&quot;/#{filename[0,3]}/dex&quot;
begin
Zip::ZipFile.open(filename) {|file|
file.each do |f|
f_path = File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
file.extract(f, f_path)
end
}
rescue
puts &quot;\nError Unpacking the File! Delete all Previously generated files of this apk.&quot;
Process.exit
end
end
def xml(filename)
cur=Dir.getwd
if File.exists?(&quot;#{cur}/bin/apktool.bat&quot;)
cmd=Dir.getwd+&quot;/bin/apktool.bat d &quot;+cur+&quot;/&quot;+filename+&quot; &quot;+cur+&quot;/#{filename[0,3]}/xml&quot;
puts cmd
system(cmd)
else
puts &quot;Cannot Find apktool.bat!&quot;
Process.exit
end
end
def dex2clas(filename)
cur=Dir.getwd
begin
if File.exists?(&quot;#{cur}/bin/dex2jar/dex2jar.bat&quot;)
cmd=Dir.getwd+&quot;/bin/dex2jar/dex2jar.bat &quot;+cur+&quot;/#{filename[0,3]}/dex&quot;+&quot;/classes.dex&quot;
system(cmd)
dest=Dir.getwd+&quot;/#{filename[0,3]}/class&quot;
jar2zip=Dir.getwd+&quot;/#{filename[0,3]}/dex/classes.dex.dex2jar.jar&quot;
Zip::ZipFile.open(jar2zip) {|file|
file.each do |f|
f_path = File.join(dest, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
file.extract(f, f_path)
end
}
else
puts &quot;\nCannot find dex2jar.bat in the bin/dex2jar/dex2jar.bat directory!&quot;
Process.exit
end
rescue
puts &quot;\nError Converting Dex to Class!&quot;
Process.exit
end
Dir.chdir(cur)
end
def clas2jav(filename)
cur=Dir.getwd
cmd=cur+&quot;/bin&quot;
system(cmd)
Dir.chdir(Dir.getwd+&quot;/bin&quot;)
cmd=&quot;jad -o -r -sjava -d&quot;+cur+&quot;/#{filename[0,3]}/src
&quot;+cur+&quot;/#{filename[0,3]}/class&quot;+&quot;/**/*.class&quot;
if File.exists?(&quot;jad.exe&quot;)
system(cmd)
else
puts &quot;\nJava Decompiler file jad.exe could not be found!&quot;
Process.exit
end
Dir.chdir(cur)
end
def check(filename,rulefile)
cur=Dir.getwd
@flag=1
system('cls')
puts (&quot;Scanning files please wait...&quot;)
fc=0
vc=0
Find.find(cur+&quot;/#{filename[0,3]}/src&quot;) do |entry|
fc=fc+1
if File.file?(entry) and entry[/.+\.java$/]
c=0
File.open(entry,&quot;r&quot;) do |infile|
while(line = infile.gets)
c=c+1
File.open(rulefile,&quot;r&quot;) do |rule|
while(r=rule.gets)
exp= r.chomp
if line[/#{exp}/i]
open(cur+&quot;/#{filename[0,3]}/output.txt&quot;,&quot;a&quot;) do |f| f.puts
(File.expand_path(entry)+&quot;: Line: #{c}: &quot;+line.strip+&quot;\n&quot;) end
vc=vc+1
end
end
end
end
end
end
end
puts (&quot;\nTotal Files Scanned: #{fc}\nPossible Vulnerablities: #{vc}\nOutput File
generated at: #{cur}/#{filename[0,3]}/output.txt\n&quot;)
end
def manifest(filename)
cur=Dir.getwd
File.open(&quot;#{cur}/#{filename[0,3]}/xml/AndroidManifest.xml&quot;,&quot;r&quot;) do |infile|
while(line=infile.gets)
if line[/android.permission./]
line=line.strip
line=line[50,150]
line=line.strip
line=line.squeeze(&quot; &quot;)
line=line.chop.chop.strip
line=line.chop
puts line
open(cur+&quot;/#{filename[0,3]}/permissions.txt&quot;,&quot;a&quot;) do |f| f.puts (line+&quot;\n&quot;) end
end
end
end
puts (&quot;\nPermissions Stored at #{cur}/#{filename[0,3]}/permissions.txt\n&quot;)
end
end</pre>
</div> <b>Утилиты</b><br />
Dex2jar: <a href="http://code.google.com/p/dex2jar/" target="_blank" rel="nofollow">http://code.google.com/p/dex2jar/</a><br />
Apktool: <a href="http://code.google.com/p/android-apktool/" target="_blank" rel="nofollow">http://code.google.com/p/android-apktool/</a><br />
Java Decompiler: <a href="http://code.google.com/p/android-apktool/" target="_blank" rel="nofollow">http://code.google.com/p/android-apktool/</a><br />
<br />
<b>© Rushil Shah <a href="http://blueinfy.com/team.html" target="_blank" rel="nofollow">Blueinfy Team</a></b><br />
<b>© Ex0rcist a.k.a. Heroin from <a href="http://getroot.ru/" target="_blank" rel="nofollow">GR Community </a><br />
© Resident of r0 Crew</b></div>
			
		</div>
	</div>
</div> </blockquote>

 ]]></content:encoded>
			<dc:creator>Heroin</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=84</guid>
		</item>
		<item>
			<title>VMware Workstation: Пересборка модулей</title>
			<link>http://blogs.reverse4you.org/entry.php?b=83</link>
			<pubDate>Sun, 25 Sep 2011 14:40:56 GMT</pubDate>
			<description>После каждого обновления ядра - не забываем пересобирать модули VMware.  
 
Делается это так: 
 
 
Код: 
--------- 
# vmware-modconfig --console...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">После каждого обновления ядра - не забываем пересобирать модули VMware. <br />
<br />
Делается это так:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;"># vmware-modconfig --console --install-all</pre>
</div> </blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=83</guid>
		</item>
		<item>
			<title>VMware Workstation 8: Все тот же баг</title>
			<link>http://blogs.reverse4you.org/entry.php?b=82</link>
			<pubDate>Sat, 24 Sep 2011 10:44:37 GMT</pubDate>
			<description>После апдейта, VMware Workstation с 7-ки до 8-ки, старый баг или фича, с неправильным стартом сервисов vmware, все еще имеет место быть. Лечим по...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">После апдейта, VMware Workstation с 7-ки до 8-ки, старый баг или фича, с неправильным стартом сервисов vmware, все еще имеет место быть. Лечим по старому:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;"># service vmware restart</pre>
</div> или так:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:36px;">update-rc.d vmware defaults</pre>
</div> Если эта команда не сработала, то:<ol class="decimal"><li>Идем в /etc/rcN.d (где N = 0, 1, 2, 3, 4, 5, 6) или (System -&gt; Administration -&gt; Service) и смотрим на каких уровнях (runlevel) запускается вмварь (vmware).</li>
<li>Сравниваем результат из &quot;пункта 1&quot; с выводом варнингов &quot;update-rc.d -n vmware defaults&quot;.</li>
<li>Если заметили разницу в запуске или останове - корректируем вручную (меняем символ S - starat или K - stop у файла [S|K]NNvmware в соответствующих папках /etc/rcN.d) или через консоль (update-rc.d).</li>
</ol></blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=82</guid>
		</item>
		<item>
			<title>VMware Workstation: Windows XP на физическом диске или как я перешел на Linux</title>
			<link>http://blogs.reverse4you.org/entry.php?b=81</link>
			<pubDate>Sat, 10 Sep 2011 07:36:40 GMT</pubDate>
			<description>Однажды поздним зимним вечером сидел я за своим домашним ПК. Долго сидел… Лазил где попало, и не знал куда сунуться. Самое что ни на есть:  «зашел в...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Однажды поздним зимним вечером сидел я за своим домашним ПК. Долго сидел… Лазил где попало, и не знал куда сунуться. Самое что ни на есть:  «зашел в интернет и не знаешь куда пойти». Прощелкав так несколько часов и ничего путного не найдя, решил произвести ревизию содержимого своего компьютера: посмотреть, что есть и убрать мусор, которого скапливается обычно гигабайтами. Забегая в перед скажу, что ревизию я произвел позже, а вот в место нее решил снести Масдай, который стоит у меня, как вторая операционная система.<br />
<br />
Скажу честно, когда нажимал кнопку форматировать, тараканы в моей голове - аплодировали стоя. Ну, снес и ладно, не первый раз. Сказал бы я сам себе, но нет, этот день был особенным, так как сносил я свою Хрюшку навсегда (виртуалка не считается). А все потому, что мой настольный ПК уже давно обзавелся 24 GB памяти и камушком Intel Core i7 950. С такими параметрами я просидел полгода на Winodws XP 32-bit (само собой это образно сказано, так как у меня была еще Fedora 64-bit). <br />
<br />
Скажете, почему не перешел на Windows 7 64-bit? <br />
<br />
Ну во-первых, я терпеть не могу все, что выше или ниже Хрюшки (XP).<br />
Во-вторых, большая часть, если не вся, моего софта, а это обычно множество разных (старых и новых) компиляторов, с большой вероятностью, фиг там запустятся и это не говоря еще про разные DDK и прочую нечисть. <br />
И в третьих, мне ну никак не хотелось использовать Windows 7 в качестве основной хостовой операционки, для моих виртуалок. К тому же под туже семерку (64-bit) нет ВМвари. <br />
<br />
Осмыслив сложившуюся ситуацию, решил остановиться на гипервизорах VMware ESX и Xen, но потом решил, что это мне тоже не нужно, ибо юзать виртуалки через свой ноут, оно конечно забавно, но только если ты сидишь где-то в деревне и рулишь своим пк из какого-то захолустья, ехидно сверкая глазами… Жалко, что еще не выпустили гипервизоров подобных ESX и Xen для PC. Правда вселяет надежду уже то, что задницы в этом направлении начали чесать. VMware уже где-то говорила, что готовят такую плюшку, что несомненно радует. Xen же, уже выкатила свой полуфабрикат (XenClient), еще в мае прошлого года, правда поддерживает только несколько определенных моделей ноутов и ПК (пойти что ли купить такой?). <br />
<br />
В общем, долго тараканы совещались и решили, что не видать Хрюшке нулевого кольца. (Хрюшка долго плакала, но ее никто не слушал). Ставить решили на VMware, с поддержкой технологий Intel VT-x/EPT, что позволяет набрать дополнительных оборотов в гостевой ОС. Помимо этого, вице-президент тараканов постановил, что если гостевая ОС будет использоваться в девелоперских целях, то в дополнение к технологиям виртуализации, нужно безоговорочно использовать реальный физический жесткий диск… Пожав всем дружно руки, местным гастрабайтерам (нервным окончаниям) была отдана команда на исполнение…<br />
<br />
PS: Бредовый креатив.</blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=81</guid>
		</item>
		<item>
			<title>User Agent Switcher</title>
			<link>http://blogs.reverse4you.org/entry.php?b=80</link>
			<pubDate>Mon, 05 Sep 2011 15:33:11 GMT</pubDate>
			<description><![CDATA[Для любителей изменять *User Agent* браузера, привожу xml-файлик, со списком всех основных User Agent'ов, под различные операционные системы, начиная...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Для любителей изменять <b>User Agent</b> браузера, привожу xml-файлик, со списком всех основных User Agent'ов, под различные операционные системы, начиная от настольных и заканчивая мобильными.<br />
<br />
<b>Download:</b> <a href="http://www.reverse4you.org/web_files/Prosper-H/useragent.xml" target="_blank">useragent.xml</a><br />
<br />
Для тех у кого FireFox, и тех кто не в курсе: файл предназначен для плагина &quot;<a href="https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/" target="_blank" rel="nofollow">User Agent Switcher</a>&quot;. Есть ли такой плагин для других бараузеров? Не знаю. Всегда пользовался FF, поэтому что там у других без понятия...</blockquote>

 ]]></content:encoded>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=80</guid>
		</item>
		<item>
			<title>Суровый праздник - Челябинск празднует юбилей</title>
			<link>http://blogs.reverse4you.org/entry.php?b=79</link>
			<pubDate>Sat, 03 Sep 2011 19:57:38 GMT</pubDate>
			<description>3-го сентября Челябинск отмечает юбилей - 275 лет. 
 
Изображение: http://s39.radikal.ru/i085/1109/1a/8ce57890b802.jpg  
 
Поздравляю челябинцев с...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">3-го сентября Челябинск отмечает юбилей - 275 лет.<br />
<br />
<div align="center"><img src="http://s39.radikal.ru/i085/1109/1a/8ce57890b802.jpg" border="0" alt="" /></div><br />
Поздравляю челябинцев с Днем города!<br />
<br />
Мультимедийное лазерное шоу посвященное 275-ти летию города (2 сентября, 21.00, Театральная площадь):<br />
<br />
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/f0QyHnK5q1g"></param><embed src="http://www.youtube.com/v/f0QyHnK5q1g" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />
<br />
Хочу поставить две композиции челябинского исполнителя <b>Хаба G</b>: композицию про Челябинск &quot;Северо-восток&quot; и клип на народную песню &quot;Тополя&quot; в его исполнении:<br />
<br />
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/Ev5ws3UHiPQ"></param><embed src="http://www.youtube.com/v/Ev5ws3UHiPQ" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />
<br />
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/rZgStipy8Uc"></param><embed src="http://www.youtube.com/v/rZgStipy8Uc" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />
<br />
Еще раз всех с праздником!</blockquote>

 ]]></content:encoded>
			<dc:creator>UNKNOWN</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=79</guid>
		</item>
		<item>
			<title>PHP Сохранение кэша страницы (аналог Google cache)</title>
			<link>http://blogs.reverse4you.org/entry.php?b=78</link>
			<pubDate>Thu, 01 Sep 2011 12:03:13 GMT</pubDate>
			<description>Решил все же запостить в бложек. 
Видел пост на хабре про гугл кэш( не совсем про гугл кэш, там про конф. информацию было что-то) для интереса...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Решил все же запостить в бложек.<br />
Видел пост на хабре про гугл кэш( не совсем про гугл кэш, там про конф. информацию было что-то) для интереса попробовал реализовать.<br />
Реализовал.<br />
Класс для работы: <br />
Желатель сэйвить его в папку inc<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:372px;">&lt;?php
/**
 * Класс для сохранения любой web страницы.
 * @author Boolean
 * @version 0.1
 * @contacts icq 543929
 * @home codingworld.ru
 */
define('HS_VERSION',    '0.1');
class HTMLSafe{
    /**
     * @var Путь до скрипта.
     */
    private $pathurl;
    /**
     * @var Корень.
     */
    private $url;
    /**
     * @var Полный URL.
     */
    private $fullurl;
    /**
     * @var Исходный код страницы.
     */
    private $source;
    /**
     * @var DOM документ.
     */
    private $doc;
    /** 
     * @var Директория для кэша
     */
    private $dir;
    /**
     * @var Служебный массив загруженных..эм, всего загруженного.
     */
    private $igs;
                
    /**
     * @param Полный URL до страницы. 
     */
    public function __construct($FullURL){
        $url = parse_url(trim($FullURL));
        //с SSL не работает, влом рыть курл, и искать как он работает с ssl.
        if( ! $url['scheme']){
            $this-&gt;error(ERROR_VALID_URL);
            return false; 
        }
        
        if($url['scheme'] == 'https'){
            $this-&gt;error(ERROR_SSL);
            return false;
        }
        
        //тут, помоему, слегка на говнокодил. :D
        $url['script'] = $url['path'] . ($url['query']? ('?' . $url['query']) : '');
        
        if(!$url['script']) 
            $url['script'] = '/';
                    
        if(substr($url['path'], strlen($url['path']) - 1, 1) &lt;&gt; '/'){
            $url['path'] = explode('/', $url['path']);
            unset($url['path'][count($url['path']) - 1]);
            $url['path'] = implode('/', $url['path']) . '/';                 
        }        
        $this-&gt;pathurl  = $url['scheme'] . '://' . $url['host'] . $url['path'];
        $this-&gt;fullurl  = $url['scheme'] . '://' . $url['host'] . $url['script'];
        $this-&gt;url      = $url['scheme'] . '://' . $url['host'] . '/';
        $this-&gt;dir = getcwd() . '/cache/' . md5($this-&gt;fullurl) . '/';
        @mkdir($this-&gt;dir); //Создаем директорию
        @chmod($this-&gt;dir, 0777); //шмодим.
    }    
    
    /**
     * Функция кэширования
     * Возвращает, эм, как бы лучше объяснить то...
     * В общем в папке cache будет создана папка с названием md5 от URL для кэширования. ебать.
     * Вот ее эта функция и возвращает.
     */
    public function Cache(){
        $this-&gt;source = $this-&gt;curl_get($this-&gt;fullurl);
        $this-&gt;doc = new DOMDocument(); 
        @$this-&gt;doc-&gt;loadHTML($this-&gt;source);
        $this-&gt;parse();  // не ну а хуле.
        file_put_contents($this-&gt;dir . 'index.html', $this-&gt;source);
        return md5($this-&gt;fullurl);
    }
    
    private function parse(){
        $t = array( 'img'   =&gt; 'src',   'script'    =&gt; 'src',   'input'     =&gt; 'src', 
                    'link'  =&gt; 'href',  'iframe'    =&gt; 'src'); // тут если че добить окейно можно
        foreach($t AS $s =&gt; $t){
            $tags = $this-&gt;doc-&gt;getElementsByTagName($s);
                   
            foreach ($tags as $tag) {
                $src = $tag-&gt;getAttribute($t); //dom esli che.
                $name = $this-&gt;getname($src); //получаем имя, md5 + расширение.
                
                if(isset($this-&gt;igs[$name]))
                    continue;       
                else
                    $this-&gt;igs[$name] = 1;         
                
                $urlsrc = $this-&gt;geturlsrc($src); //получаем реальный URL чего-то.                
                $content = $this-&gt;curl_get($urlsrc); //качаем
                
                if($s == 'link'){
                    $content = $this-&gt;parse_urls($content); //парсим на url(), допустим &lt;div style=&quot;background: url(xyu.png) repeat-x;&quot;&gt;xyu&lt;/div&gt;
                }
                
                @file_put_contents($this-&gt;dir . $name, $content); //сэйвим, чо
                $this-&gt;source = str_replace($src, $name, $this-&gt;source); //Заменяем  
                              
            }
        }
        $this-&gt;source = $this-&gt;parse_urls($this-&gt;source); //парсим саму страничку на url()
    }
    
    /**
     * Функция парсит на url()
     * @param $source Исходный код страницы, или того же css.
     * @return $source Возвращает измененый исходник, с засэйвленными элементами(Элементами!!).
     */
    private function parse_urls($source){
        if(!preg_match_all('|url\((.*)\)|U', $source, $urls)){
            return false;
        }
        $urls = $urls[1];
        foreach($urls AS $url){            
            $url        = str_replace(array('\'', '&quot;'), '', $url); //няшка
            $urlsrc     = $this-&gt;geturlsrc($url);
            $name       = $this-&gt;getname($url);
                
            if(isset($this-&gt;igs[$name]))
                continue;       
            else
                $this-&gt;igs[$name] = 1;
                                         
            $content    = $this-&gt;curl_get($urlsrc);            
            file_put_contents($this-&gt;dir . $name, $content);
            $source = str_replace($url, $name, $source);             
        }
        return $source;
    }
    
    /**
     * Функция получает полный URL до элемента.
     * @param $src URL 
     */ 
    private function geturlsrc($src){
        if(substr($src, 0, 1) == '/'){
            $urlsrc = $this-&gt;url . substr($src, 1);   
        }elseif( substr($src, 0, strlen('http://')) == 'http://' || substr($src, 0, strlen('https://')) == 'https://' || substr($src, 0, strlen('ftp://')) == 'ftp://' ){
            $urlsrc = $src;
        }else{
            $urlsrc = $this-&gt;pathurl . $src;
        }   
        return $urlsrc;     
    }
    
    /**
     * Возвращает md5(урл) . расширение
     * @param $src URL 
     */
    private function getname($src){
        $name = md5($src);
        $fname = explode('.', $src);
        $fname = $fname[count($fname) - 1]; 
        if(strstr($fname, '?')){
            $fname = explode('?', $fname);
            $fname = $fname[0];
        }    
        $name = $name . '.' . $fname;
        return $name;        
    }
    
    /**
     * CURL 
     * @param $url URL!
     */ 
    private function curl_get($url){ 
        $cfile = 'cookies.txt'; 
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,    1); 
        curl_setopt($ch, CURLOPT_URL,               $url); 
        curl_setopt($ch, CURLOPT_USERAGENT, &quot;HTMLSafer v&quot; . HS_VERSION); 
        $headers = array('Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1', 
            'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8', 
            'Content-Type: application/x-www-form-urlencoded', 
            'Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1', 
            'Accept-Encoding: deflate', 
            'Cookie2: $Version=1', 
            'Connection: Keep-Alive, TE'); 
        curl_setopt($ch, CURLOPT_HTTPHEADER,        $headers);
        curl_setopt($ch, CURLOPT_COOKIEJAR,         $cfile); 
        curl_setopt($ch, CURLOPT_COOKIEJAR,         $cfile);     
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,    true);  
        $result = curl_exec($ch); 
        curl_close($ch); 
        return $result; 
    }
}
?&gt;</pre>
</div> Пример работы класса: <br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:252px;">&lt;?php
/**
 * Пример использования класса для сохранения любой web страницы.
 * @author Boolean
 * @version 0.1
 * @contacts icq 543929
 * @home codingworld.ru
 */
 
define('INC',   getcwd() . '/inc/');
require_once    INC . 'htmlsafe.class.php';

$FullURL = 'http://codingworld.ru/';

$HTMLSafe = new HTMLSafe($FullURL);
$cache = $HTMLSafe-&gt;Cache();

echo '&lt;a href=&quot;cache/' . $cache . '/&quot;&gt;Click here&lt;/a&gt;';
?&gt;</pre>
</div> Так же необходимо создать папку cache, и поставить на нее права 0777.<br />
<b>!!Обязательно!!</b> добавить .htaccess в корень папки cache<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<pre class="bbcode_code"style="height:132px;">RemoveType php

&lt;IfModule mod_php4.c&gt;
  php_flag engine 0
&lt;/IfModule&gt;

&lt;IfModule mod_php5.c&gt;
  php_flag engine 0
&lt;/IfModule&gt;</pre>
</div> Тогда php скрипты в директории cache работать не будут.</blockquote>

 ]]></content:encoded>
			<dc:creator>Boolean</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=78</guid>
		</item>
		<item>
			<title>Мысли</title>
			<link>http://blogs.reverse4you.org/entry.php?b=77</link>
			<pubDate>Thu, 01 Sep 2011 11:29:26 GMT</pubDate>
			<description>Форум, как человек, должен быть индивидуален... А у нас куда не плюнь - одни клоны.</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Форум, как человек, должен быть индивидуален... А у нас куда не плюнь - одни клоны.</blockquote>

 ]]></content:encoded>
			<dc:creator>root</dc:creator>
			<guid isPermaLink="true">http://blogs.reverse4you.org/entry.php?b=77</guid>
		</item>
	</channel>
</rss>

