<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danny8376</id>
	<title>3dbrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danny8376"/>
	<link rel="alternate" type="text/html" href="https://www.3dbrew.org/wiki/Special:Contributions/Danny8376"/>
	<updated>2026-04-07T17:02:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Internet_Browser&amp;diff=23699</id>
		<title>Internet Browser</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Internet_Browser&amp;diff=23699"/>
		<updated>2025-09-21T07:18:14Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: info for 11.14 spider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The 3DS Internet Browser was added in the June 2011 Update for JPN/EUR/USA.&lt;br /&gt;
&lt;br /&gt;
From the Internet Browser help section:&lt;br /&gt;
In compliance with the LGPL, the source code of the OSS is available via the Nintendo website.&lt;br /&gt;
This source code can be downloaded here:&lt;br /&gt;
[http://mediacontent.nintendo-europe.com/NOE/images/service/OpenSources.zip] [http://www.nintendo.co.jp/support/oss/index.html]&lt;br /&gt;
&lt;br /&gt;
The 3DS Internet Browser is [http://en.wikipedia.org/wiki/Netfront Netfront] Browser NX v1.0 based on [http://en.wikipedia.org/wiki/WebKit WebKit] engine.&lt;br /&gt;
&lt;br /&gt;
On O3DS the exheader name of this title is &amp;quot;SPIDER&amp;quot;; on N3DS, &amp;quot;SKATER&amp;quot;.&lt;br /&gt;
The only difference between the ExeFS .code for each region of the Old3DS/New3DS browser, is byte values for the title uniqueID/region.&lt;br /&gt;
&lt;br /&gt;
A [[#Dummy_web-browser|&amp;quot;dummy&amp;quot; browser]] (which replaces the actual browser) is being included with cartdrige games shipping with system updates starting with [[9.9.0-26|9.9.0-X]]. &lt;br /&gt;
In addition, versions of the real browser since 9.9.0-26X attempt to [[#Forced_system-update|check-in with a Nintendo server]] to determine if the existing browser version is out of date.&lt;br /&gt;
&lt;br /&gt;
==[[New 3DS]] Internet Browser==&lt;br /&gt;
New3DS has a separate browser title, with the exheader name &amp;quot;SKATER&amp;quot;.&lt;br /&gt;
Unlike the Old3DS browser, the New3DS browser has videos+HTML5 support. &lt;br /&gt;
&lt;br /&gt;
This browser also has a filter enabled by default in the JPN version. &lt;br /&gt;
Disabling it requires paying money with a credit-card, for [[NIM_Services|purchasing]] web-browser [[Title_list/DLC|DLC]].&lt;br /&gt;
During startup the browser does various HTTPS comms. When visting an URL, the browser sends a plaintext HTTP POST here: [http://ars.ifuser.jp:20080/ars2/rating]. The raw POST data begins with &amp;quot;ARS/2.0\r\n\x00&amp;quot;, the rest appears to be encrypted. The server reply content also has this ARS header + encrypted data. This appears to use a fixed xorpad, likely from a fixed encryption CTR/IV. The server content responses for allowed sites, and blocked sites, are fixed. When the server returns that the site is blocked, the browser goes to this page: [http://ars.ifuser.jp/filter/44.html](the Referrer header value is set to the same URL it&#039;s actually requesting).&lt;br /&gt;
&lt;br /&gt;
The WebKit source was updated since the Old3DS browser.&lt;br /&gt;
The New3DS browser uses the following services: [[MVD_Services|mvd:STD]] and [[IR_Services|ir:rst]](DLC-related services are used too but those aren&#039;t New3DS specific).&lt;br /&gt;
Video decoding is done with [[MVD_Services|mvd:STD]]. Audio decoding/playback is done with a browser-specific DSP binary. The Old3DS browser used CSND for audio playback, the New3DS browser doesn&#039;t have access to that at all since it uses DSP instead.&lt;br /&gt;
&lt;br /&gt;
=== Video / libstagefright ===&lt;br /&gt;
The browser manual includes licenses for Android and PacketVideo. The browser uses libstagefright from Android. Just like WebKit, the browser appears to use a very old version of libstagefright with security/other changes back-ported(for example, the v10.7 browser libstagefright codebase seems to be older than [https://android.googlesource.com/platform/frameworks/av/+/ec77122351b4e78c1fe5b60a208f76baf8c67591%5E%21/media/libstagefright/MPEG4Extractor.cpp this]). This codebase is missing certain chunk-parsing code for 3GP.&lt;br /&gt;
&lt;br /&gt;
HTTP for libstagefright is internally handled with [[HTTP_Services|HTTPC]], with a similar(?) set of RootCAs as for browser-version-check.&lt;br /&gt;
&lt;br /&gt;
===User-Agent and Browser Versions===&lt;br /&gt;
Normal user-agent format: &amp;lt;code style=&amp;quot;font-size:larger;&amp;quot;&amp;gt;Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/&amp;lt;WebKit version&amp;gt; (KHTML, like Gecko) NX/&amp;lt;Netfront version&amp;gt; Mobile NintendoBrowser/&amp;lt;Mobile NintendoBrowser version&amp;gt;.&amp;lt;region&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;region&amp;gt; can be one of the following: &amp;quot;JP&amp;quot;, &amp;quot;US&amp;quot;, or &amp;quot;EU&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mobile User-Agent is always &amp;lt;code&amp;gt;Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mobile NintendoBrowser version(displayed in browser settings)&lt;br /&gt;
! Normal UA&lt;br /&gt;
! CDN Title-version&lt;br /&gt;
! Network-only system-update version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.9934&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.8 Mobile NintendoBrowser/1.0.9934.&amp;lt;region&amp;gt;&lt;br /&gt;
| v10&lt;br /&gt;
| [[9.0.0-20]]&lt;br /&gt;
| Initial version.&lt;br /&gt;
|-&lt;br /&gt;
| 1.1.9996&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.10 Mobile NintendoBrowser/1.1.9996.&amp;lt;region&amp;gt;&lt;br /&gt;
| v1027&lt;br /&gt;
| [[9.3.0-21]]&lt;br /&gt;
| See below regarding OSS changes.&lt;br /&gt;
|-&lt;br /&gt;
| 1.2.10085&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.13 Mobile NintendoBrowser/1.2.10085.&amp;lt;region&amp;gt;&lt;br /&gt;
| v2051&lt;br /&gt;
| [[9.6.0-24]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v3075&lt;br /&gt;
| v9.9 CUP&lt;br /&gt;
| v9.9 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.3.10126&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.15 Mobile NintendoBrowser/1.3.10126.&amp;lt;region&amp;gt;&lt;br /&gt;
| v3077&lt;br /&gt;
| [[9.9.0-26]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.4.10138&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.17 Mobile NintendoBrowser/1.4.10138.&amp;lt;region&amp;gt;&lt;br /&gt;
| v4096&lt;br /&gt;
| [[10.2.0-28]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.5.10143&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.5.10143.&amp;lt;region&amp;gt;&lt;br /&gt;
| v5121&lt;br /&gt;
| [[10.4.0-29]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.6.10147&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.6.10147.&amp;lt;region&amp;gt;&lt;br /&gt;
| v6144&lt;br /&gt;
| [[10.6.0-31]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v7168&lt;br /&gt;
| v10.7 CUP&lt;br /&gt;
| v10.7 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7.10150&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.7.10150.&amp;lt;region&amp;gt;&lt;br /&gt;
| v7184&lt;br /&gt;
| [[10.7.0-32]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.8.10156&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.20 Mobile NintendoBrowser/1.8.10156.&amp;lt;region&amp;gt;&lt;br /&gt;
| v8192&lt;br /&gt;
| [[11.1.0-34]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v9217&lt;br /&gt;
| v11.4 CUP&lt;br /&gt;
| v11.4 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.9.10160&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.20 Mobile NintendoBrowser/1.9.10160.&amp;lt;region&amp;gt;&lt;br /&gt;
| v9232&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.10.10166&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.22 Mobile NintendoBrowser/1.10.10166.&amp;lt;region&amp;gt;&lt;br /&gt;
| v10272&lt;br /&gt;
| [[11.9.0-42]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.11.10172&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.23 Mobile NintendoBrowser/1.11.10172.&amp;lt;region&amp;gt;&lt;br /&gt;
| v11264&lt;br /&gt;
| [[11.14.0-46]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.12.10178&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.24 Mobile NintendoBrowser/1.12.10178.&amp;lt;region&amp;gt;&lt;br /&gt;
| v12289&lt;br /&gt;
| [[11.15.0-47]]&lt;br /&gt;
| See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that the latest Old3DS browser WebKit version at the time the initial New3DS browser was released, was the following: 532.8.&lt;br /&gt;
&lt;br /&gt;
The first version of the KOR New3DS browser was v9.6(which was when the New3DS KOR titles were originally added). Each version of the KOR browser has the same NintendoBrowser version as the other regions. The KOR browser has been only updated when the browser for the other regions were updated, hence the title-versions are the same as well. The KOR browser ExeFS .code is different from the other regions(more than just region-related IDs etc).&lt;br /&gt;
&lt;br /&gt;
==== OSS 9.0 and 9.3 diff ====&lt;br /&gt;
The following is a diff of the OSS archives from [http://www.nintendo.co.jp/support/oss/index.html here], for v9.0 and v9.3.&lt;br /&gt;
&lt;br /&gt;
 Files NewNintendo3DS_OpenSources9.0.0-/WKC/WebCore/platform/network/WKC/ResourceHandleManagerWKC.cpp and NewNintendo3DS_OpenSources9.3.0-/WKC/WebCore/platform/network/WKC/ResourceHandleManagerWKC.cpp differ&lt;br /&gt;
 Files NewNintendo3DS_OpenSources9.0.0-/WKC/WebKit/WKC/webkit/WKCVersion.h and NewNintendo3DS_OpenSources9.3.0-/WKC/WebKit/WKC/webkit/WKCVersion.h differ&lt;br /&gt;
&lt;br /&gt;
WKC_CUSTOMER_RELEASE_VERSION was changed from &amp;quot;0.5.8&amp;quot; to &amp;quot;0.5.10&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The following code was added to ResourceHandleManager::doRedirect(): curl_easy_setopt(d-&amp;gt;m_handle, CURLOPT_SHARE, 0);&lt;br /&gt;
&lt;br /&gt;
==== v9.6 ====&lt;br /&gt;
WebKit/OSS code was actually updated.&lt;br /&gt;
ExeFS .code was updated. The following files in RomFS were updated:&lt;br /&gt;
* &amp;quot;/banner/CN/Skater.icn&amp;quot; and &amp;quot;/banner/KR/Skater.icn&amp;quot;.&lt;br /&gt;
* &amp;quot;/browser/rootca.pem&amp;quot;&lt;br /&gt;
* &amp;quot;/build/buildinfo.dat&amp;quot;&lt;br /&gt;
* &amp;quot;/cairo.cro.lex&amp;quot; and &amp;quot;/.crr/static.crr&amp;quot;&lt;br /&gt;
* &amp;quot;/lyt/Button/ButtonSelectHSearch.arc&amp;quot;&lt;br /&gt;
* &amp;quot;/lyt/Kbd/Swkbd.arc&amp;quot;&lt;br /&gt;
* &amp;quot;lyt/Kbd.arc&amp;quot;&lt;br /&gt;
* &amp;quot;skater.msbt&amp;quot; under all of the &amp;quot;/message/&amp;lt;region&amp;gt;_&amp;lt;language&amp;gt;/&amp;quot; directories.&lt;br /&gt;
* &amp;quot;/oss.cro.lex&amp;quot;, &amp;quot;/peer.cro.lex&amp;quot;, &amp;quot;/static.crs&amp;quot;, and &amp;quot;/webkit.cro.lex&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The following was added to RomFS:&lt;br /&gt;
* &amp;quot;/favicon/naver.dat&amp;quot;&lt;br /&gt;
* A &amp;quot;KO&amp;quot; directory under &amp;quot;/iwnn&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== v9.9 ====&lt;br /&gt;
ExeFS:/.code was updated.&lt;br /&gt;
&lt;br /&gt;
The only RomFS changes is file-updating, all of the following files were updated:&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /cairo.cro.lex&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex&lt;br /&gt;
 /peer.cro.lex&lt;br /&gt;
 /static.crs&lt;br /&gt;
 /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
See [https://gist.github.com/yellows8/9fb509fde4112339f342 here] for a diff of the OSS(WebKitLibraries/ is not included due to the massive cairo library diff). An exploitable security vuln(which was already known in the context of 3DS webkit) was fixed. [[User:Yellows8|Yellows8]]&#039; private(at the time of writing) exploit for it is based on the PoC from [http://pastebin.com/ufBCQKda here](see the pastebin for the actual pastebin author).&lt;br /&gt;
&lt;br /&gt;
==== v10.2 ====&lt;br /&gt;
The libstagefright build in the main SKATER codebin was updated to a version which fixed libstagefright vuln(s): the vuln used in [[browserhax|browserhax_fright]] at the time of sysupdate release was fixed. The *only* code changed in the main codebin, was code related to libstagefright.&lt;br /&gt;
&lt;br /&gt;
The only RomFS changes is file-updating, all of the following files were updated(see the forced-sysupdate section regarding what changed in the message files):&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex&lt;br /&gt;
 /static.crs&lt;br /&gt;
 /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
OSS diff:&lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/WKC/WebKit/WKC/webkit/WKCVersion.h b/NewNintendo3DS_OpenSources10.2.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index 4543297..0860336 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;0.5.15&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;0.5.17&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;536.30&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/ChangeLog b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 index a5abb35..cf5a9fa 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 @@ -1,3 +1,12 @@&lt;br /&gt;
 +2013-11-05  Ryosuke Niwa  &amp;lt;rniwa@webkit.org&amp;gt;&lt;br /&gt;
 +&lt;br /&gt;
 +        Use-after-free in SliderThumbElement::dragFrom&lt;br /&gt;
 +        https://bugs.webkit.org/show_bug.cgi?id=123873&lt;br /&gt;
 +&lt;br /&gt;
 +        Reviewed by Andreas Kling.&lt;br /&gt;
 +&lt;br /&gt;
 +        Merge https://chromium.googlesource.com/chromium/blink/+/04a23bfca2d04101a1828d36ff36c29f3a24f34b&lt;br /&gt;
 +&lt;br /&gt;
  2015-02-06  Maciej Stachowiak  &amp;lt;mjs@apple.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
          REGRESSION(r179706): Caused memory corruption on some tests (Requested by _ap_ on #webkit).&lt;br /&gt;
 @@ -879,7 +888,7 @@&lt;br /&gt;
          * rendering/RenderLineBoxList.cpp:&lt;br /&gt;
          (WebCore::RenderLineBoxList::dirtyLinesFromChangedChild):&lt;br /&gt;
  &lt;br /&gt;
 -2014-01-21  LÃ¡szlÃ³ LangÃ³  &amp;lt;llango.u-szeged@partner.samsung.com&amp;gt;&lt;br /&gt;
 +2014-01-21  Laszlo Lango  &amp;lt;llango.u-szeged@partner.samsung.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
          Assertion failure in Range::nodeWillBeRemoved&lt;br /&gt;
          https://bugs.webkit.org/show_bug.cgi?id=121694&lt;br /&gt;
 @@ -1879,7 +1888,7 @@&lt;br /&gt;
  &lt;br /&gt;
  2012-09-14  Simon Fraser  &amp;lt;simon.fraser@apple.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 -        REGRESSION: transition doesnât always override transition-property&lt;br /&gt;
 +        REGRESSION: transition doesnft always override transition-property&lt;br /&gt;
          https://bugs.webkit.org/show_bug.cgi?id=96658&lt;br /&gt;
  &lt;br /&gt;
          Reviewed by Dean Jackson.&lt;br /&gt;
 @@ -3691,8 +3700,8 @@&lt;br /&gt;
              glyph with font data for the primary font, presumably to meet the SVG&lt;br /&gt;
              spec requirement: &amp;quot;If the references to alternate glyphs do not result&lt;br /&gt;
              in successful identification of alternate glyphs to use, then the&lt;br /&gt;
 -            character(s) that are inside of the çª¶åltGlyphçª¶?element are rendered as&lt;br /&gt;
 -            if the çª¶åltGlyphçª¶?element were a çª¶?spançª¶?element instead.&amp;quot;&lt;br /&gt;
 +            character(s) that are inside of the âaltGlyphâ?element are rendered as&lt;br /&gt;
 +            if the âaltGlyphâ?element were a â?spanâ?element instead.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
              If the alt glyph is not then found we are in the case from the spec&lt;br /&gt;
              and indeed we should use the primary font. However, we end up replacing the GlyphPage&lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/html/RangeInputType.cpp b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 index 484adec..d7e9e8d 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 @@ -164,7 +164,7 @@ void RangeInputType::handleMouseDownEvent(MouseEvent* event)&lt;br /&gt;
      ASSERT(element()-&amp;gt;hasShadowRoot());&lt;br /&gt;
      if (targetNode != element() &amp;amp;&amp;amp; !targetNode-&amp;gt;isDescendantOf(element()-&amp;gt;shadowTree()-&amp;gt;oldestShadowRoot()))&lt;br /&gt;
          return;&lt;br /&gt;
 -    SliderThumbElement* thumb = sliderThumbElementOf(element());&lt;br /&gt;
 +    RefPtr&amp;lt;SliderThumbElement&amp;gt; thumb = sliderThumbElementOf(element());&lt;br /&gt;
      if (targetNode == thumb)&lt;br /&gt;
          return;&lt;br /&gt;
      thumb-&amp;gt;dragFrom(event-&amp;gt;absoluteLocation());&lt;br /&gt;
&lt;br /&gt;
==== v10.4 ====&lt;br /&gt;
The ExeFS codebin was updated, the only change was that the following code was updated in the actual NupCheck HTTPS request function:&lt;br /&gt;
* Previous version: sprintf(out, &amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/2/%s&amp;quot;, region);&lt;br /&gt;
* Current  version: sprintf(out, &amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/%d/%s&amp;quot;, 3, region);&lt;br /&gt;
&lt;br /&gt;
libpng was updated from version 1.5.21 to 1.5.24.&lt;br /&gt;
&lt;br /&gt;
The following RomFS files were updated(see the forced-sysupdate section regarding what changed in the message files):&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /cairo.cro.lex&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex differ&lt;br /&gt;
 /peer.cro.lex differ&lt;br /&gt;
 /static.crs differ&lt;br /&gt;
 /webkit.cro.lex differ&lt;br /&gt;
&lt;br /&gt;
==== v10.6 ====&lt;br /&gt;
The ExeFS codebin was updated.&lt;br /&gt;
&lt;br /&gt;
[[browserhax|browserhax_fright_tx3g]] was fixed. The code handling tx3g now matches the latest libstagefright git.&lt;br /&gt;
&lt;br /&gt;
Hence the below RomFS listing, no OSS was updated at all(besides libstagefright mentioned above).&lt;br /&gt;
&lt;br /&gt;
The following RomFS files were updated:&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /static.crs&lt;br /&gt;
&lt;br /&gt;
==== v10.7 ====&lt;br /&gt;
Basically the same changes as Old3DS v10.7, except with the usual buildinfo.dat update in RomFS. The below date is 6 days after the browser-version-check [[3DS_Userland_Flaws|bypass]] was publicly disclosed.&lt;br /&gt;
&lt;br /&gt;
 cat v7184/00000025_romfs/build/buildinfo.dat&lt;br /&gt;
 10150&lt;br /&gt;
 applet&lt;br /&gt;
 2016-03-02 18:25&lt;br /&gt;
&lt;br /&gt;
==== v11.1 ====&lt;br /&gt;
The ExeFS codebin was updated. The following files in RomFS were updated:&lt;br /&gt;
&lt;br /&gt;
  /build/buildinfo.dat&lt;br /&gt;
  /.crr/static.crr&lt;br /&gt;
  /oss.cro.lex&lt;br /&gt;
  /static.crs&lt;br /&gt;
  /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
  cat v8192/00000026_romfs/build/buildinfo.dat&lt;br /&gt;
  10156&lt;br /&gt;
  applet&lt;br /&gt;
  2016-08-26 19:47&lt;br /&gt;
&lt;br /&gt;
Minus the 4 functions that changed due to compiler optimization, only 1 function was actually updated. This is LT_1a4004, previous version at LT_1a4004: libstagefright status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth)&lt;br /&gt;
&lt;br /&gt;
Additional code was added which doesn&#039;t seem to be from upstream git, right [https://android.googlesource.com/platform/frameworks/av/+/32d6e5f0ebe9e00f80401e5f4fd6e285a474590d/media/libstagefright/MPEG4Extractor.cpp#880 before] the cprt code block: &amp;quot;if((*offset + chunk_size) - data_offset &amp;lt; 0)fail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This fixed skater31hax + any other mp4 haxx which requires using a negative 64bit chunk_size value.&lt;br /&gt;
&lt;br /&gt;
The filepath base used in the assert strings were changed from &amp;quot;d:\Jenkins\workspace\MPSkaterBuild\MVPlayer\Skater\Base\Android\frameworks\base\media\libstagefright\&amp;quot; to &amp;quot;d:\jenkins\workspace\MPSkaterBuild-Git\Base\Android\frameworks\base\media\libstagefright\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== v11.4 ====&lt;br /&gt;
The only changes in RomFS was for &amp;quot;/build/buildinfo.dat&amp;quot; and &amp;quot;/static.crs&amp;quot;, hence no OSS in CRO(s) were updated.&lt;br /&gt;
&lt;br /&gt;
The main codebin was updated. Exactly two functions were updated, these are not related to code exec vulns.&lt;br /&gt;
&lt;br /&gt;
  cat v9232/00000027_romfs/build/buildinfo.dat&lt;br /&gt;
  10160&lt;br /&gt;
  applet&lt;br /&gt;
  2017-03-08 19:44&lt;br /&gt;
&lt;br /&gt;
=== New3DS Browser Specifications ===&lt;br /&gt;
[http://www.nintendo.co.jp/3ds/new/features/modal_net.html]&lt;br /&gt;
&lt;br /&gt;
English version:&lt;br /&gt;
* &amp;quot;Browser engine: NetFront® Browser NX v3.0&amp;quot;&lt;br /&gt;
* &amp;quot;User agent: Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML and like Gecko) NX/3.0.*.*.* Mobile NintendoBrowser/1.0.**** JP&lt;br /&gt;
* ** Version information is stated.&lt;br /&gt;
* *** When using the “Mobile version request” function, it differs from the above-mentioned character string&amp;quot;&lt;br /&gt;
* &amp;quot;Supported protocols: HTTP1.0/HTTP1.1/SSL3.0/TLS1.0/TLS1.1/TLS1.2&amp;quot;&lt;br /&gt;
* &amp;quot;Web standard: HTML4.01 / HTML5 / XHTML1.1 / Fullscreen API / Gamepad API / SVG / WebSocket / Video Subtitle / WOFF / Web Messaging / Server-Sent / Web Storage (partial) / XMLHttpRequest / Canvas element / Video / DOM Levels 1-3 / ECMAScript / CSS1 / CSS2.1 / CSS3 (partial)&amp;quot;&lt;br /&gt;
* &amp;quot;Image format: bmp / ​​gif / ico / jpeg / png / svg (There are, however, possibilities that some images won&#039;t display.)&amp;quot;&lt;br /&gt;
* &amp;quot;Image preview: mpo / jpeg (There are, however, possibilities that some images won&#039;t display.)&amp;quot;&lt;br /&gt;
* &amp;quot;Video format: MP4, M3U8 + TS (HTTPLiveStreaming) (There are, however, some videos that may not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Video codec: H.264 - MPEG-4 AVC Video (max 854x480 at level 3.2, 3D compatible) (There are, however, some videos that can not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Audio codec: AAC - ISO / IEC 14496-3 MPEG-4AAC, MP3 (There are, however, some videos that can not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Format for uploading 3D videos: .mkv (In order to be played, videos must be converted to the appropriate format within the site you are uploading to. In some cases, the video will not play even if converted.)&amp;quot;&lt;br /&gt;
* &amp;quot;Plug-ins: Plug-ins such as Adobe Flash are not supported&amp;quot;&lt;br /&gt;
* &amp;quot;Active Rating System filtering: provided by Digital Arts, Inc.. Access to web content can be limited based on its category information, restricting access to web content that may result inappropriate.&amp;quot;&lt;br /&gt;
* &amp;quot;Websites can be requested to provide the mobile version (However, if the web page does not have a mobile version, it won&#039;t change the way it&#039;s displayed.)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MJPEG + .avi is also supported.&lt;br /&gt;
&lt;br /&gt;
==== Gamepad ====&lt;br /&gt;
The browser&#039;s now-outdated gamepad API provides information about the states of the circle pad, C-stick, and every button aside from the Home and Power buttons. The gamepad, which has an ID of &amp;lt;code&amp;gt;New Nintendo 3DS Controller&amp;lt;/code&amp;gt;, is contained within the array returned by the &amp;lt;code&amp;gt;navigator.webkitGetGamepads&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
Both of the gamepad&#039;s arrays, which contain the states of various inputs, seem to be reconstructed each time they are accessed via their gamepad object. It is not known if the values within the arrays can update upon each access of the array, but the values &amp;lt;em&amp;gt;can&amp;lt;/em&amp;gt; update frequently enough to obtain accurate readings of the system&#039;s controls.&lt;br /&gt;
&lt;br /&gt;
===== Axes =====&lt;br /&gt;
The gamepad&#039;s &amp;lt;code&amp;gt;axes&amp;lt;/code&amp;gt; array contains four floating-point numbers in the following order:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Index !! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Circle pad X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Circle pad Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || C-stick X&lt;br /&gt;
|-&lt;br /&gt;
| 3 || C-stick Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each coordinate ranges from -1.0 (left/up) to 1.0 (right/down). Neutral position is indicated by 0.0. Drift and/or inaccurate calibration may make these exact values unattainable.&lt;br /&gt;
&lt;br /&gt;
===== Buttons =====&lt;br /&gt;
The gamepad&#039;s &amp;lt;code&amp;gt;buttons&amp;lt;/code&amp;gt; array contains numbers for the following numbers:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Index !! Button &lt;br /&gt;
|-&lt;br /&gt;
| 0 || B&lt;br /&gt;
|-&lt;br /&gt;
| 1 || A&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y&lt;br /&gt;
|-&lt;br /&gt;
| 3 || X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || L&lt;br /&gt;
|-&lt;br /&gt;
| 5 || R&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ZL&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ZR&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Select&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Start&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Unused&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Unused&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Down&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Left&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each button&#039;s value is 0 while the button is not pressed, and 1 while the button is pressed.&lt;br /&gt;
&lt;br /&gt;
Based on the Gamepad API&#039;s specifications, buttons 10 and 11 are reserved for left stick presses and right stick presses respectively, which the 3DS does not support.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
* Viewport information can be specified with the &amp;lt;meta&amp;gt; element.&lt;br /&gt;
* The html &amp;quot;color&amp;quot; &amp;lt;input&amp;gt; type is not supported.&lt;br /&gt;
* 3D images appear as their right-eye image within webpages.&lt;br /&gt;
* Webpages are locked to the bottom screen when zooming is disabled, the webpage&#039;s initial scale is 1, and the entire webpage can fit within the bottom screen&#039;s dimensions (320x212).&lt;br /&gt;
* Interactable elements that are positioned partially outside of the bottom screen can temporarily be moved further inside the bottom screen by tapping them with the touchscreen.&lt;br /&gt;
* Favicons can be changed using Javascript, but they become unchangeable once the document&#039;s &amp;lt;em&amp;gt;readystatechange&amp;lt;/em&amp;gt; event finishes firing with a ready state of &amp;quot;complete&amp;quot;.&lt;br /&gt;
* Focusing on text-editable elements via Javascript will always open the keyboard.&lt;br /&gt;
* Webpage content is usually rendered at 30 FPS despite the &amp;lt;code&amp;gt;webkitRequestAnimationFrame&amp;lt;/code&amp;gt; function allowing code to run at a rate of 60 FPS.&lt;br /&gt;
** As a result, display-related routines may only show half of their intended updates.&lt;br /&gt;
** This issue can be mitigated by rendering on every other frame. However, various factors (such as touchscreen input and sleep mode) make this fairly inconsistent.&lt;br /&gt;
&lt;br /&gt;
== Old3DS browser ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Old3DS Browser Specifications ===&lt;br /&gt;
* &amp;quot;Browser engine: NetFront® Browser&amp;quot;&lt;br /&gt;
* &amp;quot;User agent: Mozilla/5.0 (Nintendo 3DS; region; ; en) Version/1.7498.US&amp;quot;&lt;br /&gt;
* &amp;quot;Supported protocols: HTTP1.0/HTTP1.1/SSLv3/TLS1.0&amp;quot;&lt;br /&gt;
* &amp;quot;Web standard: HTML 4.01/XHTML 1.1/CSS 1/CSS 2.1/CSS 3 (partial functionality)/DOM Levels 1-3/ECMAScript/XMLHttpRequest/Canvas Element (partial functionality)&amp;quot;&lt;br /&gt;
* &amp;quot;Image format: MPO / GIF / JPEG / PNG / BMP / ICO (some images cannot be displayed)&amp;quot;&lt;br /&gt;
* &amp;quot;Plug-ins: Plug-ins such as Adobe Flash are not supported&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Old3DS browser doesn&#039;t support events &amp;quot;focusin&amp;quot; and &amp;quot;focusout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== User-Agent and Browser Versions ===&lt;br /&gt;
User-agent format: &amp;lt;code style=&amp;quot;font-size:larger;&amp;quot;&amp;gt;Mozilla/5.0 (Nintendo 3DS; U; ; &amp;lt;lang&amp;gt;) Version/&amp;lt;version&amp;gt;.&amp;lt;region&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lang&amp;gt; is &amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;, etc. &amp;lt;region&amp;gt; is &amp;quot;US&amp;quot;, &amp;quot;EU&amp;quot;, etc. See below for &amp;lt;version&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser version&lt;br /&gt;
! CDN Title-version&lt;br /&gt;
! Network-only system-update version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1.7412&lt;br /&gt;
| v6&lt;br /&gt;
| [[2.0.0-2|2.0.0-2]]&lt;br /&gt;
| This was the initial version.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7455&lt;br /&gt;
| v1024&lt;br /&gt;
| [[2.1.0-4]]&lt;br /&gt;
| ExeFS .code was updated, both of the CROs(webkit/OSS) were updated too.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7498&lt;br /&gt;
| v2050&lt;br /&gt;
| [[4.0.0-7]]&lt;br /&gt;
| ExeFS .code was updated, both of the CROs(webkit/OSS) were updated too. The manual CFA was updated as well.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7538&lt;br /&gt;
| v0&lt;br /&gt;
| [[4.2.0-9]]&lt;br /&gt;
| First version of the KOR browser. The CROs are different from the  USA/EUR/JPN [[4.0.0-7]] browser.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7552&lt;br /&gt;
| v3075&lt;br /&gt;
| [[5.0.0-11]]&lt;br /&gt;
| ExeFS .code and icon were updated, both of the CROs(webkit/OSS) were updated too. The manual CFA was updated as well.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7552&lt;br /&gt;
| v3088&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| The main NCCH wasn&#039;t updated at all(same TMD contentID/content-hash as the previous version), only the manual CFA for this title was updated.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7567&lt;br /&gt;
| v4096&lt;br /&gt;
| [[7.1.0-16]]&lt;br /&gt;
| The CXI .code was updated, some data in the RomFS was updated(none of the CROs such as webkit.cro were updated). The manual CFA was updated too.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7585&lt;br /&gt;
| v5121&lt;br /&gt;
| [[9.5.0-23]]&lt;br /&gt;
| The CXI .code was updated, and the manual CFA was updated. RomFS changes:&lt;br /&gt;
* &amp;quot;/browser/rootca.pem&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/oss.cro&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/static.crs&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/webkit.cro&amp;quot; updated&lt;br /&gt;
* &amp;quot;/.crr/static.crr&amp;quot; updated&lt;br /&gt;
* &amp;quot;/layout/dialogheader/WirelessSwitchOff.arc&amp;quot; was removed&lt;br /&gt;
* &amp;quot;/layout/favorite/favicondata/KOR.arc&amp;quot; updated&lt;br /&gt;
&lt;br /&gt;
A vuln used in a public(at the time of this sysupdate) webkit exploit for spider was fixed, which also fixed the removewinframe exploit from [https://github.com/yellows8/3ds_webkithax here].&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| v6147&lt;br /&gt;
| v9.9 CUP&lt;br /&gt;
| v9.9 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7610&lt;br /&gt;
| v6149&lt;br /&gt;
| [[9.9.0-26]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7616&lt;br /&gt;
| v7168&lt;br /&gt;
| [[10.2.0-28]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7622&lt;br /&gt;
| v8192&lt;br /&gt;
| [[10.6.0-31]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| v9216&lt;br /&gt;
| v10.7 CUP&lt;br /&gt;
| v10.7 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7625&lt;br /&gt;
| v9232&lt;br /&gt;
| [[10.7.0-32]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7630&lt;br /&gt;
| v10240&lt;br /&gt;
| [[11.1.0-34]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7636&lt;br /&gt;
| v11297&lt;br /&gt;
| [[11.9.0-42]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7639&lt;br /&gt;
| v12288&lt;br /&gt;
| [[11.14.0-46]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7642&lt;br /&gt;
| v13313&lt;br /&gt;
| [[11.15.0-47]]&lt;br /&gt;
| See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
The USA/EUR/JPN + KOR browser allocates the 0x08000000 heap with size 0x01A97000. The size used by the CHN and TWN browser is 0x01997000, exactly 0x100000-bytes smaller.&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v9.9 ===&lt;br /&gt;
ExeFS:/.code was updated.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS were file-updating, the following files were updated:&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/spider.msbt&lt;br /&gt;
 /message/EU_Dutch/spider.msbt&lt;br /&gt;
 /message/EU_English/spider.msbt&lt;br /&gt;
 /message/EU_French/spider.msbt&lt;br /&gt;
 /message/EU_German/spider.msbt&lt;br /&gt;
 /message/EU_Italian/spider.msbt&lt;br /&gt;
 /message/EU_Portuguese/spider.msbt&lt;br /&gt;
 /message/EU_Russian/spider.msbt&lt;br /&gt;
 /message/EU_Spanish/spider.msbt&lt;br /&gt;
 /message/JP_Japanese/spider.msbt&lt;br /&gt;
 /message/KR_Hangeul/spider.msbt&lt;br /&gt;
 /message/TW_English/spider.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/spider.msbt&lt;br /&gt;
 /message/US_English/spider.msbt&lt;br /&gt;
 /message/US_French/spider.msbt&lt;br /&gt;
 /message/US_Portuguese/spider.msbt&lt;br /&gt;
 /message/US_Spanish/spider.msbt&lt;br /&gt;
&lt;br /&gt;
OSS diff for v9.5 and v9.9, without the .dox changes:&lt;br /&gt;
&lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/WKC/WebKit/WKC/webkit/WKCVersion.h b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index be5ff09..55a7274 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.14&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.16&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;532.7&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/webkit/WebCore/rendering/RenderBox.cpp b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 index da4127e..d03403e 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 @@ -305,23 +305,23 @@ int RenderBox::scrollHeight() const&lt;br /&gt;
  &lt;br /&gt;
  int RenderBox::scrollLeft() const&lt;br /&gt;
  {&lt;br /&gt;
 -    return hasOverflowClip() ? layer()-&amp;gt;scrollXOffset() : 0;&lt;br /&gt;
 +    return layer() &amp;amp;&amp;amp; hasOverflowClip() ? layer()-&amp;gt;scrollXOffset() : 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int RenderBox::scrollTop() const&lt;br /&gt;
  {&lt;br /&gt;
 -    return hasOverflowClip() ? layer()-&amp;gt;scrollYOffset() : 0;&lt;br /&gt;
 +    return layer() &amp;amp;&amp;amp; hasOverflowClip() ? layer()-&amp;gt;scrollYOffset() : 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void RenderBox::setScrollLeft(int newLeft)&lt;br /&gt;
  {&lt;br /&gt;
 -    if (hasOverflowClip())&lt;br /&gt;
 +    if (hasOverflowClip() &amp;amp;&amp;amp; layer())&lt;br /&gt;
          layer()-&amp;gt;scrollToXOffset(newLeft);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void RenderBox::setScrollTop(int newTop)&lt;br /&gt;
  {&lt;br /&gt;
 -    if (hasOverflowClip())&lt;br /&gt;
 +    if (hasOverflowClip() &amp;amp;&amp;amp; layer())&lt;br /&gt;
          layer()-&amp;gt;scrollToYOffset(newTop);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.2 ===&lt;br /&gt;
The slider vuln from [https://github.com/yellows8/3ds_webkithax here] was fixed in the Old3DS browser.&lt;br /&gt;
&lt;br /&gt;
The main codebin .text only increased by 0x10-bytes.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS was that the following files were updated:&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
&lt;br /&gt;
OSS diff:&lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index 55a7274..fc153c4 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.16&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.17&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;532.7&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderSlider.cpp b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 index b2f5cef..1dd3dbd 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 @@ -221,6 +221,7 @@ RenderSlider::~RenderSlider()&lt;br /&gt;
  {&lt;br /&gt;
      if (m_thumb)&lt;br /&gt;
          m_thumb-&amp;gt;detach();&lt;br /&gt;
 +    m_thumb = 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int RenderSlider::baselinePosition(bool, bool) const&lt;br /&gt;
 @@ -493,7 +494,8 @@ void RenderSlider::forwardEvent(Event* event)&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
 -    m_thumb-&amp;gt;defaultEventHandler(event);&lt;br /&gt;
 +    if (m_thumb)&lt;br /&gt;
 +        m_thumb-&amp;gt;defaultEventHandler(event);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  bool RenderSlider::inDragMode() const&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.6 ===&lt;br /&gt;
[[browserhax|spider28hax]] was fixed. The &amp;quot;2^32 characters long string&amp;quot; vuln described [[3DS_Userland_Flaws|here]] was &#039;&#039;finally&#039;&#039; fixed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A lot&#039;&#039; of WebKit issues/vulns were fixed, see [https://gist.github.com/yellows8/b1e10caa1d8bb8a46316 here] for the changes.&lt;br /&gt;
&lt;br /&gt;
libpng was updated from version 1.4.12 to 1.4.19. zlib was updated from 1.2.7 to 1.2.8.&lt;br /&gt;
&lt;br /&gt;
The .text size increased by 0x478-bytes.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS was that the following files were updated:&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /manual/Manual.bcma&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.7 ===&lt;br /&gt;
&#039;&#039;Nothing&#039;&#039; changed except some words for version-values in .text being updated(RomFS wasn&#039;t changed), code for browser-version-check was [[#v10.7_2|updated]].&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v11.1 ===&lt;br /&gt;
Nothing changed in the ExeFS codebin besides the usual version values. The following files in RomFS were updated:&lt;br /&gt;
  /cro/oss.cro&lt;br /&gt;
  /cro/webkit.cro&lt;br /&gt;
  /.crr/static.crr&lt;br /&gt;
&lt;br /&gt;
== Forced system-update ==&lt;br /&gt;
The Old3DS/New3DS Internet Browser updated with [[9.9.0-26]] added the following message strings:&lt;br /&gt;
 In order to use the Internet &lt;br /&gt;
 browser, a system update &lt;br /&gt;
 is required.&lt;br /&gt;
 To perform a system update, &lt;br /&gt;
 select System Update from Other&lt;br /&gt;
 Settings in System Settings.&lt;br /&gt;
&lt;br /&gt;
 The Internet browser cannot be&lt;br /&gt;
 used at this time.&lt;br /&gt;
 Please check your network&lt;br /&gt;
 environment or try again later.&lt;br /&gt;
&lt;br /&gt;
For whatever reason, the above &#039;&#039;message strings&#039;&#039; were removed with New3DS-browser v10.2, then re-added with v10.4. This does not apply to the Old3DS browser. Whenever v10.2 New3DS browser tries to use these message-strings for displaying a browser-update-related message, it will crash due to an assert failing since the message-strings are missing. Hence, if/when the v10.2 update-check page is ever updated where the browser tries to display a message for it, or when accessing that page fails, the browser will automatically crash.&lt;br /&gt;
&lt;br /&gt;
This wasn&#039;t enforced(web-browser displaying the above message when the installed browser isn&#039;t the latest version) until October 26, 2015.&lt;br /&gt;
&lt;br /&gt;
This message only triggers when attempting to load a web-page. This is only handled the first time the browser accesses a web-page, during this browser session.&lt;br /&gt;
&lt;br /&gt;
The browser codebins starting with v9.9 now contain the following URL strings:&lt;br /&gt;
* Old3DS: &amp;lt;nowiki&amp;gt;&amp;quot;https://cbvc.cdn.nintendo.net/CTR/1/&amp;lt;region&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* New3DS: &amp;lt;nowiki&amp;gt;&amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/1/&amp;lt;region&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;region&amp;gt; string is one of the following:&lt;br /&gt;
* &amp;quot;JPN&amp;quot;&lt;br /&gt;
* &amp;quot;USA&amp;quot;&lt;br /&gt;
* &amp;quot;EUR&amp;quot;&lt;br /&gt;
* &amp;quot;KOR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Starting with the browser from [[10.2.0-28]], the &amp;quot;1&amp;quot; in the above URLs were changed to &amp;quot;2&amp;quot;. With the New3DS browser from [[10.4.0-29]], it&#039;s now &amp;quot;3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As of October 26, 2015, the &amp;quot;1&amp;quot; URLs return the browser-version for v9.9(decimal number as a string without any &amp;quot;.&amp;quot;), while the &amp;quot;2&amp;quot; URLs returns 0.&lt;br /&gt;
&lt;br /&gt;
 if(internal_browserver &amp;gt; server_browserver)&lt;br /&gt;
 {&lt;br /&gt;
     &amp;lt;safe&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
     &amp;lt;update message&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hence, internal_browserver == server_browserver will trigger the sysupdate message, which appears to be the normal way to indicate that the current browser is outdated(see above).&lt;br /&gt;
&lt;br /&gt;
There is a cache for this in savedata. The request is only done when at least 24-hours have passed since the last time the request was done(see the below savedata section).&lt;br /&gt;
&lt;br /&gt;
It is still possible to guard against this update by blocking the previous URLs using a proxy. &lt;br /&gt;
It is not possible to remove the update message by entering the [[Recovery Mode]].&lt;br /&gt;
&lt;br /&gt;
=== Page request ===&lt;br /&gt;
For this request, all root-CAs bundled with the browser are trusted, in addition to two of the SSL module builtin Nintendo root-CAs.&lt;br /&gt;
&lt;br /&gt;
The browser(with New3DS at least) does the following with [[HTTP_Services|HTTPC]] for requesting the above page:&lt;br /&gt;
* Initializes the HTTP context and uses [[HTTPC:InitializeConnectionSession]] + [[HTTPC:SetProxyDefault]].&lt;br /&gt;
* Uses [[HTTP_Services|HTTPC]] command 0x250080 twice with cmd[1]=contexthandle: first time cmd[2]=0x3, second time cmd[2]=0x6.&lt;br /&gt;
* Then [[HTTPC:AddTrustedRootCA]] is used 48 times to setup 48 trusted root CAs. This appears to be every cert in the browser &amp;quot;romfs:/browser/rootca.pem&amp;quot; file converted to DER, in the same order from there(in other words, every single root CA the browser trusts by default for normal web-browsing).&lt;br /&gt;
* Then [[HTTPC:BeginRequest]] is used.&lt;br /&gt;
* Then [[HTTPC:ReceiveDataTimeout]] is used, the recv-size seems to be fixed to 0x20.&lt;br /&gt;
* Then [[HTTPC:GetResponseStatusCodeTimeout]] is used.&lt;br /&gt;
* Then [[HTTPC:GetDownloadSizeState]] is used.&lt;br /&gt;
* Then the HTTP context is closed.&lt;br /&gt;
&lt;br /&gt;
Raw request data(New3DS USA v10.2 browser):&lt;br /&gt;
 000000: 47 45 54 20 2f 53 4e 41 4b 45 2f 32 2f 55 53 41  GET /SNAKE/2/USA&lt;br /&gt;
 000010: 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a   HTTP/1.1..Host:&lt;br /&gt;
 000020: 20 63 62 76 63 2e 63 64 6e 2e 6e 69 6e 74 65 6e   cbvc.cdn.ninten&lt;br /&gt;
 000030: 64 6f 2e 6e 65 74 0d 0a 0d 0a                    do.net....&lt;br /&gt;
&lt;br /&gt;
=== v10.7 ===&lt;br /&gt;
The only actual code change with Old3DS/New3DS browser v10.7 was that the code which calculates the diff_timestamp was moved to immediately after the block which initializes &amp;lt;state_timestamp&amp;gt; when &amp;lt;state_timestamp&amp;gt; is all-zero. This fixed the browser-version-check [[3DS_Userland_Flaws|bypass]].&lt;br /&gt;
&lt;br /&gt;
== Dummy web-browser ==&lt;br /&gt;
Gamecards v9.9 and above include, with their sysupdate, a dummy Old3DS/New3DS web-browser. The *only* thing this title does is display the same message listed in the above forced-update section. The message files in RomFS *only* contain that message string above. There are no &amp;quot;http&amp;quot; strings in the main codebin, and [[RO_Services|RO]] isn&#039;t used either(no CRO data in RomFS at all). Both browsers are internally called &amp;quot;dummySpider&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hence, if you update your system below v9.8 with any v9.9 or above gamecard, the system web-browser will be rendered *completely* useless until you install a system-update from CDN(no network requests involved here).&lt;br /&gt;
&lt;br /&gt;
Gamecards v10.7 and v11.4(New3DS only) have updated the dummy web-browser, where the only difference is the title version.&lt;br /&gt;
&lt;br /&gt;
== Savedata ==&lt;br /&gt;
=== New3DS ===&lt;br /&gt;
On newer SKATER versions, it appears *all* NAND savedata is stored under the [[System_SaveData|0x000200BB]] savedata.&lt;br /&gt;
&lt;br /&gt;
==== 0x000200BB savedata ====&lt;br /&gt;
This only contains &amp;quot;t.bin&amp;quot; with filesize 0xadf80, the format is below.&lt;br /&gt;
&lt;br /&gt;
The timestamp format used here is the number of milliseconds since January 1, 2000(local-time).&lt;br /&gt;
&lt;br /&gt;
When using the &amp;quot;Initialize savedata&amp;quot; option in the browser, that deletes this savedata file/image then exits the browser. This file is then re-created when the browser gets started again.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4?&lt;br /&gt;
| This counter is incremented each time the savedata is written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x8&lt;br /&gt;
| Timestamp for when the savedata was last written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x15?&lt;br /&gt;
| This is all-zeros on non-JPN systems. On JPN systems where the browser filter is disabled, this is a string in the following format: &amp;quot;4110-%016llX&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x8&lt;br /&gt;
| s64 timestamp, can be either a normal positive timestamp or a relative negative one. Used with the forced-update described above. When an update is detected this timestamp is negative, otherwise this is a normal positive timestamp(it&#039;s unknown how exactly this timestamp is checked). When positive, this seems to be the last time the forced-update HTTPS request was done where no update was needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==APT Parameters==&lt;br /&gt;
The URL to load can optionally be loaded from char[] string [[APT:SendParameter|paramblk+0]]. This is used when scanning URL QR-codes in Home Menu / etc.&lt;br /&gt;
&lt;br /&gt;
==Errors==&lt;br /&gt;
&amp;quot;Failed to load part of this page&amp;quot;: This can be caused by failing to load &amp;quot;/favicon.ico&amp;quot;. For example, this can be caused by loading a plain HTTP page, with plain-http favicon redirecting to HTTPS. If cert-verify then fails with favicon in this case, this error would then trigger.&lt;br /&gt;
&lt;br /&gt;
==Other details==&lt;br /&gt;
&lt;br /&gt;
*It scored 90/100 on [http://acid3.acidtests.org/ Acid3] test&lt;br /&gt;
*Images from the Internet can be saved to the [[SD Filesystem|SD Card]] and viewed using the [[Nintendo 3DS Camera]] application.&lt;br /&gt;
*Images saved to an [[SD Filesystem|SD Card]] or to the Nintendo 3DS system memory can be uploaded to blogs or other sites that allow the uploading of photos using :&lt;br /&gt;
 &amp;lt;input type=&amp;quot;file&amp;quot; /&amp;gt;&lt;br /&gt;
* HTML5Test.com say that Drag and drop is supported but it&#039;s not (code on WebKit is ready, but it&#039;s not implemented on interface of browser)&lt;br /&gt;
* Webpages are rendered with the RGB565 color format.&lt;br /&gt;
&lt;br /&gt;
==Tips==&lt;br /&gt;
&lt;br /&gt;
=== Detect User Agent ===&lt;br /&gt;
&lt;br /&gt;
To detect if the user agent is the Nintendo 3DS Internet Browser (not including mobile site mode):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     if(navigator.userAgent.indexOf(&amp;quot;Nintendo 3DS&amp;quot;) == -1) { // If the user agent does not contain &amp;quot;Nintendo 3DS&amp;quot;&lt;br /&gt;
         location.replace(&amp;quot;http://www.3dbrew.org&amp;quot;); // Redirect to another page&lt;br /&gt;
     }&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* You can check using &amp;lt;code&amp;gt;navigator.platform.indexOf(&amp;quot;Nintendo 3DS&amp;quot;) &amp;gt; -1&amp;lt;/code&amp;gt; as well.&lt;br /&gt;
* The New 3DS Internet Browser&#039;s &amp;quot;Request Mobile Sites&amp;quot; setting affects the user agent. To detect if the New 3DS Internet Browser is being used with this option enabled, use &amp;lt;code&amp;gt;screen.pixelDepth == 16 &amp;amp;&amp;amp; navigator.platform == &amp;quot;iPhone&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** This relies on the fact that the internet browser renders its webpages in 16-bit color, which is (hopefully?) not possible with a real iPhone.&lt;br /&gt;
** Keep in mind that the previous browser-detection examples do not account for this setting.&lt;br /&gt;
&lt;br /&gt;
=== Scrolling ===&lt;br /&gt;
&lt;br /&gt;
Scrolling can be altered by modifying &amp;lt;em&amp;gt;document.body.scrollTop&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;document.body.scrollLeft&amp;lt;/em&amp;gt;.  However, there are drawbacks related to working with these properties:&lt;br /&gt;
&lt;br /&gt;
* Both properties return 0 when accessed&lt;br /&gt;
* Setting one property resets the other property&#039;s scroll position&lt;br /&gt;
&lt;br /&gt;
In order to set both at the same time (without either resetting to 0), use &amp;lt;em&amp;gt;window.scrollTo&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
==== Key Events ====&lt;br /&gt;
The following buttons trigger the &amp;lt;em&amp;gt;onkeydown&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;onkeypress&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;onkeyup&amp;lt;/em&amp;gt; events:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Code !! Button &lt;br /&gt;
|-&lt;br /&gt;
| 13 || A&lt;br /&gt;
|-&lt;br /&gt;
| 37 || Left&lt;br /&gt;
|-&lt;br /&gt;
| 38 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 39 || Right&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Down&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The events cannot have their default action cancelled.  Other buttons do not trigger key events.&lt;br /&gt;
&lt;br /&gt;
The Old3DS browser dispatches a &amp;lt;em&amp;gt;keypress&amp;lt;/em&amp;gt; event once per key press for each of the buttons above, but the New3DS browser dispatches the event continuously until the button is released.&lt;br /&gt;
&lt;br /&gt;
A keyboard event&#039;s &amp;lt;code&amp;gt;keyIdentifier&amp;lt;/code&amp;gt; property usually should not be used to identify which button was pressed, as the A button&#039;s &amp;lt;em&amp;gt;keypress&amp;lt;/em&amp;gt; event is dispatched with a key identifier of &amp;quot;&amp;quot; (an empty string) rather than &amp;quot;Enter&amp;quot; in the New3DS browser.&lt;br /&gt;
&lt;br /&gt;
The New3DS browser&#039;s keyboard dispatches &amp;lt;em&amp;gt;keydown&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;keyup&amp;lt;/em&amp;gt; events when a key is pressed, but it is not possible to determine which key was pressed based on the event itself. Every keyboard &amp;lt;em&amp;gt;keydown&amp;lt;/em&amp;gt; event has a key code of 229 and a key identifier of &amp;quot;U+00E5&amp;quot;, and every &amp;lt;em&amp;gt;keyup&amp;lt;/em&amp;gt; event has a key code of 0 and a key identifier of &amp;quot;U+0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Key events are suppressed while the touchscreen is touched.&lt;br /&gt;
&lt;br /&gt;
==== Touch/Mouse Events ====&lt;br /&gt;
The &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;mouseup&amp;lt;/em&amp;gt;, and &amp;lt;em&amp;gt;click&amp;lt;/em&amp;gt; events are all triggered by the browser.  However, the &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt; event doesn&#039;t trigger until you lift the stylus or you&#039;ve held it on the screen long enough to trigger text selection mode.  Text selection mode requires pressing the touchscreen for approximately 1.05 seconds in the Old3DS browser, or pressing the touchscreen for approximately 0.41 seconds in the New3DS browser. Also, the &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt; event is only dispatched while text selection mode is active. Mouse events cannot have their default actions cancelled.&lt;br /&gt;
&lt;br /&gt;
Touch events are not supported in the Old3DS browser, and the &amp;lt;em&amp;gt;touchcancel&amp;lt;/em&amp;gt; event does not seem to be used by either browser. Touches cannot start within the bottom browser bar, but they can move to be within it. The rotation angle, contact radii, and pressure of each touch are always zero, as the 3DS touchscreen is not capable of detecting these values. Only one touch can be detected at a time due to the touchscreen&#039;s hardware limitations as well. Unlike mouse events, touch events can have their default actions cancelled. Doing so will prevent the touchscreen from being used to scroll through the webpage, highlight text, zoom out, and interact with the bottom browser bar.&lt;br /&gt;
&lt;br /&gt;
==== System Font Characters ====&lt;br /&gt;
The [[System_Font#Unicode_Private_Use_characters|system font]]&#039;s private-use characters can be viewed within the web browser.&lt;br /&gt;
&lt;br /&gt;
== Screen Resolution ==&lt;br /&gt;
&lt;br /&gt;
The up screen resolution is 400×240. However, the viewable area in the browser is only &amp;lt;b&amp;gt;400×215&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The touch screen resolution is 320×240. However, the viewable area in the browser is &amp;lt;b&amp;gt;320×212&amp;lt;/b&amp;gt; &amp;lt;em&amp;gt;or&amp;lt;/em&amp;gt; &amp;lt;b&amp;gt;320×240&amp;lt;/b&amp;gt;, depending on if the bottom browser bar is visible. The New3DS browser&#039;s bottom bar can hidden by scrolling and/or attempting to zoom in/out with the C-stick, unless scrolling and zooming have both been disabled.&lt;br /&gt;
&lt;br /&gt;
You can have a page span both screens. However, the browser will behave as if the bottom screen is the only active screen and the top screen is scrolled off. This is important when computing CSS coordinates. Items positioned from the &amp;quot;bottom&amp;quot; will be positioned based on the height of the bottom screen, not the cumulative height of both screens.&lt;br /&gt;
&lt;br /&gt;
== Using Both Screens ==&lt;br /&gt;
&lt;br /&gt;
Generally the easiest way to accomplish the correct layout is to create HTML elements that &amp;quot;contain&amp;quot; the top and bottom screens. Here&#039;s an example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=400, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;style&amp;gt;&lt;br /&gt;
       body { margin: 0px; }&lt;br /&gt;
       #topscreen { width: 400px; height: 215px; overflow: hidden; background-color: red; }&lt;br /&gt;
       #bottomscreen { width: 320px; height: 212px; overflow: hidden; background-color: blue; margin: 0 40px 28px; }&lt;br /&gt;
     &amp;lt;/style&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;amp;lt;div id=&amp;quot;topscreen&amp;quot;&amp;gt;Top Screen&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;amp;lt;div id=&amp;quot;bottomscreen&amp;quot;&amp;gt;Bottom Screen&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scheme allows the page to be easily manipulated through JavaScript.  In order to have the window snap to the correct position, use the following JavaScript code:&lt;br /&gt;
&lt;br /&gt;
 window.setInterval(function() {&lt;br /&gt;
     window.scrollTo(40, 215);&lt;br /&gt;
 }, 0);&lt;br /&gt;
&lt;br /&gt;
This automatically resets the position if the user accidentally scrolls the page. Zooming should probably also be disabled by adding &amp;lt;code&amp;gt;user-scalable=no&amp;lt;/code&amp;gt; to the &amp;lt;meta&amp;gt; viewport element, though this will only have an effect in the New3DS browser.&lt;br /&gt;
&lt;br /&gt;
==Example Sites==&lt;br /&gt;
&amp;lt;!-- If you have a website that demonstrates these techniques, place it here! --&amp;gt;&lt;br /&gt;
* [http://www.nintendo.com/3ds/internetbrowser/bookmarks Nintendo 3DS Bookmarks]: This is the first bookmark pre-installed in the browser.&lt;br /&gt;
* [http://theimageshare.com ImageShare]: Image uploader for the 3DS ([https://github.com/corbindavenport/imageshare source code])&lt;br /&gt;
* [http://3ds.andysmith.co.uk/jFox.html jFox] (Short URL: http://bit.ly/iB7FqW)&lt;br /&gt;
* [http://ditto3d.com/3ds Ditto3D (Dead Link)] (Short URL: http://bit.ly/oVreWA)&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Internet_Browser&amp;diff=23698</id>
		<title>Internet Browser</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Internet_Browser&amp;diff=23698"/>
		<updated>2025-09-21T03:03:23Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: add version and user-agent for 11.15(-11.17)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The 3DS Internet Browser was added in the June 2011 Update for JPN/EUR/USA.&lt;br /&gt;
&lt;br /&gt;
From the Internet Browser help section:&lt;br /&gt;
In compliance with the LGPL, the source code of the OSS is available via the Nintendo website.&lt;br /&gt;
This source code can be downloaded here:&lt;br /&gt;
[http://mediacontent.nintendo-europe.com/NOE/images/service/OpenSources.zip] [http://www.nintendo.co.jp/support/oss/index.html]&lt;br /&gt;
&lt;br /&gt;
The 3DS Internet Browser is [http://en.wikipedia.org/wiki/Netfront Netfront] Browser NX v1.0 based on [http://en.wikipedia.org/wiki/WebKit WebKit] engine.&lt;br /&gt;
&lt;br /&gt;
On O3DS the exheader name of this title is &amp;quot;SPIDER&amp;quot;; on N3DS, &amp;quot;SKATER&amp;quot;.&lt;br /&gt;
The only difference between the ExeFS .code for each region of the Old3DS/New3DS browser, is byte values for the title uniqueID/region.&lt;br /&gt;
&lt;br /&gt;
A [[#Dummy_web-browser|&amp;quot;dummy&amp;quot; browser]] (which replaces the actual browser) is being included with cartdrige games shipping with system updates starting with [[9.9.0-26|9.9.0-X]]. &lt;br /&gt;
In addition, versions of the real browser since 9.9.0-26X attempt to [[#Forced_system-update|check-in with a Nintendo server]] to determine if the existing browser version is out of date.&lt;br /&gt;
&lt;br /&gt;
==[[New 3DS]] Internet Browser==&lt;br /&gt;
New3DS has a separate browser title, with the exheader name &amp;quot;SKATER&amp;quot;.&lt;br /&gt;
Unlike the Old3DS browser, the New3DS browser has videos+HTML5 support. &lt;br /&gt;
&lt;br /&gt;
This browser also has a filter enabled by default in the JPN version. &lt;br /&gt;
Disabling it requires paying money with a credit-card, for [[NIM_Services|purchasing]] web-browser [[Title_list/DLC|DLC]].&lt;br /&gt;
During startup the browser does various HTTPS comms. When visting an URL, the browser sends a plaintext HTTP POST here: [http://ars.ifuser.jp:20080/ars2/rating]. The raw POST data begins with &amp;quot;ARS/2.0\r\n\x00&amp;quot;, the rest appears to be encrypted. The server reply content also has this ARS header + encrypted data. This appears to use a fixed xorpad, likely from a fixed encryption CTR/IV. The server content responses for allowed sites, and blocked sites, are fixed. When the server returns that the site is blocked, the browser goes to this page: [http://ars.ifuser.jp/filter/44.html](the Referrer header value is set to the same URL it&#039;s actually requesting).&lt;br /&gt;
&lt;br /&gt;
The WebKit source was updated since the Old3DS browser.&lt;br /&gt;
The New3DS browser uses the following services: [[MVD_Services|mvd:STD]] and [[IR_Services|ir:rst]](DLC-related services are used too but those aren&#039;t New3DS specific).&lt;br /&gt;
Video decoding is done with [[MVD_Services|mvd:STD]]. Audio decoding/playback is done with a browser-specific DSP binary. The Old3DS browser used CSND for audio playback, the New3DS browser doesn&#039;t have access to that at all since it uses DSP instead.&lt;br /&gt;
&lt;br /&gt;
=== Video / libstagefright ===&lt;br /&gt;
The browser manual includes licenses for Android and PacketVideo. The browser uses libstagefright from Android. Just like WebKit, the browser appears to use a very old version of libstagefright with security/other changes back-ported(for example, the v10.7 browser libstagefright codebase seems to be older than [https://android.googlesource.com/platform/frameworks/av/+/ec77122351b4e78c1fe5b60a208f76baf8c67591%5E%21/media/libstagefright/MPEG4Extractor.cpp this]). This codebase is missing certain chunk-parsing code for 3GP.&lt;br /&gt;
&lt;br /&gt;
HTTP for libstagefright is internally handled with [[HTTP_Services|HTTPC]], with a similar(?) set of RootCAs as for browser-version-check.&lt;br /&gt;
&lt;br /&gt;
===User-Agent and Browser Versions===&lt;br /&gt;
Normal user-agent format: &amp;lt;code style=&amp;quot;font-size:larger;&amp;quot;&amp;gt;Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/&amp;lt;WebKit version&amp;gt; (KHTML, like Gecko) NX/&amp;lt;Netfront version&amp;gt; Mobile NintendoBrowser/&amp;lt;Mobile NintendoBrowser version&amp;gt;.&amp;lt;region&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;region&amp;gt; can be one of the following: &amp;quot;JP&amp;quot;, &amp;quot;US&amp;quot;, or &amp;quot;EU&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mobile User-Agent is always &amp;lt;code&amp;gt;Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mobile NintendoBrowser version(displayed in browser settings)&lt;br /&gt;
! Normal UA&lt;br /&gt;
! CDN Title-version&lt;br /&gt;
! Network-only system-update version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.9934&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.8 Mobile NintendoBrowser/1.0.9934.&amp;lt;region&amp;gt;&lt;br /&gt;
| v10&lt;br /&gt;
| [[9.0.0-20]]&lt;br /&gt;
| Initial version.&lt;br /&gt;
|-&lt;br /&gt;
| 1.1.9996&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.10 Mobile NintendoBrowser/1.1.9996.&amp;lt;region&amp;gt;&lt;br /&gt;
| v1027&lt;br /&gt;
| [[9.3.0-21]]&lt;br /&gt;
| See below regarding OSS changes.&lt;br /&gt;
|-&lt;br /&gt;
| 1.2.10085&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.13 Mobile NintendoBrowser/1.2.10085.&amp;lt;region&amp;gt;&lt;br /&gt;
| v2051&lt;br /&gt;
| [[9.6.0-24]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v3075&lt;br /&gt;
| v9.9 CUP&lt;br /&gt;
| v9.9 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.3.10126&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.15 Mobile NintendoBrowser/1.3.10126.&amp;lt;region&amp;gt;&lt;br /&gt;
| v3077&lt;br /&gt;
| [[9.9.0-26]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.4.10138&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.17 Mobile NintendoBrowser/1.4.10138.&amp;lt;region&amp;gt;&lt;br /&gt;
| v4096&lt;br /&gt;
| [[10.2.0-28]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.5.10143&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.5.10143.&amp;lt;region&amp;gt;&lt;br /&gt;
| v5121&lt;br /&gt;
| [[10.4.0-29]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.6.10147&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.6.10147.&amp;lt;region&amp;gt;&lt;br /&gt;
| v6144&lt;br /&gt;
| [[10.6.0-31]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v7168&lt;br /&gt;
| v10.7 CUP&lt;br /&gt;
| v10.7 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7.10150&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.19 Mobile NintendoBrowser/1.7.10150.&amp;lt;region&amp;gt;&lt;br /&gt;
| v7184&lt;br /&gt;
| [[10.7.0-32]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.8.10156&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.20 Mobile NintendoBrowser/1.8.10156.&amp;lt;region&amp;gt;&lt;br /&gt;
| v8192&lt;br /&gt;
| [[11.1.0-34]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| v9217&lt;br /&gt;
| v11.4 CUP&lt;br /&gt;
| v11.4 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.9.10160&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.20 Mobile NintendoBrowser/1.9.10160.&amp;lt;region&amp;gt;&lt;br /&gt;
| v9232&lt;br /&gt;
| [[11.4.0-37]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.10.10166&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.22 Mobile NintendoBrowser/1.10.10166.&amp;lt;region&amp;gt;&lt;br /&gt;
| v10272&lt;br /&gt;
| [[11.9.0-42]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.11.10172&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.23 Mobile NintendoBrowser/1.11.10172.&amp;lt;region&amp;gt;&lt;br /&gt;
| v11264&lt;br /&gt;
| [[11.14.0-46]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.12.10178&lt;br /&gt;
| Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.24 Mobile NintendoBrowser/1.12.10178.&amp;lt;region&amp;gt;&lt;br /&gt;
| v12289&lt;br /&gt;
| [[11.15.0-47]]&lt;br /&gt;
| See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that the latest Old3DS browser WebKit version at the time the initial New3DS browser was released, was the following: 532.8.&lt;br /&gt;
&lt;br /&gt;
The first version of the KOR New3DS browser was v9.6(which was when the New3DS KOR titles were originally added). Each version of the KOR browser has the same NintendoBrowser version as the other regions. The KOR browser has been only updated when the browser for the other regions were updated, hence the title-versions are the same as well. The KOR browser ExeFS .code is different from the other regions(more than just region-related IDs etc).&lt;br /&gt;
&lt;br /&gt;
==== OSS 9.0 and 9.3 diff ====&lt;br /&gt;
The following is a diff of the OSS archives from [http://www.nintendo.co.jp/support/oss/index.html here], for v9.0 and v9.3.&lt;br /&gt;
&lt;br /&gt;
 Files NewNintendo3DS_OpenSources9.0.0-/WKC/WebCore/platform/network/WKC/ResourceHandleManagerWKC.cpp and NewNintendo3DS_OpenSources9.3.0-/WKC/WebCore/platform/network/WKC/ResourceHandleManagerWKC.cpp differ&lt;br /&gt;
 Files NewNintendo3DS_OpenSources9.0.0-/WKC/WebKit/WKC/webkit/WKCVersion.h and NewNintendo3DS_OpenSources9.3.0-/WKC/WebKit/WKC/webkit/WKCVersion.h differ&lt;br /&gt;
&lt;br /&gt;
WKC_CUSTOMER_RELEASE_VERSION was changed from &amp;quot;0.5.8&amp;quot; to &amp;quot;0.5.10&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The following code was added to ResourceHandleManager::doRedirect(): curl_easy_setopt(d-&amp;gt;m_handle, CURLOPT_SHARE, 0);&lt;br /&gt;
&lt;br /&gt;
==== v9.6 ====&lt;br /&gt;
WebKit/OSS code was actually updated.&lt;br /&gt;
ExeFS .code was updated. The following files in RomFS were updated:&lt;br /&gt;
* &amp;quot;/banner/CN/Skater.icn&amp;quot; and &amp;quot;/banner/KR/Skater.icn&amp;quot;.&lt;br /&gt;
* &amp;quot;/browser/rootca.pem&amp;quot;&lt;br /&gt;
* &amp;quot;/build/buildinfo.dat&amp;quot;&lt;br /&gt;
* &amp;quot;/cairo.cro.lex&amp;quot; and &amp;quot;/.crr/static.crr&amp;quot;&lt;br /&gt;
* &amp;quot;/lyt/Button/ButtonSelectHSearch.arc&amp;quot;&lt;br /&gt;
* &amp;quot;/lyt/Kbd/Swkbd.arc&amp;quot;&lt;br /&gt;
* &amp;quot;lyt/Kbd.arc&amp;quot;&lt;br /&gt;
* &amp;quot;skater.msbt&amp;quot; under all of the &amp;quot;/message/&amp;lt;region&amp;gt;_&amp;lt;language&amp;gt;/&amp;quot; directories.&lt;br /&gt;
* &amp;quot;/oss.cro.lex&amp;quot;, &amp;quot;/peer.cro.lex&amp;quot;, &amp;quot;/static.crs&amp;quot;, and &amp;quot;/webkit.cro.lex&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The following was added to RomFS:&lt;br /&gt;
* &amp;quot;/favicon/naver.dat&amp;quot;&lt;br /&gt;
* A &amp;quot;KO&amp;quot; directory under &amp;quot;/iwnn&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== v9.9 ====&lt;br /&gt;
ExeFS:/.code was updated.&lt;br /&gt;
&lt;br /&gt;
The only RomFS changes is file-updating, all of the following files were updated:&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /cairo.cro.lex&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex&lt;br /&gt;
 /peer.cro.lex&lt;br /&gt;
 /static.crs&lt;br /&gt;
 /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
See [https://gist.github.com/yellows8/9fb509fde4112339f342 here] for a diff of the OSS(WebKitLibraries/ is not included due to the massive cairo library diff). An exploitable security vuln(which was already known in the context of 3DS webkit) was fixed. [[User:Yellows8|Yellows8]]&#039; private(at the time of writing) exploit for it is based on the PoC from [http://pastebin.com/ufBCQKda here](see the pastebin for the actual pastebin author).&lt;br /&gt;
&lt;br /&gt;
==== v10.2 ====&lt;br /&gt;
The libstagefright build in the main SKATER codebin was updated to a version which fixed libstagefright vuln(s): the vuln used in [[browserhax|browserhax_fright]] at the time of sysupdate release was fixed. The *only* code changed in the main codebin, was code related to libstagefright.&lt;br /&gt;
&lt;br /&gt;
The only RomFS changes is file-updating, all of the following files were updated(see the forced-sysupdate section regarding what changed in the message files):&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex&lt;br /&gt;
 /static.crs&lt;br /&gt;
 /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
OSS diff:&lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/WKC/WebKit/WKC/webkit/WKCVersion.h b/NewNintendo3DS_OpenSources10.2.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index 4543297..0860336 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;0.5.15&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;0.5.17&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;536.30&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/ChangeLog b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 index a5abb35..cf5a9fa 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/ChangeLog&lt;br /&gt;
 @@ -1,3 +1,12 @@&lt;br /&gt;
 +2013-11-05  Ryosuke Niwa  &amp;lt;rniwa@webkit.org&amp;gt;&lt;br /&gt;
 +&lt;br /&gt;
 +        Use-after-free in SliderThumbElement::dragFrom&lt;br /&gt;
 +        https://bugs.webkit.org/show_bug.cgi?id=123873&lt;br /&gt;
 +&lt;br /&gt;
 +        Reviewed by Andreas Kling.&lt;br /&gt;
 +&lt;br /&gt;
 +        Merge https://chromium.googlesource.com/chromium/blink/+/04a23bfca2d04101a1828d36ff36c29f3a24f34b&lt;br /&gt;
 +&lt;br /&gt;
  2015-02-06  Maciej Stachowiak  &amp;lt;mjs@apple.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
          REGRESSION(r179706): Caused memory corruption on some tests (Requested by _ap_ on #webkit).&lt;br /&gt;
 @@ -879,7 +888,7 @@&lt;br /&gt;
          * rendering/RenderLineBoxList.cpp:&lt;br /&gt;
          (WebCore::RenderLineBoxList::dirtyLinesFromChangedChild):&lt;br /&gt;
  &lt;br /&gt;
 -2014-01-21  LÃ¡szlÃ³ LangÃ³  &amp;lt;llango.u-szeged@partner.samsung.com&amp;gt;&lt;br /&gt;
 +2014-01-21  Laszlo Lango  &amp;lt;llango.u-szeged@partner.samsung.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
          Assertion failure in Range::nodeWillBeRemoved&lt;br /&gt;
          https://bugs.webkit.org/show_bug.cgi?id=121694&lt;br /&gt;
 @@ -1879,7 +1888,7 @@&lt;br /&gt;
  &lt;br /&gt;
  2012-09-14  Simon Fraser  &amp;lt;simon.fraser@apple.com&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 -        REGRESSION: transition doesnât always override transition-property&lt;br /&gt;
 +        REGRESSION: transition doesnft always override transition-property&lt;br /&gt;
          https://bugs.webkit.org/show_bug.cgi?id=96658&lt;br /&gt;
  &lt;br /&gt;
          Reviewed by Dean Jackson.&lt;br /&gt;
 @@ -3691,8 +3700,8 @@&lt;br /&gt;
              glyph with font data for the primary font, presumably to meet the SVG&lt;br /&gt;
              spec requirement: &amp;quot;If the references to alternate glyphs do not result&lt;br /&gt;
              in successful identification of alternate glyphs to use, then the&lt;br /&gt;
 -            character(s) that are inside of the çª¶åltGlyphçª¶?element are rendered as&lt;br /&gt;
 -            if the çª¶åltGlyphçª¶?element were a çª¶?spançª¶?element instead.&amp;quot;&lt;br /&gt;
 +            character(s) that are inside of the âaltGlyphâ?element are rendered as&lt;br /&gt;
 +            if the âaltGlyphâ?element were a â?spanâ?element instead.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
              If the alt glyph is not then found we are in the case from the spec&lt;br /&gt;
              and indeed we should use the primary font. However, we end up replacing the GlyphPage&lt;br /&gt;
 diff --git a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/html/RangeInputType.cpp b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 index 484adec..d7e9e8d 100644&lt;br /&gt;
 --- a/NewNintendo3DS_OpenSources9.9.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 +++ b/NewNintendo3DS_OpenSources10.2.0-/webkit/WebCore/html/RangeInputType.cpp&lt;br /&gt;
 @@ -164,7 +164,7 @@ void RangeInputType::handleMouseDownEvent(MouseEvent* event)&lt;br /&gt;
      ASSERT(element()-&amp;gt;hasShadowRoot());&lt;br /&gt;
      if (targetNode != element() &amp;amp;&amp;amp; !targetNode-&amp;gt;isDescendantOf(element()-&amp;gt;shadowTree()-&amp;gt;oldestShadowRoot()))&lt;br /&gt;
          return;&lt;br /&gt;
 -    SliderThumbElement* thumb = sliderThumbElementOf(element());&lt;br /&gt;
 +    RefPtr&amp;lt;SliderThumbElement&amp;gt; thumb = sliderThumbElementOf(element());&lt;br /&gt;
      if (targetNode == thumb)&lt;br /&gt;
          return;&lt;br /&gt;
      thumb-&amp;gt;dragFrom(event-&amp;gt;absoluteLocation());&lt;br /&gt;
&lt;br /&gt;
==== v10.4 ====&lt;br /&gt;
The ExeFS codebin was updated, the only change was that the following code was updated in the actual NupCheck HTTPS request function:&lt;br /&gt;
* Previous version: sprintf(out, &amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/2/%s&amp;quot;, region);&lt;br /&gt;
* Current  version: sprintf(out, &amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/%d/%s&amp;quot;, 3, region);&lt;br /&gt;
&lt;br /&gt;
libpng was updated from version 1.5.21 to 1.5.24.&lt;br /&gt;
&lt;br /&gt;
The following RomFS files were updated(see the forced-sysupdate section regarding what changed in the message files):&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /cairo.cro.lex&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/skater.msbt&lt;br /&gt;
 /message/EU_Dutch/skater.msbt&lt;br /&gt;
 /message/EU_English/skater.msbt&lt;br /&gt;
 /message/EU_French/skater.msbt&lt;br /&gt;
 /message/EU_German/skater.msbt&lt;br /&gt;
 /message/EU_Italian/skater.msbt&lt;br /&gt;
 /message/EU_Portuguese/skater.msbt&lt;br /&gt;
 /message/EU_Russian/skater.msbt&lt;br /&gt;
 /message/EU_Spanish/skater.msbt&lt;br /&gt;
 /message/JP_Japanese/skater.msbt&lt;br /&gt;
 /message/KR_Hangeul/skater.msbt&lt;br /&gt;
 /message/TW_English/skater.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/skater.msbt&lt;br /&gt;
 /message/US_English/skater.msbt&lt;br /&gt;
 /message/US_French/skater.msbt&lt;br /&gt;
 /message/US_Portuguese/skater.msbt&lt;br /&gt;
 /message/US_Spanish/skater.msbt&lt;br /&gt;
 /oss.cro.lex differ&lt;br /&gt;
 /peer.cro.lex differ&lt;br /&gt;
 /static.crs differ&lt;br /&gt;
 /webkit.cro.lex differ&lt;br /&gt;
&lt;br /&gt;
==== v10.6 ====&lt;br /&gt;
The ExeFS codebin was updated.&lt;br /&gt;
&lt;br /&gt;
[[browserhax|browserhax_fright_tx3g]] was fixed. The code handling tx3g now matches the latest libstagefright git.&lt;br /&gt;
&lt;br /&gt;
Hence the below RomFS listing, no OSS was updated at all(besides libstagefright mentioned above).&lt;br /&gt;
&lt;br /&gt;
The following RomFS files were updated:&lt;br /&gt;
 /build/buildinfo.dat&lt;br /&gt;
 /static.crs&lt;br /&gt;
&lt;br /&gt;
==== v10.7 ====&lt;br /&gt;
Basically the same changes as Old3DS v10.7, except with the usual buildinfo.dat update in RomFS. The below date is 6 days after the browser-version-check [[3DS_Userland_Flaws|bypass]] was publicly disclosed.&lt;br /&gt;
&lt;br /&gt;
 cat v7184/00000025_romfs/build/buildinfo.dat&lt;br /&gt;
 10150&lt;br /&gt;
 applet&lt;br /&gt;
 2016-03-02 18:25&lt;br /&gt;
&lt;br /&gt;
==== v11.1 ====&lt;br /&gt;
The ExeFS codebin was updated. The following files in RomFS were updated:&lt;br /&gt;
&lt;br /&gt;
  /build/buildinfo.dat&lt;br /&gt;
  /.crr/static.crr&lt;br /&gt;
  /oss.cro.lex&lt;br /&gt;
  /static.crs&lt;br /&gt;
  /webkit.cro.lex&lt;br /&gt;
&lt;br /&gt;
  cat v8192/00000026_romfs/build/buildinfo.dat&lt;br /&gt;
  10156&lt;br /&gt;
  applet&lt;br /&gt;
  2016-08-26 19:47&lt;br /&gt;
&lt;br /&gt;
Minus the 4 functions that changed due to compiler optimization, only 1 function was actually updated. This is LT_1a4004, previous version at LT_1a4004: libstagefright status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth)&lt;br /&gt;
&lt;br /&gt;
Additional code was added which doesn&#039;t seem to be from upstream git, right [https://android.googlesource.com/platform/frameworks/av/+/32d6e5f0ebe9e00f80401e5f4fd6e285a474590d/media/libstagefright/MPEG4Extractor.cpp#880 before] the cprt code block: &amp;quot;if((*offset + chunk_size) - data_offset &amp;lt; 0)fail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This fixed skater31hax + any other mp4 haxx which requires using a negative 64bit chunk_size value.&lt;br /&gt;
&lt;br /&gt;
The filepath base used in the assert strings were changed from &amp;quot;d:\Jenkins\workspace\MPSkaterBuild\MVPlayer\Skater\Base\Android\frameworks\base\media\libstagefright\&amp;quot; to &amp;quot;d:\jenkins\workspace\MPSkaterBuild-Git\Base\Android\frameworks\base\media\libstagefright\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== v11.4 ====&lt;br /&gt;
The only changes in RomFS was for &amp;quot;/build/buildinfo.dat&amp;quot; and &amp;quot;/static.crs&amp;quot;, hence no OSS in CRO(s) were updated.&lt;br /&gt;
&lt;br /&gt;
The main codebin was updated. Exactly two functions were updated, these are not related to code exec vulns.&lt;br /&gt;
&lt;br /&gt;
  cat v9232/00000027_romfs/build/buildinfo.dat&lt;br /&gt;
  10160&lt;br /&gt;
  applet&lt;br /&gt;
  2017-03-08 19:44&lt;br /&gt;
&lt;br /&gt;
=== New3DS Browser Specifications ===&lt;br /&gt;
[http://www.nintendo.co.jp/3ds/new/features/modal_net.html]&lt;br /&gt;
&lt;br /&gt;
English version:&lt;br /&gt;
* &amp;quot;Browser engine: NetFront® Browser NX v3.0&amp;quot;&lt;br /&gt;
* &amp;quot;User agent: Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML and like Gecko) NX/3.0.*.*.* Mobile NintendoBrowser/1.0.**** JP&lt;br /&gt;
* ** Version information is stated.&lt;br /&gt;
* *** When using the “Mobile version request” function, it differs from the above-mentioned character string&amp;quot;&lt;br /&gt;
* &amp;quot;Supported protocols: HTTP1.0/HTTP1.1/SSL3.0/TLS1.0/TLS1.1/TLS1.2&amp;quot;&lt;br /&gt;
* &amp;quot;Web standard: HTML4.01 / HTML5 / XHTML1.1 / Fullscreen API / Gamepad API / SVG / WebSocket / Video Subtitle / WOFF / Web Messaging / Server-Sent / Web Storage (partial) / XMLHttpRequest / Canvas element / Video / DOM Levels 1-3 / ECMAScript / CSS1 / CSS2.1 / CSS3 (partial)&amp;quot;&lt;br /&gt;
* &amp;quot;Image format: bmp / ​​gif / ico / jpeg / png / svg (There are, however, possibilities that some images won&#039;t display.)&amp;quot;&lt;br /&gt;
* &amp;quot;Image preview: mpo / jpeg (There are, however, possibilities that some images won&#039;t display.)&amp;quot;&lt;br /&gt;
* &amp;quot;Video format: MP4, M3U8 + TS (HTTPLiveStreaming) (There are, however, some videos that may not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Video codec: H.264 - MPEG-4 AVC Video (max 854x480 at level 3.2, 3D compatible) (There are, however, some videos that can not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Audio codec: AAC - ISO / IEC 14496-3 MPEG-4AAC, MP3 (There are, however, some videos that can not be played.)&amp;quot;&lt;br /&gt;
* &amp;quot;Format for uploading 3D videos: .mkv (In order to be played, videos must be converted to the appropriate format within the site you are uploading to. In some cases, the video will not play even if converted.)&amp;quot;&lt;br /&gt;
* &amp;quot;Plug-ins: Plug-ins such as Adobe Flash are not supported&amp;quot;&lt;br /&gt;
* &amp;quot;Active Rating System filtering: provided by Digital Arts, Inc.. Access to web content can be limited based on its category information, restricting access to web content that may result inappropriate.&amp;quot;&lt;br /&gt;
* &amp;quot;Websites can be requested to provide the mobile version (However, if the web page does not have a mobile version, it won&#039;t change the way it&#039;s displayed.)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MJPEG + .avi is also supported.&lt;br /&gt;
&lt;br /&gt;
==== Gamepad ====&lt;br /&gt;
The browser&#039;s now-outdated gamepad API provides information about the states of the circle pad, C-stick, and every button aside from the Home and Power buttons. The gamepad, which has an ID of &amp;lt;code&amp;gt;New Nintendo 3DS Controller&amp;lt;/code&amp;gt;, is contained within the array returned by the &amp;lt;code&amp;gt;navigator.webkitGetGamepads&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
Both of the gamepad&#039;s arrays, which contain the states of various inputs, seem to be reconstructed each time they are accessed via their gamepad object. It is not known if the values within the arrays can update upon each access of the array, but the values &amp;lt;em&amp;gt;can&amp;lt;/em&amp;gt; update frequently enough to obtain accurate readings of the system&#039;s controls.&lt;br /&gt;
&lt;br /&gt;
===== Axes =====&lt;br /&gt;
The gamepad&#039;s &amp;lt;code&amp;gt;axes&amp;lt;/code&amp;gt; array contains four floating-point numbers in the following order:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Index !! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Circle pad X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Circle pad Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || C-stick X&lt;br /&gt;
|-&lt;br /&gt;
| 3 || C-stick Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each coordinate ranges from -1.0 (left/up) to 1.0 (right/down). Neutral position is indicated by 0.0. Drift and/or inaccurate calibration may make these exact values unattainable.&lt;br /&gt;
&lt;br /&gt;
===== Buttons =====&lt;br /&gt;
The gamepad&#039;s &amp;lt;code&amp;gt;buttons&amp;lt;/code&amp;gt; array contains numbers for the following numbers:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Index !! Button &lt;br /&gt;
|-&lt;br /&gt;
| 0 || B&lt;br /&gt;
|-&lt;br /&gt;
| 1 || A&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y&lt;br /&gt;
|-&lt;br /&gt;
| 3 || X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || L&lt;br /&gt;
|-&lt;br /&gt;
| 5 || R&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ZL&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ZR&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Select&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Start&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Unused&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Unused&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Down&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Left&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each button&#039;s value is 0 while the button is not pressed, and 1 while the button is pressed.&lt;br /&gt;
&lt;br /&gt;
Based on the Gamepad API&#039;s specifications, buttons 10 and 11 are reserved for left stick presses and right stick presses respectively, which the 3DS does not support.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
* Viewport information can be specified with the &amp;lt;meta&amp;gt; element.&lt;br /&gt;
* The html &amp;quot;color&amp;quot; &amp;lt;input&amp;gt; type is not supported.&lt;br /&gt;
* 3D images appear as their right-eye image within webpages.&lt;br /&gt;
* Webpages are locked to the bottom screen when zooming is disabled, the webpage&#039;s initial scale is 1, and the entire webpage can fit within the bottom screen&#039;s dimensions (320x212).&lt;br /&gt;
* Interactable elements that are positioned partially outside of the bottom screen can temporarily be moved further inside the bottom screen by tapping them with the touchscreen.&lt;br /&gt;
* Favicons can be changed using Javascript, but they become unchangeable once the document&#039;s &amp;lt;em&amp;gt;readystatechange&amp;lt;/em&amp;gt; event finishes firing with a ready state of &amp;quot;complete&amp;quot;.&lt;br /&gt;
* Focusing on text-editable elements via Javascript will always open the keyboard.&lt;br /&gt;
* Webpage content is usually rendered at 30 FPS despite the &amp;lt;code&amp;gt;webkitRequestAnimationFrame&amp;lt;/code&amp;gt; function allowing code to run at a rate of 60 FPS.&lt;br /&gt;
** As a result, display-related routines may only show half of their intended updates.&lt;br /&gt;
** This issue can be mitigated by rendering on every other frame. However, various factors (such as touchscreen input and sleep mode) make this fairly inconsistent.&lt;br /&gt;
&lt;br /&gt;
== Old3DS browser ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Old3DS Browser Specifications ===&lt;br /&gt;
* &amp;quot;Browser engine: NetFront® Browser&amp;quot;&lt;br /&gt;
* &amp;quot;User agent: Mozilla/5.0 (Nintendo 3DS; region; ; en) Version/1.7498.US&amp;quot;&lt;br /&gt;
* &amp;quot;Supported protocols: HTTP1.0/HTTP1.1/SSLv3/TLS1.0&amp;quot;&lt;br /&gt;
* &amp;quot;Web standard: HTML 4.01/XHTML 1.1/CSS 1/CSS 2.1/CSS 3 (partial functionality)/DOM Levels 1-3/ECMAScript/XMLHttpRequest/Canvas Element (partial functionality)&amp;quot;&lt;br /&gt;
* &amp;quot;Image format: MPO / GIF / JPEG / PNG / BMP / ICO (some images cannot be displayed)&amp;quot;&lt;br /&gt;
* &amp;quot;Plug-ins: Plug-ins such as Adobe Flash are not supported&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Old3DS browser doesn&#039;t support events &amp;quot;focusin&amp;quot; and &amp;quot;focusout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== User-Agent and Browser Versions ===&lt;br /&gt;
User-agent format: &amp;lt;code style=&amp;quot;font-size:larger;&amp;quot;&amp;gt;Mozilla/5.0 (Nintendo 3DS; U; ; &amp;lt;lang&amp;gt;) Version/&amp;lt;version&amp;gt;.&amp;lt;region&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lang&amp;gt; is &amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;, etc. &amp;lt;region&amp;gt; is &amp;quot;US&amp;quot;, &amp;quot;EU&amp;quot;, etc. See below for &amp;lt;version&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser version&lt;br /&gt;
! CDN Title-version&lt;br /&gt;
! Network-only system-update version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1.7412&lt;br /&gt;
| v6&lt;br /&gt;
| [[2.0.0-2|2.0.0-2]]&lt;br /&gt;
| This was the initial version.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7455&lt;br /&gt;
| v1024&lt;br /&gt;
| [[2.1.0-4]]&lt;br /&gt;
| ExeFS .code was updated, both of the CROs(webkit/OSS) were updated too.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7498&lt;br /&gt;
| v2050&lt;br /&gt;
| [[4.0.0-7]]&lt;br /&gt;
| ExeFS .code was updated, both of the CROs(webkit/OSS) were updated too. The manual CFA was updated as well.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7538&lt;br /&gt;
| v0&lt;br /&gt;
| [[4.2.0-9]]&lt;br /&gt;
| First version of the KOR browser. The CROs are different from the  USA/EUR/JPN [[4.0.0-7]] browser.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7552&lt;br /&gt;
| v3075&lt;br /&gt;
| [[5.0.0-11]]&lt;br /&gt;
| ExeFS .code and icon were updated, both of the CROs(webkit/OSS) were updated too. The manual CFA was updated as well.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7552&lt;br /&gt;
| v3088&lt;br /&gt;
| [[7.0.0-13]]&lt;br /&gt;
| The main NCCH wasn&#039;t updated at all(same TMD contentID/content-hash as the previous version), only the manual CFA for this title was updated.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7567&lt;br /&gt;
| v4096&lt;br /&gt;
| [[7.1.0-16]]&lt;br /&gt;
| The CXI .code was updated, some data in the RomFS was updated(none of the CROs such as webkit.cro were updated). The manual CFA was updated too.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7585&lt;br /&gt;
| v5121&lt;br /&gt;
| [[9.5.0-23]]&lt;br /&gt;
| The CXI .code was updated, and the manual CFA was updated. RomFS changes:&lt;br /&gt;
* &amp;quot;/browser/rootca.pem&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/oss.cro&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/static.crs&amp;quot; updated&lt;br /&gt;
* &amp;quot;/cro/webkit.cro&amp;quot; updated&lt;br /&gt;
* &amp;quot;/.crr/static.crr&amp;quot; updated&lt;br /&gt;
* &amp;quot;/layout/dialogheader/WirelessSwitchOff.arc&amp;quot; was removed&lt;br /&gt;
* &amp;quot;/layout/favorite/favicondata/KOR.arc&amp;quot; updated&lt;br /&gt;
&lt;br /&gt;
A vuln used in a public(at the time of this sysupdate) webkit exploit for spider was fixed, which also fixed the removewinframe exploit from [https://github.com/yellows8/3ds_webkithax here].&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| v6147&lt;br /&gt;
| v9.9 CUP&lt;br /&gt;
| v9.9 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7610&lt;br /&gt;
| v6149&lt;br /&gt;
| [[9.9.0-26]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7616&lt;br /&gt;
| v7168&lt;br /&gt;
| [[10.2.0-28]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7622&lt;br /&gt;
| v8192&lt;br /&gt;
| [[10.6.0-31]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| v9216&lt;br /&gt;
| v10.7 CUP&lt;br /&gt;
| v10.7 CUP dummy web-browser, see below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7625&lt;br /&gt;
| v9232&lt;br /&gt;
| [[10.7.0-32]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7630&lt;br /&gt;
| v10240&lt;br /&gt;
| [[11.1.0-34]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7636&lt;br /&gt;
| v11297&lt;br /&gt;
| [[11.9.0-42]]&lt;br /&gt;
| See below.&lt;br /&gt;
|-&lt;br /&gt;
| 1.7642&lt;br /&gt;
| v13313&lt;br /&gt;
| [[11.15.0-47]]&lt;br /&gt;
| See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
The USA/EUR/JPN + KOR browser allocates the 0x08000000 heap with size 0x01A97000. The size used by the CHN and TWN browser is 0x01997000, exactly 0x100000-bytes smaller.&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v9.9 ===&lt;br /&gt;
ExeFS:/.code was updated.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS were file-updating, the following files were updated:&lt;br /&gt;
 /browser/rootca.pem&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /message/CN_Simp_Chinese/spider.msbt&lt;br /&gt;
 /message/EU_Dutch/spider.msbt&lt;br /&gt;
 /message/EU_English/spider.msbt&lt;br /&gt;
 /message/EU_French/spider.msbt&lt;br /&gt;
 /message/EU_German/spider.msbt&lt;br /&gt;
 /message/EU_Italian/spider.msbt&lt;br /&gt;
 /message/EU_Portuguese/spider.msbt&lt;br /&gt;
 /message/EU_Russian/spider.msbt&lt;br /&gt;
 /message/EU_Spanish/spider.msbt&lt;br /&gt;
 /message/JP_Japanese/spider.msbt&lt;br /&gt;
 /message/KR_Hangeul/spider.msbt&lt;br /&gt;
 /message/TW_English/spider.msbt&lt;br /&gt;
 /message/TW_Trad_Chinese/spider.msbt&lt;br /&gt;
 /message/US_English/spider.msbt&lt;br /&gt;
 /message/US_French/spider.msbt&lt;br /&gt;
 /message/US_Portuguese/spider.msbt&lt;br /&gt;
 /message/US_Spanish/spider.msbt&lt;br /&gt;
&lt;br /&gt;
OSS diff for v9.5 and v9.9, without the .dox changes:&lt;br /&gt;
&lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/WKC/WebKit/WKC/webkit/WKCVersion.h b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index be5ff09..55a7274 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.14&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.16&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;532.7&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/webkit/WebCore/rendering/RenderBox.cpp b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 index da4127e..d03403e 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.5.0(23J_23U_23E_19K_18T_3C)/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderBox.cpp&lt;br /&gt;
 @@ -305,23 +305,23 @@ int RenderBox::scrollHeight() const&lt;br /&gt;
  &lt;br /&gt;
  int RenderBox::scrollLeft() const&lt;br /&gt;
  {&lt;br /&gt;
 -    return hasOverflowClip() ? layer()-&amp;gt;scrollXOffset() : 0;&lt;br /&gt;
 +    return layer() &amp;amp;&amp;amp; hasOverflowClip() ? layer()-&amp;gt;scrollXOffset() : 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int RenderBox::scrollTop() const&lt;br /&gt;
  {&lt;br /&gt;
 -    return hasOverflowClip() ? layer()-&amp;gt;scrollYOffset() : 0;&lt;br /&gt;
 +    return layer() &amp;amp;&amp;amp; hasOverflowClip() ? layer()-&amp;gt;scrollYOffset() : 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void RenderBox::setScrollLeft(int newLeft)&lt;br /&gt;
  {&lt;br /&gt;
 -    if (hasOverflowClip())&lt;br /&gt;
 +    if (hasOverflowClip() &amp;amp;&amp;amp; layer())&lt;br /&gt;
          layer()-&amp;gt;scrollToXOffset(newLeft);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void RenderBox::setScrollTop(int newTop)&lt;br /&gt;
  {&lt;br /&gt;
 -    if (hasOverflowClip())&lt;br /&gt;
 +    if (hasOverflowClip() &amp;amp;&amp;amp; layer())&lt;br /&gt;
          layer()-&amp;gt;scrollToYOffset(newTop);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.2 ===&lt;br /&gt;
The slider vuln from [https://github.com/yellows8/3ds_webkithax here] was fixed in the Old3DS browser.&lt;br /&gt;
&lt;br /&gt;
The main codebin .text only increased by 0x10-bytes.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS was that the following files were updated:&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
&lt;br /&gt;
OSS diff:&lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 index 55a7274..fc153c4 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/WKC/WebKit/WKC/webkit/WKCVersion.h&lt;br /&gt;
 @@ -29,7 +29,7 @@&lt;br /&gt;
  #define WKC_VERSION_CHECK(major, minor, micro) \&lt;br /&gt;
      (((major)*10000) + ((minor)*100) + (micro)) &amp;gt;= ((WKC_VERSION_MAJOR*10000) + (WKC_VERSION_MINOR*100) + (WKC_VERSION_MICRO))&lt;br /&gt;
  &lt;br /&gt;
 -#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.16&amp;quot;&lt;br /&gt;
 +#define WKC_CUSTOMER_RELEASE_VERSION &amp;quot;1.8.17&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  #define WKC_WEBKIT_VERSION &amp;quot;532.7&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 diff --git a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderSlider.cpp b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 index b2f5cef..1dd3dbd 100644&lt;br /&gt;
 --- a/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_9.9.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 +++ b/3DS_InternetBrowser_OpenSources_JP_US_EU_KR_TW_HK_CN_10.2.0/webkit/WebCore/rendering/RenderSlider.cpp&lt;br /&gt;
 @@ -221,6 +221,7 @@ RenderSlider::~RenderSlider()&lt;br /&gt;
  {&lt;br /&gt;
      if (m_thumb)&lt;br /&gt;
          m_thumb-&amp;gt;detach();&lt;br /&gt;
 +    m_thumb = 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int RenderSlider::baselinePosition(bool, bool) const&lt;br /&gt;
 @@ -493,7 +494,8 @@ void RenderSlider::forwardEvent(Event* event)&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
 -    m_thumb-&amp;gt;defaultEventHandler(event);&lt;br /&gt;
 +    if (m_thumb)&lt;br /&gt;
 +        m_thumb-&amp;gt;defaultEventHandler(event);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  bool RenderSlider::inDragMode() const&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.6 ===&lt;br /&gt;
[[browserhax|spider28hax]] was fixed. The &amp;quot;2^32 characters long string&amp;quot; vuln described [[3DS_Userland_Flaws|here]] was &#039;&#039;finally&#039;&#039; fixed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A lot&#039;&#039; of WebKit issues/vulns were fixed, see [https://gist.github.com/yellows8/b1e10caa1d8bb8a46316 here] for the changes.&lt;br /&gt;
&lt;br /&gt;
libpng was updated from version 1.4.12 to 1.4.19. zlib was updated from 1.2.7 to 1.2.8.&lt;br /&gt;
&lt;br /&gt;
The .text size increased by 0x478-bytes.&lt;br /&gt;
&lt;br /&gt;
The only changes in RomFS was that the following files were updated:&lt;br /&gt;
 /cro/oss.cro&lt;br /&gt;
 /cro/static.crs&lt;br /&gt;
 /cro/webkit.cro&lt;br /&gt;
 /.crr/static.crr&lt;br /&gt;
 /manual/Manual.bcma&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v10.7 ===&lt;br /&gt;
&#039;&#039;Nothing&#039;&#039; changed except some words for version-values in .text being updated(RomFS wasn&#039;t changed), code for browser-version-check was [[#v10.7_2|updated]].&lt;br /&gt;
&lt;br /&gt;
=== Old3DS v11.1 ===&lt;br /&gt;
Nothing changed in the ExeFS codebin besides the usual version values. The following files in RomFS were updated:&lt;br /&gt;
  /cro/oss.cro&lt;br /&gt;
  /cro/webkit.cro&lt;br /&gt;
  /.crr/static.crr&lt;br /&gt;
&lt;br /&gt;
== Forced system-update ==&lt;br /&gt;
The Old3DS/New3DS Internet Browser updated with [[9.9.0-26]] added the following message strings:&lt;br /&gt;
 In order to use the Internet &lt;br /&gt;
 browser, a system update &lt;br /&gt;
 is required.&lt;br /&gt;
 To perform a system update, &lt;br /&gt;
 select System Update from Other&lt;br /&gt;
 Settings in System Settings.&lt;br /&gt;
&lt;br /&gt;
 The Internet browser cannot be&lt;br /&gt;
 used at this time.&lt;br /&gt;
 Please check your network&lt;br /&gt;
 environment or try again later.&lt;br /&gt;
&lt;br /&gt;
For whatever reason, the above &#039;&#039;message strings&#039;&#039; were removed with New3DS-browser v10.2, then re-added with v10.4. This does not apply to the Old3DS browser. Whenever v10.2 New3DS browser tries to use these message-strings for displaying a browser-update-related message, it will crash due to an assert failing since the message-strings are missing. Hence, if/when the v10.2 update-check page is ever updated where the browser tries to display a message for it, or when accessing that page fails, the browser will automatically crash.&lt;br /&gt;
&lt;br /&gt;
This wasn&#039;t enforced(web-browser displaying the above message when the installed browser isn&#039;t the latest version) until October 26, 2015.&lt;br /&gt;
&lt;br /&gt;
This message only triggers when attempting to load a web-page. This is only handled the first time the browser accesses a web-page, during this browser session.&lt;br /&gt;
&lt;br /&gt;
The browser codebins starting with v9.9 now contain the following URL strings:&lt;br /&gt;
* Old3DS: &amp;lt;nowiki&amp;gt;&amp;quot;https://cbvc.cdn.nintendo.net/CTR/1/&amp;lt;region&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* New3DS: &amp;lt;nowiki&amp;gt;&amp;quot;https://cbvc.cdn.nintendo.net/SNAKE/1/&amp;lt;region&amp;gt;&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;region&amp;gt; string is one of the following:&lt;br /&gt;
* &amp;quot;JPN&amp;quot;&lt;br /&gt;
* &amp;quot;USA&amp;quot;&lt;br /&gt;
* &amp;quot;EUR&amp;quot;&lt;br /&gt;
* &amp;quot;KOR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Starting with the browser from [[10.2.0-28]], the &amp;quot;1&amp;quot; in the above URLs were changed to &amp;quot;2&amp;quot;. With the New3DS browser from [[10.4.0-29]], it&#039;s now &amp;quot;3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As of October 26, 2015, the &amp;quot;1&amp;quot; URLs return the browser-version for v9.9(decimal number as a string without any &amp;quot;.&amp;quot;), while the &amp;quot;2&amp;quot; URLs returns 0.&lt;br /&gt;
&lt;br /&gt;
 if(internal_browserver &amp;gt; server_browserver)&lt;br /&gt;
 {&lt;br /&gt;
     &amp;lt;safe&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
     &amp;lt;update message&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hence, internal_browserver == server_browserver will trigger the sysupdate message, which appears to be the normal way to indicate that the current browser is outdated(see above).&lt;br /&gt;
&lt;br /&gt;
There is a cache for this in savedata. The request is only done when at least 24-hours have passed since the last time the request was done(see the below savedata section).&lt;br /&gt;
&lt;br /&gt;
It is still possible to guard against this update by blocking the previous URLs using a proxy. &lt;br /&gt;
It is not possible to remove the update message by entering the [[Recovery Mode]].&lt;br /&gt;
&lt;br /&gt;
=== Page request ===&lt;br /&gt;
For this request, all root-CAs bundled with the browser are trusted, in addition to two of the SSL module builtin Nintendo root-CAs.&lt;br /&gt;
&lt;br /&gt;
The browser(with New3DS at least) does the following with [[HTTP_Services|HTTPC]] for requesting the above page:&lt;br /&gt;
* Initializes the HTTP context and uses [[HTTPC:InitializeConnectionSession]] + [[HTTPC:SetProxyDefault]].&lt;br /&gt;
* Uses [[HTTP_Services|HTTPC]] command 0x250080 twice with cmd[1]=contexthandle: first time cmd[2]=0x3, second time cmd[2]=0x6.&lt;br /&gt;
* Then [[HTTPC:AddTrustedRootCA]] is used 48 times to setup 48 trusted root CAs. This appears to be every cert in the browser &amp;quot;romfs:/browser/rootca.pem&amp;quot; file converted to DER, in the same order from there(in other words, every single root CA the browser trusts by default for normal web-browsing).&lt;br /&gt;
* Then [[HTTPC:BeginRequest]] is used.&lt;br /&gt;
* Then [[HTTPC:ReceiveDataTimeout]] is used, the recv-size seems to be fixed to 0x20.&lt;br /&gt;
* Then [[HTTPC:GetResponseStatusCodeTimeout]] is used.&lt;br /&gt;
* Then [[HTTPC:GetDownloadSizeState]] is used.&lt;br /&gt;
* Then the HTTP context is closed.&lt;br /&gt;
&lt;br /&gt;
Raw request data(New3DS USA v10.2 browser):&lt;br /&gt;
 000000: 47 45 54 20 2f 53 4e 41 4b 45 2f 32 2f 55 53 41  GET /SNAKE/2/USA&lt;br /&gt;
 000010: 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a   HTTP/1.1..Host:&lt;br /&gt;
 000020: 20 63 62 76 63 2e 63 64 6e 2e 6e 69 6e 74 65 6e   cbvc.cdn.ninten&lt;br /&gt;
 000030: 64 6f 2e 6e 65 74 0d 0a 0d 0a                    do.net....&lt;br /&gt;
&lt;br /&gt;
=== v10.7 ===&lt;br /&gt;
The only actual code change with Old3DS/New3DS browser v10.7 was that the code which calculates the diff_timestamp was moved to immediately after the block which initializes &amp;lt;state_timestamp&amp;gt; when &amp;lt;state_timestamp&amp;gt; is all-zero. This fixed the browser-version-check [[3DS_Userland_Flaws|bypass]].&lt;br /&gt;
&lt;br /&gt;
== Dummy web-browser ==&lt;br /&gt;
Gamecards v9.9 and above include, with their sysupdate, a dummy Old3DS/New3DS web-browser. The *only* thing this title does is display the same message listed in the above forced-update section. The message files in RomFS *only* contain that message string above. There are no &amp;quot;http&amp;quot; strings in the main codebin, and [[RO_Services|RO]] isn&#039;t used either(no CRO data in RomFS at all). Both browsers are internally called &amp;quot;dummySpider&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hence, if you update your system below v9.8 with any v9.9 or above gamecard, the system web-browser will be rendered *completely* useless until you install a system-update from CDN(no network requests involved here).&lt;br /&gt;
&lt;br /&gt;
Gamecards v10.7 and v11.4(New3DS only) have updated the dummy web-browser, where the only difference is the title version.&lt;br /&gt;
&lt;br /&gt;
== Savedata ==&lt;br /&gt;
=== New3DS ===&lt;br /&gt;
On newer SKATER versions, it appears *all* NAND savedata is stored under the [[System_SaveData|0x000200BB]] savedata.&lt;br /&gt;
&lt;br /&gt;
==== 0x000200BB savedata ====&lt;br /&gt;
This only contains &amp;quot;t.bin&amp;quot; with filesize 0xadf80, the format is below.&lt;br /&gt;
&lt;br /&gt;
The timestamp format used here is the number of milliseconds since January 1, 2000(local-time).&lt;br /&gt;
&lt;br /&gt;
When using the &amp;quot;Initialize savedata&amp;quot; option in the browser, that deletes this savedata file/image then exits the browser. This file is then re-created when the browser gets started again.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4?&lt;br /&gt;
| This counter is incremented each time the savedata is written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x8&lt;br /&gt;
| Timestamp for when the savedata was last written.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x15?&lt;br /&gt;
| This is all-zeros on non-JPN systems. On JPN systems where the browser filter is disabled, this is a string in the following format: &amp;quot;4110-%016llX&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x8&lt;br /&gt;
| s64 timestamp, can be either a normal positive timestamp or a relative negative one. Used with the forced-update described above. When an update is detected this timestamp is negative, otherwise this is a normal positive timestamp(it&#039;s unknown how exactly this timestamp is checked). When positive, this seems to be the last time the forced-update HTTPS request was done where no update was needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==APT Parameters==&lt;br /&gt;
The URL to load can optionally be loaded from char[] string [[APT:SendParameter|paramblk+0]]. This is used when scanning URL QR-codes in Home Menu / etc.&lt;br /&gt;
&lt;br /&gt;
==Errors==&lt;br /&gt;
&amp;quot;Failed to load part of this page&amp;quot;: This can be caused by failing to load &amp;quot;/favicon.ico&amp;quot;. For example, this can be caused by loading a plain HTTP page, with plain-http favicon redirecting to HTTPS. If cert-verify then fails with favicon in this case, this error would then trigger.&lt;br /&gt;
&lt;br /&gt;
==Other details==&lt;br /&gt;
&lt;br /&gt;
*It scored 90/100 on [http://acid3.acidtests.org/ Acid3] test&lt;br /&gt;
*Images from the Internet can be saved to the [[SD Filesystem|SD Card]] and viewed using the [[Nintendo 3DS Camera]] application.&lt;br /&gt;
*Images saved to an [[SD Filesystem|SD Card]] or to the Nintendo 3DS system memory can be uploaded to blogs or other sites that allow the uploading of photos using :&lt;br /&gt;
 &amp;lt;input type=&amp;quot;file&amp;quot; /&amp;gt;&lt;br /&gt;
* HTML5Test.com say that Drag and drop is supported but it&#039;s not (code on WebKit is ready, but it&#039;s not implemented on interface of browser)&lt;br /&gt;
* Webpages are rendered with the RGB565 color format.&lt;br /&gt;
&lt;br /&gt;
==Tips==&lt;br /&gt;
&lt;br /&gt;
=== Detect User Agent ===&lt;br /&gt;
&lt;br /&gt;
To detect if the user agent is the Nintendo 3DS Internet Browser (not including mobile site mode):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     if(navigator.userAgent.indexOf(&amp;quot;Nintendo 3DS&amp;quot;) == -1) { // If the user agent does not contain &amp;quot;Nintendo 3DS&amp;quot;&lt;br /&gt;
         location.replace(&amp;quot;http://www.3dbrew.org&amp;quot;); // Redirect to another page&lt;br /&gt;
     }&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* You can check using &amp;lt;code&amp;gt;navigator.platform.indexOf(&amp;quot;Nintendo 3DS&amp;quot;) &amp;gt; -1&amp;lt;/code&amp;gt; as well.&lt;br /&gt;
* The New 3DS Internet Browser&#039;s &amp;quot;Request Mobile Sites&amp;quot; setting affects the user agent. To detect if the New 3DS Internet Browser is being used with this option enabled, use &amp;lt;code&amp;gt;screen.pixelDepth == 16 &amp;amp;&amp;amp; navigator.platform == &amp;quot;iPhone&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** This relies on the fact that the internet browser renders its webpages in 16-bit color, which is (hopefully?) not possible with a real iPhone.&lt;br /&gt;
** Keep in mind that the previous browser-detection examples do not account for this setting.&lt;br /&gt;
&lt;br /&gt;
=== Scrolling ===&lt;br /&gt;
&lt;br /&gt;
Scrolling can be altered by modifying &amp;lt;em&amp;gt;document.body.scrollTop&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;document.body.scrollLeft&amp;lt;/em&amp;gt;.  However, there are drawbacks related to working with these properties:&lt;br /&gt;
&lt;br /&gt;
* Both properties return 0 when accessed&lt;br /&gt;
* Setting one property resets the other property&#039;s scroll position&lt;br /&gt;
&lt;br /&gt;
In order to set both at the same time (without either resetting to 0), use &amp;lt;em&amp;gt;window.scrollTo&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
==== Key Events ====&lt;br /&gt;
The following buttons trigger the &amp;lt;em&amp;gt;onkeydown&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;onkeypress&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;onkeyup&amp;lt;/em&amp;gt; events:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; width=&amp;quot;20%&amp;quot;&lt;br /&gt;
! Code !! Button &lt;br /&gt;
|-&lt;br /&gt;
| 13 || A&lt;br /&gt;
|-&lt;br /&gt;
| 37 || Left&lt;br /&gt;
|-&lt;br /&gt;
| 38 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 39 || Right&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Down&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The events cannot have their default action cancelled.  Other buttons do not trigger key events.&lt;br /&gt;
&lt;br /&gt;
The Old3DS browser dispatches a &amp;lt;em&amp;gt;keypress&amp;lt;/em&amp;gt; event once per key press for each of the buttons above, but the New3DS browser dispatches the event continuously until the button is released.&lt;br /&gt;
&lt;br /&gt;
A keyboard event&#039;s &amp;lt;code&amp;gt;keyIdentifier&amp;lt;/code&amp;gt; property usually should not be used to identify which button was pressed, as the A button&#039;s &amp;lt;em&amp;gt;keypress&amp;lt;/em&amp;gt; event is dispatched with a key identifier of &amp;quot;&amp;quot; (an empty string) rather than &amp;quot;Enter&amp;quot; in the New3DS browser.&lt;br /&gt;
&lt;br /&gt;
The New3DS browser&#039;s keyboard dispatches &amp;lt;em&amp;gt;keydown&amp;lt;/em&amp;gt; and &amp;lt;em&amp;gt;keyup&amp;lt;/em&amp;gt; events when a key is pressed, but it is not possible to determine which key was pressed based on the event itself. Every keyboard &amp;lt;em&amp;gt;keydown&amp;lt;/em&amp;gt; event has a key code of 229 and a key identifier of &amp;quot;U+00E5&amp;quot;, and every &amp;lt;em&amp;gt;keyup&amp;lt;/em&amp;gt; event has a key code of 0 and a key identifier of &amp;quot;U+0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Key events are suppressed while the touchscreen is touched.&lt;br /&gt;
&lt;br /&gt;
==== Touch/Mouse Events ====&lt;br /&gt;
The &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt;, &amp;lt;em&amp;gt;mouseup&amp;lt;/em&amp;gt;, and &amp;lt;em&amp;gt;click&amp;lt;/em&amp;gt; events are all triggered by the browser.  However, the &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt; event doesn&#039;t trigger until you lift the stylus or you&#039;ve held it on the screen long enough to trigger text selection mode.  Text selection mode requires pressing the touchscreen for approximately 1.05 seconds in the Old3DS browser, or pressing the touchscreen for approximately 0.41 seconds in the New3DS browser. Also, the &amp;lt;em&amp;gt;mousedown&amp;lt;/em&amp;gt; event is only dispatched while text selection mode is active. Mouse events cannot have their default actions cancelled.&lt;br /&gt;
&lt;br /&gt;
Touch events are not supported in the Old3DS browser, and the &amp;lt;em&amp;gt;touchcancel&amp;lt;/em&amp;gt; event does not seem to be used by either browser. Touches cannot start within the bottom browser bar, but they can move to be within it. The rotation angle, contact radii, and pressure of each touch are always zero, as the 3DS touchscreen is not capable of detecting these values. Only one touch can be detected at a time due to the touchscreen&#039;s hardware limitations as well. Unlike mouse events, touch events can have their default actions cancelled. Doing so will prevent the touchscreen from being used to scroll through the webpage, highlight text, zoom out, and interact with the bottom browser bar.&lt;br /&gt;
&lt;br /&gt;
==== System Font Characters ====&lt;br /&gt;
The [[System_Font#Unicode_Private_Use_characters|system font]]&#039;s private-use characters can be viewed within the web browser.&lt;br /&gt;
&lt;br /&gt;
== Screen Resolution ==&lt;br /&gt;
&lt;br /&gt;
The up screen resolution is 400×240. However, the viewable area in the browser is only &amp;lt;b&amp;gt;400×215&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The touch screen resolution is 320×240. However, the viewable area in the browser is &amp;lt;b&amp;gt;320×212&amp;lt;/b&amp;gt; &amp;lt;em&amp;gt;or&amp;lt;/em&amp;gt; &amp;lt;b&amp;gt;320×240&amp;lt;/b&amp;gt;, depending on if the bottom browser bar is visible. The New3DS browser&#039;s bottom bar can hidden by scrolling and/or attempting to zoom in/out with the C-stick, unless scrolling and zooming have both been disabled.&lt;br /&gt;
&lt;br /&gt;
You can have a page span both screens. However, the browser will behave as if the bottom screen is the only active screen and the top screen is scrolled off. This is important when computing CSS coordinates. Items positioned from the &amp;quot;bottom&amp;quot; will be positioned based on the height of the bottom screen, not the cumulative height of both screens.&lt;br /&gt;
&lt;br /&gt;
== Using Both Screens ==&lt;br /&gt;
&lt;br /&gt;
Generally the easiest way to accomplish the correct layout is to create HTML elements that &amp;quot;contain&amp;quot; the top and bottom screens. Here&#039;s an example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=400, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;style&amp;gt;&lt;br /&gt;
       body { margin: 0px; }&lt;br /&gt;
       #topscreen { width: 400px; height: 215px; overflow: hidden; background-color: red; }&lt;br /&gt;
       #bottomscreen { width: 320px; height: 212px; overflow: hidden; background-color: blue; margin: 0 40px 28px; }&lt;br /&gt;
     &amp;lt;/style&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;amp;lt;div id=&amp;quot;topscreen&amp;quot;&amp;gt;Top Screen&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;amp;lt;div id=&amp;quot;bottomscreen&amp;quot;&amp;gt;Bottom Screen&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scheme allows the page to be easily manipulated through JavaScript.  In order to have the window snap to the correct position, use the following JavaScript code:&lt;br /&gt;
&lt;br /&gt;
 window.setInterval(function() {&lt;br /&gt;
     window.scrollTo(40, 215);&lt;br /&gt;
 }, 0);&lt;br /&gt;
&lt;br /&gt;
This automatically resets the position if the user accidentally scrolls the page. Zooming should probably also be disabled by adding &amp;lt;code&amp;gt;user-scalable=no&amp;lt;/code&amp;gt; to the &amp;lt;meta&amp;gt; viewport element, though this will only have an effect in the New3DS browser.&lt;br /&gt;
&lt;br /&gt;
==Example Sites==&lt;br /&gt;
&amp;lt;!-- If you have a website that demonstrates these techniques, place it here! --&amp;gt;&lt;br /&gt;
* [http://www.nintendo.com/3ds/internetbrowser/bookmarks Nintendo 3DS Bookmarks]: This is the first bookmark pre-installed in the browser.&lt;br /&gt;
* [http://theimageshare.com ImageShare]: Image uploader for the 3DS ([https://github.com/corbindavenport/imageshare source code])&lt;br /&gt;
* [http://3ds.andysmith.co.uk/jFox.html jFox] (Short URL: http://bit.ly/iB7FqW)&lt;br /&gt;
* [http://ditto3d.com/3ds Ditto3D (Dead Link)] (Short URL: http://bit.ly/oVreWA)&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Homebrew_Exploits&amp;diff=23478</id>
		<title>Homebrew Exploits</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Homebrew_Exploits&amp;diff=23478"/>
		<updated>2025-05-08T14:23:18Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Payload==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Description&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://smealum.github.io/3ds/ *hax payload]&lt;br /&gt;
| Booted by all of the below non-sysmodule exploits. &#039;&#039;&#039;No longer needed as of [https://github.com/AuroraWright/Luma3DS/releases/tag/v8.0 Luma 8.0]&#039;&#039;&#039;&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to &#039;&#039;&#039;11.9.0-42&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the rest of this page, &amp;quot;Supported firmwares&amp;quot; refers to the exploit &#039;&#039;itself&#039;&#039;, not whether *hax payload supports it.&lt;br /&gt;
&lt;br /&gt;
==Standalone Homebrew Launcher Exploits==&lt;br /&gt;
The following homebrew exploits can be executed on a previously un-exploited system. &#039;&#039;Please&#039;&#039; see the above Payload section regarding what &amp;quot;Supported firmwares&amp;quot; indicates &#039;&#039;exactly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[ninjhax|Ninjhax 1.1b]]&lt;br /&gt;
| From &#039;&#039;&#039;4.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;9.2.0-20&#039;&#039;&#039;.&lt;br /&gt;
| A cartridge or eShop version (JPN-only) of &amp;quot;Cubic Ninja&amp;quot;.&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.net/ninjhax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [[ninjhax|Ninjhax 2.x]]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.X&#039;&#039;&#039;.&lt;br /&gt;
|  A cartridge or eShop version (JPN-only, not available anymore for purchase) of &amp;quot;Cubic Ninja&amp;quot;.&lt;br /&gt;
| smea&lt;br /&gt;
| [https://smealum.github.io/ninjhax2/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [http://plutooo.github.io/freakyhax/ freakyhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.X&#039;&#039;&#039;.&lt;br /&gt;
|  A cartridge or eShop version (USA/EUR/JPN, not available anymore for purchase) of &amp;quot;Freakyform Deluxe&amp;quot;.&lt;br /&gt;
| plutoo&lt;br /&gt;
| [http://plutooo.github.io/freakyhax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://plutooo.github.io/smilehax/ smilehax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (JPN all versions up to 3.32 excluded, USA 3.31 only)&lt;br /&gt;
| plutoo&lt;br /&gt;
| [http://plutooo.github.io/smilehax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/zoogie/smilehax-IIe smilehax IIe]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.13.0-45&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (JPN version 3.3.2 via app downgrade, USA/EUR 3.6.0, aka latest app version)&lt;br /&gt;
| zoogie&lt;br /&gt;
| [https://github.com/zoogie/smilehax-IIe/releases/latest Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://mrnbayoh.github.io/basicsploit/ BASICSploit]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (USA all versions)&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [http://mrnbayoh.github.io/basicsploit/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [[smashbroshax|smashbroshax]] (beaconhax)&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-37&#039;&#039;&#039;.&lt;br /&gt;
| Super Smash Bros 3DS (full-game) and a way to broadcast raw wifi beacons. The demo (prior to the updated November 2015 [https://github.com/yellows8/3ds_smashbroshax version]) isn&#039;t usable with the *hax payloads. Game-version v1.1.3 fixed the vuln used with this, see the repo for a workaround for that.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/3ds_smashbroshax Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[browserhax]]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-2&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
Note that the browser-version-check bypass is only usable prior to [[10.7.0-32]].&lt;br /&gt;
| A USA, EUR, JPN, or KOR system.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [http://yls8.mtheall.com/3dsbrowserhax.php Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/svanheulen/genhax genhax]&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Monster Hunter X (JPN only), and the DLC encryption key (see installer instructions). &#039;&#039;&#039;Note: the secondary exploit still works, see bellow&#039;&#039;&#039;&lt;br /&gt;
| svanheulen&lt;br /&gt;
| [https://github.com/svanheulen/genhax_installer Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/nedwill/soundhax soundhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-13&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-36&#039;&#039;&#039;.&lt;br /&gt;
| A USA, EUR, JPN or KOR system.&lt;br /&gt;
| nedwill&lt;br /&gt;
| [http://soundhax.com Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/doodlebomb doodlebomb]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Swapdoodle (version 1.1.1 or lower). As of 2017-4-26, version 1.1.2 was released, blocking outdated app version from sending or receiving messages.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/doodlebomb/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/rpwng2 RPwnG 2]&lt;br /&gt;
| From &#039;&#039;&#039;11.7.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of RPG Maker Player (free) ver. 1.1.4 on EUR, ver. 1.1.2 on USA. A 3DS on firmware 11.7. &lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/rpwng2/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if installed before August 28, 2017&lt;br /&gt;
| [https://twitter.com/MrNbaYoh/status/899394739543437313 RPwnG]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An  digital copy of RPG Maker Player (free) ver. 1.1.4 on EUR, ver. 1.1.2 on USA/JPN is required. As of August 28, 2017 the code is instantly removed after publishing.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/rpwng/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/MrNbaYoh/notehax notehax]&lt;br /&gt;
|  From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.5.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of Flipnote Studio 3D on ver 1.3.1 (JPN) and ver 1.0.0 for EUR/USA (not the latest)&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/notehax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if you already purchased Blockfactory before it was removed from the eShop&lt;br /&gt;
| [https://github.com/Stary2001/haxfactory haxfactory]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of &amp;quot;Blockfactory&amp;quot; (USA/EUR)&lt;br /&gt;
| Stary2001&lt;br /&gt;
| [https://github.com/Stary2001/haxfactory Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Secondary Exploits==&lt;br /&gt;
Installation of these exploits requires a previously exploited system to install. After installation, they can be used on their own. &#039;&#039;Please&#039;&#039; see the above Payload section regarding what &amp;quot;Supported firmwares&amp;quot; indicates &#039;&#039;exactly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[ironhax]]&lt;br /&gt;
| From &#039;&#039;&#039;9.5.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;10.3.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 28.&lt;br /&gt;
| A copy of &amp;quot;Ironfall: Invasion&amp;quot; downloaded from eShop before August 11th, 2015. Note the updated version that was released on October 13th, 2015 is not supported.&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.github.io/3ds/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [http://vegaroxas.github.io/ steelhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;&lt;br /&gt;
| A copy of Steel Diver: Sub Wars&lt;br /&gt;
| Vegaroxas&lt;br /&gt;
| [https://github.com/VegaRoXas/vegaroxas.github.io/raw/master/files/steelhax-installer.zip Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/yellows8/oot3dhax oot3dhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 39.&lt;br /&gt;
| A gamecard or eShop-install of Legend of Zelda: Ocarina of Time 3D. Besides using the installer app, writing raw saveimages with a save dongle for example is another option. Before compression was introduced in the 2016-7-18 release, the size of the *hax payload meant the exploit can&#039;t co-exist with regular saves on a physical version of the game.&lt;br /&gt;
| Yellows8 / smea et al.&lt;br /&gt;
| See [https://smealum.github.io/3ds/ here].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[menuhax]]&lt;br /&gt;
| JPN/USA/EUR: From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
KOR: From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
| JPN/USA/EUR: Having created [[Home_Menu#Home_Menu_Theme_SD_ExtData|theme extdata]] through opening the official theme selector at least once.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/3ds_homemenuhax/releases Download]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/shinyquagsire23/supermysterychunkhax supermysterychunkhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; (USA/JPN) / &#039;&#039;&#039;10.2.0-X&#039;&#039;&#039; (EUR) up to &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Pokémon Super Mystery Dungeon.&lt;br /&gt;
| Shiny Quagsire / SALT team&lt;br /&gt;
| [https://smd.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/shinyquagsire23/v_hax (v*)hax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 33.&lt;br /&gt;
Note that &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; is only required for the Homebrew Launcher - the game itself only requires &#039;&#039;&#039;2.1.0-X&#039;&#039;&#039; for primitive userland code execution.&lt;br /&gt;
| A copy of VVVVVV downloaded after March 2012 (v1). v1.1 patches out the overflow vulnerability used by (v*)hax.&lt;br /&gt;
| Shiny Quagsire / SALT team&lt;br /&gt;
| [https://vvvvvv.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/Dazzozo/humblehax humblehax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; (USA/EUR) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Citizens of Earth (either v1 or v2), featured in the Humble &amp;quot;Friends of Nintendo&amp;quot; Bundle.&lt;br /&gt;
| Dazzozo / SALT team&lt;br /&gt;
| [https://citizens.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://mrnbayoh.github.io/basehaxx/ basehaxx]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.1.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Pokémon Omega Ruby / Alpha Sapphire v1 or v1.4 with the ability to have a secret base.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [http://mrnbayoh.github.io/basehaxx/ install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/yellows8/stickerhax stickerhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Paper Mario: Sticker Star.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/stickerhax Here]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/svanheulen/genhax genhax]&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039;(JPN) or &#039;&#039;&#039;10.3.0-X&#039;&#039;&#039;(EUR/USA) up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Monster Hunter Generations or Monster Hunter X (without the game updates installed), and an internet connection during installation.&lt;br /&gt;
| svanheulen&lt;br /&gt;
| [https://github.com/svanheulen/genhax_installer Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/painthax painthax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Pixel Paint.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://github.com/MrNbaYoh/painthax/releases/latest install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh]&lt;br /&gt;
| From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;, and an Internet connection during installation. Unless you have &amp;quot;CFW&amp;quot;, ctr-httpwn &amp;gt;=v1.2 with the included bosshaxx on a compatible system-version is also required. If installing via ctr-httpwn, you can&#039;t do so on &amp;gt;=v11.4. Note that the exploit itself was not fixed.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/ctpkpwn/releases Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/MrNbaYoh/doodlebomb doodlebomb]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.4.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Swapdoodle.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/doodlebomb/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if installed before August 28, 2017&lt;br /&gt;
| [https://github.com/ChampionLeake/RPwnG3 RPwnG3]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.12.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A Digital/Physical copy of &amp;quot;RPGMaker Fes Player/RPGMaker Fes&amp;quot; (USA/JPN 1.1.2 or lower ; EUR 1.1.4 or lower).&lt;br /&gt;
| [[User:ChampionLeake|ChampionLeake]]&lt;br /&gt;
| [https://github.com/ChampionLeake/RPwnG3/releases Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/luigoalma/nitpic3d nitpic3d]&lt;br /&gt;
| From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.13.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital or physical of Picross 3D: Round 2&lt;br /&gt;
| Luigoalma and Kartik&lt;br /&gt;
| [https://github.com/luigoalma/nitpic3d Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/PabloMK7/kartdlphax kartdlphax]&lt;br /&gt;
| All system versions work.&lt;br /&gt;
| A digital or physical of Mario Kart 7 for the same region as both consoles&lt;br /&gt;
| PabloMK7&lt;br /&gt;
| [https://3ds.hacks.guide/installing-boot9strap-(kartdlphax) Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Exploits without Homebrew Launcher==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;/u&amp;gt; The following exploits can run code, but are missing a 3DSX launcher. They cannot launch any homebrew in the 3DSX format, but could still prove useful by chaining to exploits with higher privileges.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | yes&lt;br /&gt;
| [https://github.com/zoogie/MSET9 MSET9]&lt;br /&gt;
| From &#039;&#039;&#039;3.0.0&#039;&#039;&#039; to &#039;&#039;&#039;latest&#039;&#039;&#039;.&lt;br /&gt;
| Works on all consoles, but for CHN consoles, will need SD card with preinstalled titles or movable.sed for generating valid SD title database.&lt;br /&gt;
| zoogie&lt;br /&gt;
|[https://github.com/zoogie/MSET9 Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://safecerthax.rocks safecerthax] (Safe Mode System Updater)&lt;br /&gt;
| (Old3DS (2DS) (XL)) From &#039;&#039;&#039;1.0.0&#039;&#039;&#039; to &#039;&#039;&#039;11.14.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(New3DS (New2DS) (XL)) &#039;&#039;&#039;NOT SUPPORTED&#039;&#039;&#039;&lt;br /&gt;
|An O3DS or O2DS that can be booted into [[Recovery_Mode|Recovery Mode]] (hold L+R+Up+A at startup) &amp;amp; an internet connection.&lt;br /&gt;
|[[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|[https://safecerthax.rocks/user-guide/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes (partially)&lt;br /&gt;
| [[bannerbomb3]] (System Settings)&lt;br /&gt;
| (USA / EUR / JPN) &#039;&#039;&#039;11.5.0&#039;&#039;&#039; to &#039;&#039;&#039;11.16.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(KOR / TWN) &#039;&#039;&#039;(11.4.0)&#039;&#039;&#039; &#039;&#039;&#039;11.5.0&#039;&#039;&#039; to &#039;&#039;&#039;latest&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
An exploit that uses a buffer overflow in a TWL export banner&#039;s title strings to gain rop execution.&lt;br /&gt;
|A USA, EUR, JPN, KOR, or TWN system with its movable.sed keyY extracted.&lt;br /&gt;
|[[User:zoogie|zoogie]]&lt;br /&gt;
|[[bannerbomb3|Install]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[browserhax]] (Without the loader in the 3ds_browserhax_common repo)&lt;br /&gt;
| (Old3DS) From &#039;&#039;&#039;5.0.0-2&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039; (Pre-v5.0 is supported for some versions if you manually modify the source)&lt;br /&gt;
&lt;br /&gt;
(New3DS) From &#039;&#039;&#039;9.0.0-20&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the browser-version-check bypass is only usable prior to [[10.7.0-32]].&lt;br /&gt;
| An USA, EUR, or JPN system.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [[browserhax|Install]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| Ninjhax (with specialized payloads)&lt;br /&gt;
| Up to &#039;&#039;&#039;9.2.0-20&#039;&#039;&#039;?&lt;br /&gt;
| &lt;br /&gt;
| smea + independent developers&lt;br /&gt;
| N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Previous Exploits==&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;/u&amp;gt; These exploits &#039;&#039;&#039;do not work&#039;&#039;&#039;. They are exploits which no longer function at all, regardless of software or firmware revision.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
! Name&lt;br /&gt;
! Supported firmwares&lt;br /&gt;
! Requirements&lt;br /&gt;
! Author&lt;br /&gt;
! Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[tubehax|Tubehax]]&lt;br /&gt;
| None. &#039;&#039;&#039;Was&#039;&#039;&#039;: From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;10.1.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 27.&lt;br /&gt;
| The YouTube application and an Internet connection. As of October 15, 2015, this is no longer usable due to an update being released which fixes the vuln used by tubehax + app update being forced (see [[YouTube|here]]).&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.github.io/3ds/ Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other Homebrew Loaders==&lt;br /&gt;
The [https://github.com/yellows8/hblauncher_loader hblauncher_loader] title can be used when running under modded-FIRM which allows running unsigned titles, to boot the *hax payloads.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/AuroraWright/Luma3DS Luma3DS], apart from providing signature patches for the installation and use of custom titles, includes the &amp;quot;Rosalina&amp;quot; system module, which among its features allows cleanly loading 3dsx applications as a native process with full ARM11 system permissions, by replacing an installed title&#039;s ExeFS and ExHeader during load time. It is currently the only option for running 3dsx applications on 11.4+ O3DSes; additionally, the *hax 2.x payload is incompatible with Rosalina and therefore so are homebrew applications requiring its target title system.&lt;br /&gt;
&lt;br /&gt;
==Sysmodule Exploits==&lt;br /&gt;
This section is for system-module exploits, which can be run from the *hax payloads.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Works on latest fw&lt;br /&gt;
! Name&lt;br /&gt;
! Supported firmwares&lt;br /&gt;
! Requirements&lt;br /&gt;
! Author&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No, still usable pre-v11.4.&lt;br /&gt;
| [https://github.com/yellows8/ctr-httpwn/releases ctr-httpwn]&lt;br /&gt;
| From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;. This includes bosshaxx.&lt;br /&gt;
| None&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==WebKit vuln testing==&lt;br /&gt;
See [https://github.com/yellows8/3ds_browserhax_common/issues/28 here].&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Homebrew_Exploits&amp;diff=23477</id>
		<title>Homebrew Exploits</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Homebrew_Exploits&amp;diff=23477"/>
		<updated>2025-05-08T14:01:21Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Payload==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Description&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://smealum.github.io/3ds/ *hax payload]&lt;br /&gt;
| Booted by all of the below non-sysmodule exploits. &#039;&#039;&#039;No longer needed as of [https://github.com/AuroraWright/Luma3DS/releases/tag/v8.0 Luma 8.0]&#039;&#039;&#039;&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to &#039;&#039;&#039;11.9.0-42&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the rest of this page, &amp;quot;Supported firmwares&amp;quot; refers to the exploit &#039;&#039;itself&#039;&#039;, not whether *hax payload supports it.&lt;br /&gt;
&lt;br /&gt;
==Standalone Homebrew Launcher Exploits==&lt;br /&gt;
The following homebrew exploits can be executed on a previously un-exploited system. &#039;&#039;Please&#039;&#039; see the above Payload section regarding what &amp;quot;Supported firmwares&amp;quot; indicates &#039;&#039;exactly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[ninjhax|Ninjhax 1.1b]]&lt;br /&gt;
| From &#039;&#039;&#039;4.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;9.2.0-20&#039;&#039;&#039;.&lt;br /&gt;
| A cartridge or eShop version (JPN-only) of &amp;quot;Cubic Ninja&amp;quot;.&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.net/ninjhax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [[ninjhax|Ninjhax 2.x]]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.X&#039;&#039;&#039;.&lt;br /&gt;
|  A cartridge or eShop version (JPN-only, not available anymore for purchase) of &amp;quot;Cubic Ninja&amp;quot;.&lt;br /&gt;
| smea&lt;br /&gt;
| [https://smealum.github.io/ninjhax2/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [http://plutooo.github.io/freakyhax/ freakyhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.X&#039;&#039;&#039;.&lt;br /&gt;
|  A cartridge or eShop version (USA/EUR/JPN, not available anymore for purchase) of &amp;quot;Freakyform Deluxe&amp;quot;.&lt;br /&gt;
| plutoo&lt;br /&gt;
| [http://plutooo.github.io/freakyhax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://plutooo.github.io/smilehax/ smilehax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (JPN all versions up to 3.32 excluded, USA 3.31 only)&lt;br /&gt;
| plutoo&lt;br /&gt;
| [http://plutooo.github.io/smilehax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/zoogie/smilehax-IIe smilehax IIe]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.13.0-45&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (JPN version 3.3.2 via app downgrade, USA/EUR 3.6.0, aka latest app version)&lt;br /&gt;
| zoogie&lt;br /&gt;
| [https://github.com/zoogie/smilehax-IIe/releases/latest Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://mrnbayoh.github.io/basicsploit/ BASICSploit]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-7&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
| SmileBASIC (USA all versions)&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [http://mrnbayoh.github.io/basicsploit/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [[smashbroshax|smashbroshax]] (beaconhax)&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-37&#039;&#039;&#039;.&lt;br /&gt;
| Super Smash Bros 3DS (full-game) and a way to broadcast raw wifi beacons. The demo (prior to the updated November 2015 [https://github.com/yellows8/3ds_smashbroshax version]) isn&#039;t usable with the *hax payloads. Game-version v1.1.3 fixed the vuln used with this, see the repo for a workaround for that.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/3ds_smashbroshax Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[browserhax]]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-2&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
Note that the browser-version-check bypass is only usable prior to [[10.7.0-32]].&lt;br /&gt;
| A USA, EUR, JPN, or KOR system.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [http://yls8.mtheall.com/3dsbrowserhax.php Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/svanheulen/genhax genhax]&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Monster Hunter X (JPN only), and the DLC encryption key (see installer instructions). &#039;&#039;&#039;Note: the secondary exploit still works, see bellow&#039;&#039;&#039;&lt;br /&gt;
| svanheulen&lt;br /&gt;
| [https://github.com/svanheulen/genhax_installer Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/nedwill/soundhax soundhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-13&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-36&#039;&#039;&#039;.&lt;br /&gt;
| A USA, EUR, JPN or KOR system.&lt;br /&gt;
| nedwill&lt;br /&gt;
| [http://soundhax.com Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/doodlebomb doodlebomb]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Swapdoodle (version 1.1.1 or lower). As of 2017-4-26, version 1.1.2 was released, blocking outdated app version from sending or receiving messages.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/doodlebomb/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/rpwng2 RPwnG 2]&lt;br /&gt;
| From &#039;&#039;&#039;1.1.7-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of RPG Maker Player (free) ver. 1.1.4 on EUR, ver. 1.1.2 on USA. A 3DS on firmware 11.7. &lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/rpwng2/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if installed before August 28, 2017&lt;br /&gt;
| [https://twitter.com/MrNbaYoh/status/899394739543437313 RPwnG]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An  digital copy of RPG Maker Player (free) ver. 1.1.4 on EUR, ver. 1.1.2 on USA/JPN is required. As of August 28, 2017 the code is instantly removed after publishing.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/rpwng/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/MrNbaYoh/notehax notehax]&lt;br /&gt;
|  From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.5.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of Flipnote Studio 3D on ver 1.3.1 (JPN) and ver 1.0.0 for EUR/USA (not the latest)&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/notehax/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if you already purchased Blockfactory before it was removed from the eShop&lt;br /&gt;
| [https://github.com/Stary2001/haxfactory haxfactory]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital copy of &amp;quot;Blockfactory&amp;quot; (USA/EUR)&lt;br /&gt;
| Stary2001&lt;br /&gt;
| [https://github.com/Stary2001/haxfactory Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Secondary Exploits==&lt;br /&gt;
Installation of these exploits requires a previously exploited system to install. After installation, they can be used on their own. &#039;&#039;Please&#039;&#039; see the above Payload section regarding what &amp;quot;Supported firmwares&amp;quot; indicates &#039;&#039;exactly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[ironhax]]&lt;br /&gt;
| From &#039;&#039;&#039;9.5.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;10.3.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 28.&lt;br /&gt;
| A copy of &amp;quot;Ironfall: Invasion&amp;quot; downloaded from eShop before August 11th, 2015. Note the updated version that was released on October 13th, 2015 is not supported.&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.github.io/3ds/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [http://vegaroxas.github.io/ steelhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;&lt;br /&gt;
| A copy of Steel Diver: Sub Wars&lt;br /&gt;
| Vegaroxas&lt;br /&gt;
| [https://github.com/VegaRoXas/vegaroxas.github.io/raw/master/files/steelhax-installer.zip Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/yellows8/oot3dhax oot3dhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 39.&lt;br /&gt;
| A gamecard or eShop-install of Legend of Zelda: Ocarina of Time 3D. Besides using the installer app, writing raw saveimages with a save dongle for example is another option. Before compression was introduced in the 2016-7-18 release, the size of the *hax payload meant the exploit can&#039;t co-exist with regular saves on a physical version of the game.&lt;br /&gt;
| Yellows8 / smea et al.&lt;br /&gt;
| See [https://smealum.github.io/3ds/ here].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[menuhax]]&lt;br /&gt;
| JPN/USA/EUR: From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
KOR: From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.2.0-X&#039;&#039;&#039;.&lt;br /&gt;
| JPN/USA/EUR: Having created [[Home_Menu#Home_Menu_Theme_SD_ExtData|theme extdata]] through opening the official theme selector at least once.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/3ds_homemenuhax/releases Download]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/shinyquagsire23/supermysterychunkhax supermysterychunkhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; (USA/JPN) / &#039;&#039;&#039;10.2.0-X&#039;&#039;&#039; (EUR) up to &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Pokémon Super Mystery Dungeon.&lt;br /&gt;
| Shiny Quagsire / SALT team&lt;br /&gt;
| [https://smd.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/shinyquagsire23/v_hax (v*)hax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.0.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 33.&lt;br /&gt;
Note that &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; is only required for the Homebrew Launcher - the game itself only requires &#039;&#039;&#039;2.1.0-X&#039;&#039;&#039; for primitive userland code execution.&lt;br /&gt;
| A copy of VVVVVV downloaded after March 2012 (v1). v1.1 patches out the overflow vulnerability used by (v*)hax.&lt;br /&gt;
| Shiny Quagsire / SALT team&lt;br /&gt;
| [https://vvvvvv.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/Dazzozo/humblehax humblehax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; (USA/EUR) up to and including &#039;&#039;&#039;11.9.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Citizens of Earth (either v1 or v2), featured in the Humble &amp;quot;Friends of Nintendo&amp;quot; Bundle.&lt;br /&gt;
| Dazzozo / SALT team&lt;br /&gt;
| [https://citizens.salthax.org/ Install].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [http://mrnbayoh.github.io/basehaxx/ basehaxx]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.1.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Pokémon Omega Ruby / Alpha Sapphire v1 or v1.4 with the ability to have a secret base.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [http://mrnbayoh.github.io/basehaxx/ install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/yellows8/stickerhax stickerhax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Paper Mario: Sticker Star.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/stickerhax Here]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/svanheulen/genhax genhax]&lt;br /&gt;
| (New 3DS only) From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039;(JPN) or &#039;&#039;&#039;10.3.0-X&#039;&#039;&#039;(EUR/USA) up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of Monster Hunter Generations or Monster Hunter X (without the game updates installed), and an internet connection during installation.&lt;br /&gt;
| svanheulen&lt;br /&gt;
| [https://github.com/svanheulen/genhax_installer Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/MrNbaYoh/painthax painthax]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.6.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Pixel Paint.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://github.com/MrNbaYoh/painthax/releases/latest install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/yellows8/ctpkpwn ctpkpwn_tfh]&lt;br /&gt;
| From &#039;&#039;&#039;9.9.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A gamecard or eShop-install of &amp;quot;The Legend of Zelda: Tri Force Heroes&amp;quot;, and an Internet connection during installation. Unless you have &amp;quot;CFW&amp;quot;, ctr-httpwn &amp;gt;=v1.2 with the included bosshaxx on a compatible system-version is also required. If installing via ctr-httpwn, you can&#039;t do so on &amp;gt;=v11.4. Note that the exploit itself was not fixed.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [https://github.com/yellows8/ctpkpwn/releases Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [https://github.com/MrNbaYoh/doodlebomb doodlebomb]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.4.0-X&#039;&#039;&#039;.&lt;br /&gt;
| An eShop-install of Swapdoodle.&lt;br /&gt;
| MrNbaYoh&lt;br /&gt;
| [https://mrnbayoh.github.io/doodlebomb/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: darkorange&amp;quot; | Only if installed before August 28, 2017&lt;br /&gt;
| [https://github.com/ChampionLeake/RPwnG3 RPwnG3]&lt;br /&gt;
| From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.12.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A Digital/Physical copy of &amp;quot;RPGMaker Fes Player/RPGMaker Fes&amp;quot; (USA/JPN 1.1.2 or lower ; EUR 1.1.4 or lower).&lt;br /&gt;
| [[User:ChampionLeake|ChampionLeake]]&lt;br /&gt;
| [https://github.com/ChampionLeake/RPwnG3/releases Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/luigoalma/nitpic3d nitpic3d]&lt;br /&gt;
| From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039;(?) up to and including &#039;&#039;&#039;11.13.0-X&#039;&#039;&#039;.&lt;br /&gt;
| A digital or physical of Picross 3D: Round 2&lt;br /&gt;
| Luigoalma and Kartik&lt;br /&gt;
| [https://github.com/luigoalma/nitpic3d Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | Yes&lt;br /&gt;
| [https://github.com/PabloMK7/kartdlphax kartdlphax]&lt;br /&gt;
| All system versions work.&lt;br /&gt;
| A digital or physical of Mario Kart 7 for the same region as both consoles&lt;br /&gt;
| PabloMK7&lt;br /&gt;
| [https://3ds.hacks.guide/installing-boot9strap-(kartdlphax) Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Exploits without Homebrew Launcher==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;/u&amp;gt; The following exploits can run code, but are missing a 3DSX launcher. They cannot launch any homebrew in the 3DSX format, but could still prove useful by chaining to exploits with higher privileges.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
!  Name&lt;br /&gt;
!  Supported firmwares&lt;br /&gt;
!  Requirements&lt;br /&gt;
!  Author&lt;br /&gt;
!  Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lightgreen&amp;quot; | yes&lt;br /&gt;
| [https://github.com/zoogie/MSET9 MSET9]&lt;br /&gt;
| From &#039;&#039;&#039;3.0.0&#039;&#039;&#039; to &#039;&#039;&#039;latest&#039;&#039;&#039;.&lt;br /&gt;
| Works on all consoles, but for CHN consoles, will need SD card with preinstalled titles or movable.sed for generating valid SD title database.&lt;br /&gt;
| zoogie&lt;br /&gt;
|[https://github.com/zoogie/MSET9 Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lime&amp;quot; | Yes&lt;br /&gt;
| [https://safecerthax.rocks safecerthax] (Safe Mode System Updater)&lt;br /&gt;
| (Old3DS (2DS) (XL)) &#039;&#039;&#039; ALL &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(New3DS (New2DS) (XL)) &#039;&#039;&#039;NOT SUPPORTED&#039;&#039;&#039;&lt;br /&gt;
|An O3DS or O2DS that can be booted into [[Recovery_Mode|Recovery Mode]] (hold L+R+Up+A at startup) &amp;amp; an internet connection.&lt;br /&gt;
|[[User:Nba_Yoh|MrNbaYoh]]&lt;br /&gt;
|[https://safecerthax.rocks/user-guide/ Install]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: lime&amp;quot; | Yes (partially)&lt;br /&gt;
| [[bannerbomb3]] (System Settings)&lt;br /&gt;
| (USA / EUR / JPN) &#039;&#039;&#039;11.5.0&#039;&#039;&#039; to &#039;&#039;&#039;11.16.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(KOR / TWN) &#039;&#039;&#039;(11.4.0)&#039;&#039;&#039; &#039;&#039;&#039;11.5.0&#039;&#039;&#039; to &#039;&#039;&#039;latest&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
An exploit that uses a buffer overflow in a TWL export banner&#039;s title strings to gain rop execution.&lt;br /&gt;
|A USA, EUR, JPN, KOR, or TWN system with its movable.sed keyY extracted.&lt;br /&gt;
|[[User:zoogie|zoogie]]&lt;br /&gt;
|[[bannerbomb3|Install]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[browserhax]] (Without the loader in the 3ds_browserhax_common repo)&lt;br /&gt;
| (Old3DS) From &#039;&#039;&#039;5.0.0-2&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039; (Pre-v5.0 is supported for some versions if you manually modify the source)&lt;br /&gt;
&lt;br /&gt;
(New3DS) From &#039;&#039;&#039;9.0.0-20&#039;&#039;&#039; to &#039;&#039;&#039;11.0.0-33&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the browser-version-check bypass is only usable prior to [[10.7.0-32]].&lt;br /&gt;
| An USA, EUR, or JPN system.&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
| [[browserhax|Install]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| Ninjhax (with specialized payloads)&lt;br /&gt;
| Up to &#039;&#039;&#039;9.2.0-20&#039;&#039;&#039;?&lt;br /&gt;
| &lt;br /&gt;
| smea + independent developers&lt;br /&gt;
| N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Previous Exploits==&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;/u&amp;gt; These exploits &#039;&#039;&#039;do not work&#039;&#039;&#039;. They are exploits which no longer function at all, regardless of software or firmware revision.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Works on latest fw&lt;br /&gt;
! Name&lt;br /&gt;
! Supported firmwares&lt;br /&gt;
! Requirements&lt;br /&gt;
! Author&lt;br /&gt;
! Install&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No&lt;br /&gt;
| [[tubehax|Tubehax]]&lt;br /&gt;
| None. &#039;&#039;&#039;Was&#039;&#039;&#039;: From &#039;&#039;&#039;9.0.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;10.1.0-X&#039;&#039;&#039;, for &#039;&#039;&#039;X&#039;&#039;&#039; up to and including 27.&lt;br /&gt;
| The YouTube application and an Internet connection. As of October 15, 2015, this is no longer usable due to an update being released which fixes the vuln used by tubehax + app update being forced (see [[YouTube|here]]).&lt;br /&gt;
| smea&lt;br /&gt;
| [http://smealum.github.io/3ds/ Install]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other Homebrew Loaders==&lt;br /&gt;
The [https://github.com/yellows8/hblauncher_loader hblauncher_loader] title can be used when running under modded-FIRM which allows running unsigned titles, to boot the *hax payloads.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/AuroraWright/Luma3DS Luma3DS], apart from providing signature patches for the installation and use of custom titles, includes the &amp;quot;Rosalina&amp;quot; system module, which among its features allows cleanly loading 3dsx applications as a native process with full ARM11 system permissions, by replacing an installed title&#039;s ExeFS and ExHeader during load time. It is currently the only option for running 3dsx applications on 11.4+ O3DSes; additionally, the *hax 2.x payload is incompatible with Rosalina and therefore so are homebrew applications requiring its target title system.&lt;br /&gt;
&lt;br /&gt;
==Sysmodule Exploits==&lt;br /&gt;
This section is for system-module exploits, which can be run from the *hax payloads.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Works on latest fw&lt;br /&gt;
! Name&lt;br /&gt;
! Supported firmwares&lt;br /&gt;
! Requirements&lt;br /&gt;
! Author&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: salmon&amp;quot; | No, still usable pre-v11.4.&lt;br /&gt;
| [https://github.com/yellows8/ctr-httpwn/releases ctr-httpwn]&lt;br /&gt;
| From &#039;&#039;&#039;9.6.0-X&#039;&#039;&#039; up to and including &#039;&#039;&#039;11.3.0-X&#039;&#039;&#039;. This includes bosshaxx.&lt;br /&gt;
| None&lt;br /&gt;
| [[User:Yellows8|Yellows8]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==WebKit vuln testing==&lt;br /&gt;
See [https://github.com/yellows8/3ds_browserhax_common/issues/28 here].&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=FIRM&amp;diff=22193</id>
		<title>FIRM</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=FIRM&amp;diff=22193"/>
		<updated>2023-03-16T23:27:00Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: /* NATIVE_FIRM */ fix 11.16, never try to type your self...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes the file format for the [[Title list#00040138 - System Firmware|3DS&#039; Firmware]], it contains up to four &#039;sections&#039; of data comprising the ARM9 and ARM11 kernels, and some fundamental processes. The firmware sections are not encrypted. In a nutshell, a FIRM contains all the data required to set up the ARM9 and ARM11 kernels, and basic operating functionality.&lt;br /&gt;
&lt;br /&gt;
The ARM9 section contains the ARM9 kernel (and loader) and the Process9 NCCH (which is the only process run in user mode on the ARM9). The ARM11 sections contain the ARM11 kernel (and loader), and various ARM11 process NCCHs. For NATIVE_FIRM/SAFE_MODE_FIRM these ARM11 processes are sm, fs, pm, loader, and pxi. Normally the 4th section is not used. The code loaded from FIRM is constantly running on the system until another FIRM is launched. The ARM11 kernel is hard-coded to always decompress the ExeFS .code of embedded ARM11 NCCHs without checking the exheader compression bit.&lt;br /&gt;
&lt;br /&gt;
== FIRM Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  4&lt;br /&gt;
|  Magic &#039;FIRM&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  0x004&lt;br /&gt;
|  4&lt;br /&gt;
|  Boot priority (highest value = max prio), this is normally zero.&lt;br /&gt;
|-&lt;br /&gt;
|  0x008&lt;br /&gt;
|  4&lt;br /&gt;
|  ARM11 Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
|  0x00C&lt;br /&gt;
|  4&lt;br /&gt;
|  ARM9 Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  0x030&lt;br /&gt;
|  Reserved&lt;br /&gt;
|-&lt;br /&gt;
|  0x040&lt;br /&gt;
|  0x0C0 (0x030*4)&lt;br /&gt;
|  Firmware Section Headers&lt;br /&gt;
|-&lt;br /&gt;
|  0x100&lt;br /&gt;
|  0x100&lt;br /&gt;
|  RSA-2048 signature of the FIRM header&#039;s SHA-256 hash. The signature is checked when bootrom/Process9 are doing FIRM-launch (with the public key being hardcoded in each). The signature is not checked when installing FIRM to the NAND firm0/firm1 partitions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Firmware Section Headers ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  4&lt;br /&gt;
|  Byte offset&lt;br /&gt;
|-&lt;br /&gt;
|  0x004&lt;br /&gt;
|  4&lt;br /&gt;
|  Physical address where the section is loaded to.&lt;br /&gt;
|-&lt;br /&gt;
|  0x008&lt;br /&gt;
|  4&lt;br /&gt;
|  Byte-size.  While loading FIRM this is the field used to determine whether the section exists or not, by checking for value 0x0.&lt;br /&gt;
|-&lt;br /&gt;
|  0x00C&lt;br /&gt;
|  4&lt;br /&gt;
|  Copy-method (0 = NDMA, 1 = XDMA, 2 = CPU mem-copy), Process9 ignores this field. Boot9 doesn&#039;t immediately throw an error when this isn&#039;t 0..2. In that case it will jump over section-data-loading which then results in the hash verification with the below hash being done with the hash already stored in the SHA hardware.&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  0x020&lt;br /&gt;
|  SHA-256 Hash of Firmware Section&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The contents of individual sections &#039;&#039;may&#039;&#039; be encrypted if the FIRM is not meant to be booted from NAND, i.e. if it is meant to be booted from SPI flash or NTR cartridge. If hash checks fail for all FIRM sections if treated as plaintext, it may be worth trying to check if the sections are encrypted. The encryption is detailed on [[Bootloader#Non-NAND_FIRM_boot|the bootloader page]].&lt;br /&gt;
&lt;br /&gt;
== [[New_3DS]] FIRM ==&lt;br /&gt;
For New3DS firmwares (NATIVE_FIRM, TWL_FIRM, ..), the ARM9 FIRM binary has an additional layer of crypto. At the end of each ARM9 binary, there&#039;s a plaintext loader. The format of the FIRM header is identical to regular 3DS FIRM(the RSA modulo is the same as regular 3DS too).&lt;br /&gt;
&lt;br /&gt;
Before checking [[CONFIG_Registers|CFG_SYSPROT9]] the loader main() does the following:&lt;br /&gt;
* On [[9.5.0-22|9.5.0-X]]: executes a nop instruction with r0=0 and r1=&amp;lt;address of arm9binhdr+0x50&amp;gt;.&lt;br /&gt;
* Clears bit6 in [[AES_Registers|REG_AESKEYCNT]].&lt;br /&gt;
&lt;br /&gt;
If [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 is clear (which means the OTP area is unlocked and so it knows that this is a hard reboot), it does the following things:&lt;br /&gt;
* Clears 0x200-bytes on the stack, then reads [[Flash_Filesystem|NAND]] sector 0x96(NAND image offset 0x12C00), with size 0x200-bytes into that stack buffer.&lt;br /&gt;
* Checks [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 again, if it&#039;s set then it executes a panic function(set r0-r2=0, execute nop instruction, then execute instruction &amp;quot;bkpt 0x99&amp;quot;).&lt;br /&gt;
* Hashes data from the OTP region [[IO_Registers|0x10012000-0x10012090]] using SHA256 via the [[SHA_Registers|SHA]] hardware.&lt;br /&gt;
* Clears bit6 in [[AES_Registers|REG_AESKEYCNT]]. Initializes AES keyslot 0x11 keyX, keyY to the lower and higher portion of the above hash, respectively. Due to the above hashed data, the keyX+keyY here are console-unique.&lt;br /&gt;
* Decrypts the first 0x10-byte block in the above read NAND sector with keyslot 0x11 using AES-ECB. [[9.6.0-24|9.6.0-X]]: Then it decrypts the 0x10-bytes at offset 0x10 in the sector with keyslot 0x11.&lt;br /&gt;
* Then the normalkey, keyX, and keyY, for keyslot 0x11 are cleared to zero. Runs the TWL key-init/etc code which was originally in the ARM9-kernel, then writes 0x2 to [[CONFIG_Registers|CFG_SYSPROT9]] to disable the OTP area.&lt;br /&gt;
* Then it uses the above decrypted block from sector+0 to set the normalkey for keyslot 0x11. Decrypts arm9_bin_buf+0 using keyslot 0x11 with AES-ECB, and initialises keyX for keyslot 0x15 with it.&lt;br /&gt;
* [[9.6.0-24|9.6.0-X]]: Then it uses the above decrypted block from sector+0 to set the normalkey for keyslot 0x11. Decrypts a 0x10-byte block from arm9loader .(ro)data using keyslot 0x11 with AES-ECB, and initializes keyX for keyslot 0x18 with it(same block as previous versions).&lt;br /&gt;
* [[9.6.0-24|9.6.0-X]]: Starting with this version keyslot 0x16 keyX init was moved here, see below for details on this. The code for this is same as  [[9.5.0-22|9.5.0-X]], except the decrypted normalkey from sector+0x10 is used for keyslot 0x11 instead.&lt;br /&gt;
* Initialises KeyX for keyslots 0x18..0x1F(0x19..0x1F with [[9.6.0-24|9.6.0-X]]) with the output of decrypting a 0x10-byte block with AES-ECB using keyslot 0x11. This block was changed to a new one separate from keyslot 0x18, starting with [[9.6.0-24|9.6.0-X]]. The last byte in this 0x10-byte input block is increased by 0x01 after initializing each keyslot. Before doing the crypto each time, the loader sets the normal-key for keyslot 0x11 to the plaintext normalkey from sector+0(+0x10 with [[9.6.0-24|9.6.0-X]]). These are New3DS-specific keys.&lt;br /&gt;
* [[9.5.0-22|9.5.0-X]](moved to above with [[9.6.0-24|9.6.0-X]]): Sets the normal-key for keyslot 0x11 to the same one already decrypted on the stack. Decrypts the 0x10-byte block at arm9binhdr+0x60 with AES-ECB using keyslot 0x11, then sets the keyX for keyslot 0x16 to the output data.&lt;br /&gt;
* [[9.5.0-22|9.5.0-X]]: The normalkey, keyX, and keyY, for keyslot 0x11 are then cleared to zero.&lt;br /&gt;
&lt;br /&gt;
When [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 is set(which means this happens only when this loader runs again for firm-launch), the normalkey, keyX, and keyY, for keyslot 0x11 are cleared to zero.&lt;br /&gt;
&lt;br /&gt;
It sets KeyY for keyslot 0x15(0x16 with [[9.5.0-22|9.5.0-X]]) to arm9_bin_buf+16, the CTR to arm9_bin_buf+32 (both are unique for every version). It then proceeds to decrypt the binary with AES-CTR. When done, it sets the normal-key for the keyslot used for binary decryption to zeros. It then decrypts arm9_bin_buf+64 using an hardcoded keyY for keyslot 0x15([[9.5.0-22|9.5.0-X]]/[[9.6.0-24|9.6.0-X]] also uses keyslot 0x15), sets the normal-key for this keyslot to zeros again, then makes sure the output block is all zeroes. If it is, it does some cleanup then it jumps to the entrypoint for the decrypted binary. Otherwise it will clear the keyX, keyY, and normal-key for each of the keyslots initialized by this loader (on [[9.6.0-24|9.6.0-X]]+, on older versions this was bugged and cleared keys 0x00..0x07 instead of 0x18..0x1F), do cleanup(same cleanup as when the decrypted block is all-zero) then just loop forever.&lt;br /&gt;
&lt;br /&gt;
Thus, the ARM9 binary has the following header:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  16&lt;br /&gt;
|  Encrypted KeyX (same for all FIRM&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  16&lt;br /&gt;
|  KeyY&lt;br /&gt;
|-&lt;br /&gt;
|  0x020&lt;br /&gt;
|  16&lt;br /&gt;
|  CTR&lt;br /&gt;
|-&lt;br /&gt;
|  0x030&lt;br /&gt;
|  8&lt;br /&gt;
|  Size of encrypted binary, as ASCII text?&lt;br /&gt;
|-&lt;br /&gt;
|  0x038&lt;br /&gt;
|  8&lt;br /&gt;
|  ?&lt;br /&gt;
|-&lt;br /&gt;
|  0x040&lt;br /&gt;
|  16&lt;br /&gt;
|  Control block&lt;br /&gt;
|-&lt;br /&gt;
|  0x050&lt;br /&gt;
|  16&lt;br /&gt;
|  Added with [[9.5.0-22|9.5.0-X]]. Only used for hardware debugging: a nop instruction is executed with r0=0 and r1=&amp;lt;address of this data&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|  0x060&lt;br /&gt;
|  16&lt;br /&gt;
|  Added with [[9.5.0-22|9.5.0-X]]. Encrypted keyX for keyslot 0x16.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Originally the padding after the header before offset 0x800(start of actual ARM9-binary) was 0xFF bytes, with [[9.5.0-22|9.5.0-X]] this was changed to 0x0.&lt;br /&gt;
&lt;br /&gt;
For the New3DS NATIVE_FIRM arm9-section header, the only difference between the [[8.1.0-0_New3DS]] version and the [[9.0.0-20]] version is that the keyY, CTR, and the block at 0x30 in the header were updated.&lt;br /&gt;
&lt;br /&gt;
===New3DS ARM9 binary loader versions===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  FIRM system version(s)&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| [[8.1.0-0_New3DS]] - [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| Initial version.&lt;br /&gt;
|-&lt;br /&gt;
| [[9.5.0-22|9.5.0-X]]&lt;br /&gt;
| Added keyX initialization for keyslot 0x16(see above), and added code for clearing keyslot 0x11 immediately after the code finishes using keyslot 0x11. The keyslot used for arm9bin decryption was changed from 0x15 to 0x16. Added code for clearing keyslot 0x16 when control-block decryption fails. Added code for using arm9bin_hdr+0x50 with a nop instruction, at the very beginning of the main arm9-loader function. Added two new 0x10-blocks to the arm9bin-hdr.&lt;br /&gt;
|-&lt;br /&gt;
| [[9.6.0-24|9.6.0-X]] - [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| See above and [[9.6.0-24|here]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===New3DS ARM9 kernel===&lt;br /&gt;
The only actual code-difference for the Old3DS/New3DS ARM9-kernels&#039; crt0, besides TWL AES / [[IO_Registers|0x10012000]] related code, is that the New3DS ARM9-kernel writes 0x1 to [[CONFIG_Registers|REG_EXTMEMCNT9]] in the crt0.&lt;br /&gt;
&lt;br /&gt;
===New3DS Process9===&lt;br /&gt;
The following is all of the differences for Old3DS/New3DS Process9 with [[9.3.0-21|9.3.0-X]]:&lt;br /&gt;
* The FIRM-launch code called at the end of the New3DS proc9 main() has different mem-range checks.&lt;br /&gt;
* In the New3DS proc9, the v6.0/v7.0 keyinit function at the very beginning(before the original code) had additional code added for setting [[Flash_Filesystem|CTRNAND]] [[AES_Registers|keyslot]] 0x5, with keydata from .data. After setting the keyY, the keyY in .data is cleared.&lt;br /&gt;
* In New3DS proc9, the functions for getting the gamecard crypto keyslots / NCCH keyslot can return New3DS keyslots when New3DS flags(NCSD/NCCH) are set.&lt;br /&gt;
* The code/data for the binary near the end of arm9mem is slightly different, because of memory-region sizes.&lt;br /&gt;
* The only difference in .data(besides the above code binary) is that the New3DS proc9 has an additional 0x10-byte block for the keyslot 0x5 keyY, see above.&lt;br /&gt;
&lt;br /&gt;
== Variations ==&lt;br /&gt;
There exists different official firmwares for the 3DS: The default one (NATIVE_FIRM) is used to run all 3DS content and boots by default, while backwards compatibility is handled by TWL_FIRM and AGB_FIRM. There furthermore is a rescue mode provided by SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
=== NATIVE_FIRM ===&lt;br /&gt;
NATIVE_FIRM is the FIRM which is installed to the [[Flash_Filesystem|NAND]] firm partitions, which is loaded by bootrom.&lt;br /&gt;
&lt;br /&gt;
Version history:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  System version&lt;br /&gt;
!  old 3DS title version&lt;br /&gt;
!  old 3DS hex title contentID&lt;br /&gt;
!  Kernel/FIRM version (old 3DS/new 3DS)&lt;br /&gt;
!  FIRM ARM11-sysmodule Product Code&lt;br /&gt;
|-&lt;br /&gt;
| [[Factory_Setup|Factory]] FIRM (titleID 00040001-00000002)&lt;br /&gt;
| v0&lt;br /&gt;
| 00&lt;br /&gt;
| 2.3-0&lt;br /&gt;
|-&lt;br /&gt;
| Pre-1.0. Referenced in the v1.0 Home Menu NCCH plain-region.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 2.23-X&lt;br /&gt;
|-&lt;br /&gt;
| [[1.0.0-0|1.0.0]]&lt;br /&gt;
| v432&lt;br /&gt;
| 00&lt;br /&gt;
| 2.27-0&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-1|1.1.0]]&lt;br /&gt;
| v1472&lt;br /&gt;
| 02&lt;br /&gt;
| 2.28-0&lt;br /&gt;
|-&lt;br /&gt;
| [[2.0.0-2|2.0.0]]&lt;br /&gt;
| v2516&lt;br /&gt;
| 09&lt;br /&gt;
| 2.29-7&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-3|2.1.0]]&lt;br /&gt;
| v3553&lt;br /&gt;
| 0B&lt;br /&gt;
| 2.30-18&lt;br /&gt;
| 0608builder&lt;br /&gt;
|-&lt;br /&gt;
| [[2.2.0-X|2.2.0]]&lt;br /&gt;
| v4595&lt;br /&gt;
| 0F&lt;br /&gt;
| 2.31-40&lt;br /&gt;
| 0909builder&lt;br /&gt;
|-&lt;br /&gt;
| [[3.0.0-5|3.0.0]]&lt;br /&gt;
| v5647&lt;br /&gt;
| 18&lt;br /&gt;
| 2.32-15&lt;br /&gt;
| 1128builder&lt;br /&gt;
|-&lt;br /&gt;
| [[4.0.0-7|4.0.0]]&lt;br /&gt;
| v6677&lt;br /&gt;
| 1D&lt;br /&gt;
| 2.33-4&lt;br /&gt;
| 0406builder&lt;br /&gt;
|-&lt;br /&gt;
| [[4.1.0-8|4.1.0]]&lt;br /&gt;
| v7712&lt;br /&gt;
| 1F&lt;br /&gt;
| 2.34-0&lt;br /&gt;
| 0508builder&lt;br /&gt;
|-&lt;br /&gt;
| [[5.0.0-11|5.0.0]]&lt;br /&gt;
| v8758&lt;br /&gt;
| 25&lt;br /&gt;
| 2.35-6&lt;br /&gt;
| 0228builder&lt;br /&gt;
|-&lt;br /&gt;
| [[5.1.0-11|5.1.0]]&lt;br /&gt;
| v9792&lt;br /&gt;
| 26&lt;br /&gt;
| 2.36-0&lt;br /&gt;
| 0401builder&lt;br /&gt;
|-&lt;br /&gt;
| [[6.0.0-11|6.0.0]]&lt;br /&gt;
| v10833&lt;br /&gt;
| 29&lt;br /&gt;
| 2.37-0&lt;br /&gt;
| 0520builder&lt;br /&gt;
|-&lt;br /&gt;
| [[6.1.0-11|6.1.0]]&lt;br /&gt;
| v11872&lt;br /&gt;
| 2A&lt;br /&gt;
| 2.38-0&lt;br /&gt;
| 0625builder&lt;br /&gt;
|-&lt;br /&gt;
| [[7.0.0-13|7.0.0]]&lt;br /&gt;
| v12916&lt;br /&gt;
| 2E&lt;br /&gt;
| 2.39-4&lt;br /&gt;
| 1125builder&lt;br /&gt;
|-&lt;br /&gt;
| [[7.2.0-17|7.2.0]]&lt;br /&gt;
| v13956&lt;br /&gt;
| 30&lt;br /&gt;
| 2.40-0&lt;br /&gt;
| 0404builder&lt;br /&gt;
|-&lt;br /&gt;
| [[8.0.0-18|8.0.0]]&lt;br /&gt;
| v15047&lt;br /&gt;
| 37&lt;br /&gt;
| 2.44-6&lt;br /&gt;
| 0701builder&lt;br /&gt;
|-&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
| 2.45-5&lt;br /&gt;
|-&lt;br /&gt;
| [[9.0.0-20|9.0.0]]&lt;br /&gt;
| v17120&lt;br /&gt;
| 38&lt;br /&gt;
| 2.46-0&lt;br /&gt;
| 0828builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.3.0-21|9.3.0]]&lt;br /&gt;
| v18182&lt;br /&gt;
| 3F&lt;br /&gt;
| 2.48-3&lt;br /&gt;
| 1125builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.5.0-22|9.5.0]]&lt;br /&gt;
| v19216&lt;br /&gt;
| 40&lt;br /&gt;
| 2.49-0&lt;br /&gt;
| 0126builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.6.0-24|9.6.0]]&lt;br /&gt;
| v20262&lt;br /&gt;
| 49&lt;br /&gt;
| 2.50-1&lt;br /&gt;
| 0311builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.0.0-27|10.0.0]]&lt;br /&gt;
| v21288&lt;br /&gt;
| 4B&lt;br /&gt;
| 2.50-7&lt;br /&gt;
| 0812builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.2.0-28|10.2.0]]&lt;br /&gt;
| v22313&lt;br /&gt;
| 4C&lt;br /&gt;
| 2.50-9&lt;br /&gt;
| 1009builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.4.0-29|10.4.0]]&lt;br /&gt;
| v23341&lt;br /&gt;
| 50&lt;br /&gt;
| 2.50-11&lt;br /&gt;
| 1224builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.0.0-33|11.0.0]]&lt;br /&gt;
| v24368&lt;br /&gt;
| 52&lt;br /&gt;
| 2.51-0&lt;br /&gt;
| 0406builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.1.0-34|11.1.0]]&lt;br /&gt;
| v25396&lt;br /&gt;
| 56&lt;br /&gt;
| 2.51-2&lt;br /&gt;
| 0805builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.2.0-35|11.2.0]]&lt;br /&gt;
| v26432&lt;br /&gt;
| 58&lt;br /&gt;
| 2.52-0&lt;br /&gt;
| 1015builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.3.0-36|11.3.0]]&lt;br /&gt;
| v27476&lt;br /&gt;
| 5C&lt;br /&gt;
| 2.53-0&lt;br /&gt;
| 0126builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.4.0-37|11.4.0]]&lt;br /&gt;
| v28512&lt;br /&gt;
| 5E&lt;br /&gt;
| 2.54-0&lt;br /&gt;
| 0314builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.8.0-41|11.8.0]]&lt;br /&gt;
| v29557&lt;br /&gt;
| 64&lt;br /&gt;
| 2.55-0&lt;br /&gt;
| 0710pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.12.0-44|11.12.0]]&lt;br /&gt;
| v30593&lt;br /&gt;
| 66&lt;br /&gt;
| 2.56-0&lt;br /&gt;
| 1021pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.14.0-46|11.14.0]]&lt;br /&gt;
| v31633&lt;br /&gt;
| 69&lt;br /&gt;
| 2.57-0&lt;br /&gt;
| 0929pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.16.0-48|11.16.0]]&lt;br /&gt;
| v32673&lt;br /&gt;
| 6C&lt;br /&gt;
| 2.58-0&lt;br /&gt;
| 0701pseg-ciuser&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above kernel/FIRM versions are in the format: &amp;lt;KERNEL_VERSIONMAJOR&amp;gt;.&amp;lt;KERNEL_VERSIONMINOR&amp;gt;-&amp;lt;KERNEL_VERSIONREVISION&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== SAFE_MODE_FIRM ===&lt;br /&gt;
SAFE_MODE is used for running the [[System_Settings#System_Updater|System Updater]]. SAFE_MODE_FIRM and NATIVE_FIRM for the initial versions are exactly the same, except for the system core version fields. Kernel/FIRM versions for SAFE_MODE_FIRM are: (old3ds) v432 = 3.27-0, v5632 = 3.32-0, (new3ds) v16081 = 3.45-3.&lt;br /&gt;
&lt;br /&gt;
=== TWL_FIRM ===&lt;br /&gt;
TWL_FIRM handles DS(i) backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
The 3DS-mode ARM9 core seems to switch into DSi-mode(for running DSi-mode ARM9 code) by writing to a [[PDN]] register(this changes the memory layout to DSi-mode / etc, therefore this register poke *must* be executed from ITCM). This is the final 3DS-mode register poke before the ARM9 switches into DSi-mode. DS(i)-mode ARM7 code is run on the internal [[ARM7]] core, which is started up during TWL_FIRM boot. Trying to read from the exception-vector region(address 0x0) under this DSi-mode ARM7 seems to only return 0x00/0xFF data. Also note that this DSi-mode ARM7 runs code(stored in TWL_FIRM) which pokes some DSi-mode registers that on the DSi were used for disabling access to the DSi bootROMs, however these registers do not affect the 3DS DSi-mode ARM9/ARM7 &amp;quot;bootrom&amp;quot; region(exceptionvector region + 0x8000) at all.&lt;br /&gt;
&lt;br /&gt;
For shutting down the system, TWL_FIRM writes u8 value 8 to [[I2C]] MCU register 0x20. For returning to 3DS-mode, TWL_FIRM writes value 4 to that MCU register to trigger a hardware system reboot.&lt;br /&gt;
&lt;br /&gt;
The TWL_FIRM ARM11-process includes a TWL bootloader, see [http://dsibrew.org/wiki/Bootloader here] and [[Memory_layout#Detailed_TWL_FIRM_ARM11_Memory|here]] for details.&lt;br /&gt;
&lt;br /&gt;
TWL_FIRM verifies all TWL RSA padding with the following. This is different from the DSi &amp;quot;BIOS&amp;quot; code.&lt;br /&gt;
* The first byte must be 0x0.&lt;br /&gt;
* The second byte must be 0x1 or 0x2.&lt;br /&gt;
* Executes a while(&amp;lt;value of byte at current pos in RSA message&amp;gt;). When the second_byte in the message is 0x1, the byte at curpos must be 0xFF(otherwise the non-zero value of the byte at curpos doesn&#039;t matter). This loop must find a zero byte before offset 0x7F in the message otherwise an error is returned.&lt;br /&gt;
* Returns an address for msg_curpos+1.&lt;br /&gt;
totalhashdatasize = rsasig_bytesize - above position in the message for the hashdata. The actual &amp;quot;totalhashdatasize&amp;quot; in the RSA message must be &amp;lt;= &amp;lt;expected hashdata_size&amp;gt;(0x74 for bootloader). The TWL_FIRM code copies the RSA &amp;quot;hashdata&amp;quot; to the output buffer, using the actual size of the RSA &amp;quot;hashdata&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AGB_FIRM ===&lt;br /&gt;
AGB_FIRM handles running GBA VC titles. The ARM9 FIRM section for TWL_FIRM and AGB_FIRM are exactly the same (for TWL_FIRM and AGB_FIRM versions which were updated with the same system-update).&lt;br /&gt;
&lt;br /&gt;
== FIRM Launch Parameters ==&lt;br /&gt;
The FIRM-launch parameters structure is located at FCRAM+0, size 0x1000-bytes. The ARM11-kernel copies this structure elsewhere, then clears the 0x1000-bytes at FCRAM+0. It will not handle an existing structure at FCRAM+0 if [[CONFIG Registers#CFG_BOOTENV|CFG_BOOTENV]] is zero. The ARM9 kernel [[Configuration_Memory#0x1FF80016|writes some values]] about the boot environment to AXI WRAM during init to enable this.&lt;br /&gt;
&lt;br /&gt;
Note: it seems NATIVE_FIRM ARM11-kernel didn&#039;t parse this during boot until [[3.0.0-5|3.0.0-X]]?&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TWL auto-load parameters, passed as-is onto the new title. NS will only read the oldTitleId field from it and add it to the TWL title list if it&#039;s a CTR titleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| 0x100&lt;br /&gt;
| &#039;TLNC&#039; block created by TWL applications, handled by NS for backwards-compatibility purposes. See [[NS#Auto-boot|here]] for more info.&lt;br /&gt;
|-&lt;br /&gt;
| 0x400&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x410&lt;br /&gt;
| 0xC&lt;br /&gt;
| This is used for overriding the FIRM_* fields in [[Configuration_Memory]], when the flag listed below is set, in the following order(basically just data-copy from here to 0x1FF80060): &amp;quot;FIRM_?&amp;quot;, FIRM_VERSIONREVISION, FIRM_VERSIONMINOR, FIRM_VERSIONMAJOR, FIRM_SYSCOREVER, and FIRM_CTRSDKVERSION.&lt;br /&gt;
|-&lt;br /&gt;
| 0x438&lt;br /&gt;
| 0x4&lt;br /&gt;
| The kernel checks this field for value 0xFFFF, if it matches the kernel uses the rest of these parameter fields, otherwise FIRM-launch parameters fields are ignored by the kernel.&lt;br /&gt;
|-&lt;br /&gt;
| 0x43C&lt;br /&gt;
| 0x4&lt;br /&gt;
| CRC32, this is calculated starting at FIRM-params offset 0x400, with size 0x140(with this field cleared to zero during calculation). When invalid the kernel clears the entire buffer used for storing the FIRM-params, therefore no actual FIRM-params are handled after that.&lt;br /&gt;
|-&lt;br /&gt;
| 0x440&lt;br /&gt;
| 0x10&lt;br /&gt;
| Titleinfo [[Filesystem_services#ProgramInfo|Program Info]], used by NS during NS startup, to launch the specified title when the below flag is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x450&lt;br /&gt;
| 0x10&lt;br /&gt;
| Titleinfo [[Filesystem_services#ProgramInfo|Program Info]]. This might be used for returning to the specified title, once the above launched title terminates?&lt;br /&gt;
|-&lt;br /&gt;
| 0x460&lt;br /&gt;
| 0x4&lt;br /&gt;
| Bit0: 0 = titleinfo structure isn&#039;t set, 1 = titleinfo structure is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x480&lt;br /&gt;
| 0x20&lt;br /&gt;
| This can be set via buf1 for [[APT:SendDeliverArg]]/[[APT:StartApplication]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A0&lt;br /&gt;
| 0x10&lt;br /&gt;
| This can be set by [[NSS:SetWirelessRebootInfo]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B0&lt;br /&gt;
| 0x14&lt;br /&gt;
| SHA1-HMAC of the banner for TWL/NTR titles. This can be set by [[NSS:SetTWLBannerHMAC]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x500&lt;br /&gt;
| 0x40&lt;br /&gt;
| This is used by [[APT:LoadSysMenuArg]] and [[APT:StoreSysMenuArg]].&lt;br /&gt;
|-&lt;br /&gt;
| 0xD50&lt;br /&gt;
| 0x20&lt;br /&gt;
| Atheros WiFi configuration struct&lt;br /&gt;
|-&lt;br /&gt;
| 0xD70&lt;br /&gt;
| 0x290&lt;br /&gt;
| [[Config Savegame|Config]] data struct for LGY FIRM.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Flags from offset 0x400:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| This can be used for overriding the default FCRAM [[Memory_layout|memory-regions]] allocation sizes(APPLICATION, SYSTEM, and BASE). The values for this is the same as [[Configuration_Memory#APPMEMTYPE|Configmem-APPMEMTYPE]]. Values 0-1 are handled the same way by the kernel. However for NS, 0=titleinfo structure for launching a title isn&#039;t set, while non-zero=titleinfo structure is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Setting bit0 here enables overriding the FIRM_* fields in [[Configuration_Memory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Atheros WiFi configuration struct for booting TWL_FIRM, from offset 0xD50. This struct is copied directly to 0x20005E0 in DSi memory. Since DSi cartridge ROMs include SDIO drivers for the wireless card and can&#039;t be updated, this structure allows interoperability between the original DSi wireless cards (AR6002/DWM-W015 and AR6013/DWM-W024) as well as the 3DS&#039;s AR6014/DWM-W028.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| WiFi Board Type (1=DWM-W015, 2=DWM-W024, 3=DWM-W028; 0x03 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Unknown (0x00)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| CRC16 from 0x4 to 0x20 (0x1C bytes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM Vars/Host Interest address (0x520000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM base (0x520000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM size (0x20000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| Unknown (Zeroed)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Config Savegame|Config]] struct for booting LGY FIRMs from offset 0xD70:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| RTC compensation value (config block 0x30000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Sound output mode (config block 0x70001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| System language (config block 0xA0002).&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[Cfg:SecureInfoGetRegion|Region from SecureInfo]] (&amp;quot;pseudo-block&amp;quot; 0x140000 in LGY FIRM).&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xF&lt;br /&gt;
| [[CfgS:SecureInfoGetSerialNo|Serial number from SecureInfo]] (&amp;quot;pseudo-block&amp;quot; 0x140001 in LGY FIRM).&lt;br /&gt;
|-&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x1&lt;br /&gt;
| TWL country code (config block 0x100002).&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x10&lt;br /&gt;
| TWL &amp;quot;movable&amp;quot; UID, used for DSiWare exports (config block 0x100003).&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x2&lt;br /&gt;
| TWL EULA info (config block 0x100000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x1&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x27&lt;br /&gt;
| 0x1&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x94&lt;br /&gt;
| TWL parental control data (config block 0x100001).&lt;br /&gt;
|-&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 0x2&lt;br /&gt;
| LCD flicker calibration data (config block 0x50000).&lt;br /&gt;
|-&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 0x2&lt;br /&gt;
| Backlight data (config block 0x50001).&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 0x38&lt;br /&gt;
| Backlight PWM table (config block 0x50002).&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0x20&lt;br /&gt;
| Power saving mode (ABL) calibration (config block 0x50004).&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x134&lt;br /&gt;
| CODEC calibration data (config block 0x20000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x24C&lt;br /&gt;
| 0x10&lt;br /&gt;
| Touch screen calibration data (config block 0x40000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x25C&lt;br /&gt;
| 0x1C&lt;br /&gt;
| Analog stick calibration data (config block 0x40001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x278&lt;br /&gt;
| 0x4&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x27C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x280&lt;br /&gt;
| 0x8&lt;br /&gt;
| User time offset (config block 0x30001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x288&lt;br /&gt;
| 0x2&lt;br /&gt;
| CRC16 over the above fields from offset 0x0, size 0x288. If not valid, LGY FIRM uses dummy data from .(ro)data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28A&lt;br /&gt;
| 0x2&lt;br /&gt;
| Version, maybe? If non-zero, the size (below) is hardcoded (currently) to value 0x288, otherwise the size field below is used.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Value 0x288 (size used for verifying the CRC16).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Cleared to zero&amp;quot; fields above are not read at all by LGY FIRM.&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=FIRM&amp;diff=22192</id>
		<title>FIRM</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=FIRM&amp;diff=22192"/>
		<updated>2023-03-16T16:59:19Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: 11.16&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes the file format for the [[Title list#00040138 - System Firmware|3DS&#039; Firmware]], it contains up to four &#039;sections&#039; of data comprising the ARM9 and ARM11 kernels, and some fundamental processes. The firmware sections are not encrypted. In a nutshell, a FIRM contains all the data required to set up the ARM9 and ARM11 kernels, and basic operating functionality.&lt;br /&gt;
&lt;br /&gt;
The ARM9 section contains the ARM9 kernel (and loader) and the Process9 NCCH (which is the only process run in user mode on the ARM9). The ARM11 sections contain the ARM11 kernel (and loader), and various ARM11 process NCCHs. For NATIVE_FIRM/SAFE_MODE_FIRM these ARM11 processes are sm, fs, pm, loader, and pxi. Normally the 4th section is not used. The code loaded from FIRM is constantly running on the system until another FIRM is launched. The ARM11 kernel is hard-coded to always decompress the ExeFS .code of embedded ARM11 NCCHs without checking the exheader compression bit.&lt;br /&gt;
&lt;br /&gt;
== FIRM Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  4&lt;br /&gt;
|  Magic &#039;FIRM&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  0x004&lt;br /&gt;
|  4&lt;br /&gt;
|  Boot priority (highest value = max prio), this is normally zero.&lt;br /&gt;
|-&lt;br /&gt;
|  0x008&lt;br /&gt;
|  4&lt;br /&gt;
|  ARM11 Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
|  0x00C&lt;br /&gt;
|  4&lt;br /&gt;
|  ARM9 Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  0x030&lt;br /&gt;
|  Reserved&lt;br /&gt;
|-&lt;br /&gt;
|  0x040&lt;br /&gt;
|  0x0C0 (0x030*4)&lt;br /&gt;
|  Firmware Section Headers&lt;br /&gt;
|-&lt;br /&gt;
|  0x100&lt;br /&gt;
|  0x100&lt;br /&gt;
|  RSA-2048 signature of the FIRM header&#039;s SHA-256 hash. The signature is checked when bootrom/Process9 are doing FIRM-launch (with the public key being hardcoded in each). The signature is not checked when installing FIRM to the NAND firm0/firm1 partitions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Firmware Section Headers ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  4&lt;br /&gt;
|  Byte offset&lt;br /&gt;
|-&lt;br /&gt;
|  0x004&lt;br /&gt;
|  4&lt;br /&gt;
|  Physical address where the section is loaded to.&lt;br /&gt;
|-&lt;br /&gt;
|  0x008&lt;br /&gt;
|  4&lt;br /&gt;
|  Byte-size.  While loading FIRM this is the field used to determine whether the section exists or not, by checking for value 0x0.&lt;br /&gt;
|-&lt;br /&gt;
|  0x00C&lt;br /&gt;
|  4&lt;br /&gt;
|  Copy-method (0 = NDMA, 1 = XDMA, 2 = CPU mem-copy), Process9 ignores this field. Boot9 doesn&#039;t immediately throw an error when this isn&#039;t 0..2. In that case it will jump over section-data-loading which then results in the hash verification with the below hash being done with the hash already stored in the SHA hardware.&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  0x020&lt;br /&gt;
|  SHA-256 Hash of Firmware Section&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The contents of individual sections &#039;&#039;may&#039;&#039; be encrypted if the FIRM is not meant to be booted from NAND, i.e. if it is meant to be booted from SPI flash or NTR cartridge. If hash checks fail for all FIRM sections if treated as plaintext, it may be worth trying to check if the sections are encrypted. The encryption is detailed on [[Bootloader#Non-NAND_FIRM_boot|the bootloader page]].&lt;br /&gt;
&lt;br /&gt;
== [[New_3DS]] FIRM ==&lt;br /&gt;
For New3DS firmwares (NATIVE_FIRM, TWL_FIRM, ..), the ARM9 FIRM binary has an additional layer of crypto. At the end of each ARM9 binary, there&#039;s a plaintext loader. The format of the FIRM header is identical to regular 3DS FIRM(the RSA modulo is the same as regular 3DS too).&lt;br /&gt;
&lt;br /&gt;
Before checking [[CONFIG_Registers|CFG_SYSPROT9]] the loader main() does the following:&lt;br /&gt;
* On [[9.5.0-22|9.5.0-X]]: executes a nop instruction with r0=0 and r1=&amp;lt;address of arm9binhdr+0x50&amp;gt;.&lt;br /&gt;
* Clears bit6 in [[AES_Registers|REG_AESKEYCNT]].&lt;br /&gt;
&lt;br /&gt;
If [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 is clear (which means the OTP area is unlocked and so it knows that this is a hard reboot), it does the following things:&lt;br /&gt;
* Clears 0x200-bytes on the stack, then reads [[Flash_Filesystem|NAND]] sector 0x96(NAND image offset 0x12C00), with size 0x200-bytes into that stack buffer.&lt;br /&gt;
* Checks [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 again, if it&#039;s set then it executes a panic function(set r0-r2=0, execute nop instruction, then execute instruction &amp;quot;bkpt 0x99&amp;quot;).&lt;br /&gt;
* Hashes data from the OTP region [[IO_Registers|0x10012000-0x10012090]] using SHA256 via the [[SHA_Registers|SHA]] hardware.&lt;br /&gt;
* Clears bit6 in [[AES_Registers|REG_AESKEYCNT]]. Initializes AES keyslot 0x11 keyX, keyY to the lower and higher portion of the above hash, respectively. Due to the above hashed data, the keyX+keyY here are console-unique.&lt;br /&gt;
* Decrypts the first 0x10-byte block in the above read NAND sector with keyslot 0x11 using AES-ECB. [[9.6.0-24|9.6.0-X]]: Then it decrypts the 0x10-bytes at offset 0x10 in the sector with keyslot 0x11.&lt;br /&gt;
* Then the normalkey, keyX, and keyY, for keyslot 0x11 are cleared to zero. Runs the TWL key-init/etc code which was originally in the ARM9-kernel, then writes 0x2 to [[CONFIG_Registers|CFG_SYSPROT9]] to disable the OTP area.&lt;br /&gt;
* Then it uses the above decrypted block from sector+0 to set the normalkey for keyslot 0x11. Decrypts arm9_bin_buf+0 using keyslot 0x11 with AES-ECB, and initialises keyX for keyslot 0x15 with it.&lt;br /&gt;
* [[9.6.0-24|9.6.0-X]]: Then it uses the above decrypted block from sector+0 to set the normalkey for keyslot 0x11. Decrypts a 0x10-byte block from arm9loader .(ro)data using keyslot 0x11 with AES-ECB, and initializes keyX for keyslot 0x18 with it(same block as previous versions).&lt;br /&gt;
* [[9.6.0-24|9.6.0-X]]: Starting with this version keyslot 0x16 keyX init was moved here, see below for details on this. The code for this is same as  [[9.5.0-22|9.5.0-X]], except the decrypted normalkey from sector+0x10 is used for keyslot 0x11 instead.&lt;br /&gt;
* Initialises KeyX for keyslots 0x18..0x1F(0x19..0x1F with [[9.6.0-24|9.6.0-X]]) with the output of decrypting a 0x10-byte block with AES-ECB using keyslot 0x11. This block was changed to a new one separate from keyslot 0x18, starting with [[9.6.0-24|9.6.0-X]]. The last byte in this 0x10-byte input block is increased by 0x01 after initializing each keyslot. Before doing the crypto each time, the loader sets the normal-key for keyslot 0x11 to the plaintext normalkey from sector+0(+0x10 with [[9.6.0-24|9.6.0-X]]). These are New3DS-specific keys.&lt;br /&gt;
* [[9.5.0-22|9.5.0-X]](moved to above with [[9.6.0-24|9.6.0-X]]): Sets the normal-key for keyslot 0x11 to the same one already decrypted on the stack. Decrypts the 0x10-byte block at arm9binhdr+0x60 with AES-ECB using keyslot 0x11, then sets the keyX for keyslot 0x16 to the output data.&lt;br /&gt;
* [[9.5.0-22|9.5.0-X]]: The normalkey, keyX, and keyY, for keyslot 0x11 are then cleared to zero.&lt;br /&gt;
&lt;br /&gt;
When [[CONFIG_Registers#CFG_SYSPROT9|CFG_SYSPROT9]] bit 1 is set(which means this happens only when this loader runs again for firm-launch), the normalkey, keyX, and keyY, for keyslot 0x11 are cleared to zero.&lt;br /&gt;
&lt;br /&gt;
It sets KeyY for keyslot 0x15(0x16 with [[9.5.0-22|9.5.0-X]]) to arm9_bin_buf+16, the CTR to arm9_bin_buf+32 (both are unique for every version). It then proceeds to decrypt the binary with AES-CTR. When done, it sets the normal-key for the keyslot used for binary decryption to zeros. It then decrypts arm9_bin_buf+64 using an hardcoded keyY for keyslot 0x15([[9.5.0-22|9.5.0-X]]/[[9.6.0-24|9.6.0-X]] also uses keyslot 0x15), sets the normal-key for this keyslot to zeros again, then makes sure the output block is all zeroes. If it is, it does some cleanup then it jumps to the entrypoint for the decrypted binary. Otherwise it will clear the keyX, keyY, and normal-key for each of the keyslots initialized by this loader (on [[9.6.0-24|9.6.0-X]]+, on older versions this was bugged and cleared keys 0x00..0x07 instead of 0x18..0x1F), do cleanup(same cleanup as when the decrypted block is all-zero) then just loop forever.&lt;br /&gt;
&lt;br /&gt;
Thus, the ARM9 binary has the following header:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|  0x000&lt;br /&gt;
|  16&lt;br /&gt;
|  Encrypted KeyX (same for all FIRM&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
|  0x010&lt;br /&gt;
|  16&lt;br /&gt;
|  KeyY&lt;br /&gt;
|-&lt;br /&gt;
|  0x020&lt;br /&gt;
|  16&lt;br /&gt;
|  CTR&lt;br /&gt;
|-&lt;br /&gt;
|  0x030&lt;br /&gt;
|  8&lt;br /&gt;
|  Size of encrypted binary, as ASCII text?&lt;br /&gt;
|-&lt;br /&gt;
|  0x038&lt;br /&gt;
|  8&lt;br /&gt;
|  ?&lt;br /&gt;
|-&lt;br /&gt;
|  0x040&lt;br /&gt;
|  16&lt;br /&gt;
|  Control block&lt;br /&gt;
|-&lt;br /&gt;
|  0x050&lt;br /&gt;
|  16&lt;br /&gt;
|  Added with [[9.5.0-22|9.5.0-X]]. Only used for hardware debugging: a nop instruction is executed with r0=0 and r1=&amp;lt;address of this data&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|  0x060&lt;br /&gt;
|  16&lt;br /&gt;
|  Added with [[9.5.0-22|9.5.0-X]]. Encrypted keyX for keyslot 0x16.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Originally the padding after the header before offset 0x800(start of actual ARM9-binary) was 0xFF bytes, with [[9.5.0-22|9.5.0-X]] this was changed to 0x0.&lt;br /&gt;
&lt;br /&gt;
For the New3DS NATIVE_FIRM arm9-section header, the only difference between the [[8.1.0-0_New3DS]] version and the [[9.0.0-20]] version is that the keyY, CTR, and the block at 0x30 in the header were updated.&lt;br /&gt;
&lt;br /&gt;
===New3DS ARM9 binary loader versions===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  FIRM system version(s)&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| [[8.1.0-0_New3DS]] - [[9.3.0-21|9.3.0-X]]&lt;br /&gt;
| Initial version.&lt;br /&gt;
|-&lt;br /&gt;
| [[9.5.0-22|9.5.0-X]]&lt;br /&gt;
| Added keyX initialization for keyslot 0x16(see above), and added code for clearing keyslot 0x11 immediately after the code finishes using keyslot 0x11. The keyslot used for arm9bin decryption was changed from 0x15 to 0x16. Added code for clearing keyslot 0x16 when control-block decryption fails. Added code for using arm9bin_hdr+0x50 with a nop instruction, at the very beginning of the main arm9-loader function. Added two new 0x10-blocks to the arm9bin-hdr.&lt;br /&gt;
|-&lt;br /&gt;
| [[9.6.0-24|9.6.0-X]] - [[11.3.0-36|11.3.0-X]]&lt;br /&gt;
| See above and [[9.6.0-24|here]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===New3DS ARM9 kernel===&lt;br /&gt;
The only actual code-difference for the Old3DS/New3DS ARM9-kernels&#039; crt0, besides TWL AES / [[IO_Registers|0x10012000]] related code, is that the New3DS ARM9-kernel writes 0x1 to [[CONFIG_Registers|REG_EXTMEMCNT9]] in the crt0.&lt;br /&gt;
&lt;br /&gt;
===New3DS Process9===&lt;br /&gt;
The following is all of the differences for Old3DS/New3DS Process9 with [[9.3.0-21|9.3.0-X]]:&lt;br /&gt;
* The FIRM-launch code called at the end of the New3DS proc9 main() has different mem-range checks.&lt;br /&gt;
* In the New3DS proc9, the v6.0/v7.0 keyinit function at the very beginning(before the original code) had additional code added for setting [[Flash_Filesystem|CTRNAND]] [[AES_Registers|keyslot]] 0x5, with keydata from .data. After setting the keyY, the keyY in .data is cleared.&lt;br /&gt;
* In New3DS proc9, the functions for getting the gamecard crypto keyslots / NCCH keyslot can return New3DS keyslots when New3DS flags(NCSD/NCCH) are set.&lt;br /&gt;
* The code/data for the binary near the end of arm9mem is slightly different, because of memory-region sizes.&lt;br /&gt;
* The only difference in .data(besides the above code binary) is that the New3DS proc9 has an additional 0x10-byte block for the keyslot 0x5 keyY, see above.&lt;br /&gt;
&lt;br /&gt;
== Variations ==&lt;br /&gt;
There exists different official firmwares for the 3DS: The default one (NATIVE_FIRM) is used to run all 3DS content and boots by default, while backwards compatibility is handled by TWL_FIRM and AGB_FIRM. There furthermore is a rescue mode provided by SAFE_MODE_FIRM.&lt;br /&gt;
&lt;br /&gt;
=== NATIVE_FIRM ===&lt;br /&gt;
NATIVE_FIRM is the FIRM which is installed to the [[Flash_Filesystem|NAND]] firm partitions, which is loaded by bootrom.&lt;br /&gt;
&lt;br /&gt;
Version history:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  System version&lt;br /&gt;
!  old 3DS title version&lt;br /&gt;
!  old 3DS hex title contentID&lt;br /&gt;
!  Kernel/FIRM version (old 3DS/new 3DS)&lt;br /&gt;
!  FIRM ARM11-sysmodule Product Code&lt;br /&gt;
|-&lt;br /&gt;
| [[Factory_Setup|Factory]] FIRM (titleID 00040001-00000002)&lt;br /&gt;
| v0&lt;br /&gt;
| 00&lt;br /&gt;
| 2.3-0&lt;br /&gt;
|-&lt;br /&gt;
| Pre-1.0. Referenced in the v1.0 Home Menu NCCH plain-region.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 2.23-X&lt;br /&gt;
|-&lt;br /&gt;
| [[1.0.0-0|1.0.0]]&lt;br /&gt;
| v432&lt;br /&gt;
| 00&lt;br /&gt;
| 2.27-0&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-1|1.1.0]]&lt;br /&gt;
| v1472&lt;br /&gt;
| 02&lt;br /&gt;
| 2.28-0&lt;br /&gt;
|-&lt;br /&gt;
| [[2.0.0-2|2.0.0]]&lt;br /&gt;
| v2516&lt;br /&gt;
| 09&lt;br /&gt;
| 2.29-7&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-3|2.1.0]]&lt;br /&gt;
| v3553&lt;br /&gt;
| 0B&lt;br /&gt;
| 2.30-18&lt;br /&gt;
| 0608builder&lt;br /&gt;
|-&lt;br /&gt;
| [[2.2.0-X|2.2.0]]&lt;br /&gt;
| v4595&lt;br /&gt;
| 0F&lt;br /&gt;
| 2.31-40&lt;br /&gt;
| 0909builder&lt;br /&gt;
|-&lt;br /&gt;
| [[3.0.0-5|3.0.0]]&lt;br /&gt;
| v5647&lt;br /&gt;
| 18&lt;br /&gt;
| 2.32-15&lt;br /&gt;
| 1128builder&lt;br /&gt;
|-&lt;br /&gt;
| [[4.0.0-7|4.0.0]]&lt;br /&gt;
| v6677&lt;br /&gt;
| 1D&lt;br /&gt;
| 2.33-4&lt;br /&gt;
| 0406builder&lt;br /&gt;
|-&lt;br /&gt;
| [[4.1.0-8|4.1.0]]&lt;br /&gt;
| v7712&lt;br /&gt;
| 1F&lt;br /&gt;
| 2.34-0&lt;br /&gt;
| 0508builder&lt;br /&gt;
|-&lt;br /&gt;
| [[5.0.0-11|5.0.0]]&lt;br /&gt;
| v8758&lt;br /&gt;
| 25&lt;br /&gt;
| 2.35-6&lt;br /&gt;
| 0228builder&lt;br /&gt;
|-&lt;br /&gt;
| [[5.1.0-11|5.1.0]]&lt;br /&gt;
| v9792&lt;br /&gt;
| 26&lt;br /&gt;
| 2.36-0&lt;br /&gt;
| 0401builder&lt;br /&gt;
|-&lt;br /&gt;
| [[6.0.0-11|6.0.0]]&lt;br /&gt;
| v10833&lt;br /&gt;
| 29&lt;br /&gt;
| 2.37-0&lt;br /&gt;
| 0520builder&lt;br /&gt;
|-&lt;br /&gt;
| [[6.1.0-11|6.1.0]]&lt;br /&gt;
| v11872&lt;br /&gt;
| 2A&lt;br /&gt;
| 2.38-0&lt;br /&gt;
| 0625builder&lt;br /&gt;
|-&lt;br /&gt;
| [[7.0.0-13|7.0.0]]&lt;br /&gt;
| v12916&lt;br /&gt;
| 2E&lt;br /&gt;
| 2.39-4&lt;br /&gt;
| 1125builder&lt;br /&gt;
|-&lt;br /&gt;
| [[7.2.0-17|7.2.0]]&lt;br /&gt;
| v13956&lt;br /&gt;
| 30&lt;br /&gt;
| 2.40-0&lt;br /&gt;
| 0404builder&lt;br /&gt;
|-&lt;br /&gt;
| [[8.0.0-18|8.0.0]]&lt;br /&gt;
| v15047&lt;br /&gt;
| 37&lt;br /&gt;
| 2.44-6&lt;br /&gt;
| 0701builder&lt;br /&gt;
|-&lt;br /&gt;
| [[8.1.0-0_New3DS]]&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
| 2.45-5&lt;br /&gt;
|-&lt;br /&gt;
| [[9.0.0-20|9.0.0]]&lt;br /&gt;
| v17120&lt;br /&gt;
| 38&lt;br /&gt;
| 2.46-0&lt;br /&gt;
| 0828builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.3.0-21|9.3.0]]&lt;br /&gt;
| v18182&lt;br /&gt;
| 3F&lt;br /&gt;
| 2.48-3&lt;br /&gt;
| 1125builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.5.0-22|9.5.0]]&lt;br /&gt;
| v19216&lt;br /&gt;
| 40&lt;br /&gt;
| 2.49-0&lt;br /&gt;
| 0126builder&lt;br /&gt;
|-&lt;br /&gt;
| [[9.6.0-24|9.6.0]]&lt;br /&gt;
| v20262&lt;br /&gt;
| 49&lt;br /&gt;
| 2.50-1&lt;br /&gt;
| 0311builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.0.0-27|10.0.0]]&lt;br /&gt;
| v21288&lt;br /&gt;
| 4B&lt;br /&gt;
| 2.50-7&lt;br /&gt;
| 0812builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.2.0-28|10.2.0]]&lt;br /&gt;
| v22313&lt;br /&gt;
| 4C&lt;br /&gt;
| 2.50-9&lt;br /&gt;
| 1009builder&lt;br /&gt;
|-&lt;br /&gt;
| [[10.4.0-29|10.4.0]]&lt;br /&gt;
| v23341&lt;br /&gt;
| 50&lt;br /&gt;
| 2.50-11&lt;br /&gt;
| 1224builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.0.0-33|11.0.0]]&lt;br /&gt;
| v24368&lt;br /&gt;
| 52&lt;br /&gt;
| 2.51-0&lt;br /&gt;
| 0406builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.1.0-34|11.1.0]]&lt;br /&gt;
| v25396&lt;br /&gt;
| 56&lt;br /&gt;
| 2.51-2&lt;br /&gt;
| 0805builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.2.0-35|11.2.0]]&lt;br /&gt;
| v26432&lt;br /&gt;
| 58&lt;br /&gt;
| 2.52-0&lt;br /&gt;
| 1015builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.3.0-36|11.3.0]]&lt;br /&gt;
| v27476&lt;br /&gt;
| 5C&lt;br /&gt;
| 2.53-0&lt;br /&gt;
| 0126builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.4.0-37|11.4.0]]&lt;br /&gt;
| v28512&lt;br /&gt;
| 5E&lt;br /&gt;
| 2.54-0&lt;br /&gt;
| 0314builder&lt;br /&gt;
|-&lt;br /&gt;
| [[11.8.0-41|11.8.0]]&lt;br /&gt;
| v29557&lt;br /&gt;
| 64&lt;br /&gt;
| 2.55-0&lt;br /&gt;
| 0710pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.12.0-44|11.12.0]]&lt;br /&gt;
| v30593&lt;br /&gt;
| 66&lt;br /&gt;
| 2.56-0&lt;br /&gt;
| 1021pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.14.0-46|11.14.0]]&lt;br /&gt;
| v31633&lt;br /&gt;
| 69&lt;br /&gt;
| 2.57-0&lt;br /&gt;
| 0929pseg-ciuser&lt;br /&gt;
|-&lt;br /&gt;
| [[11.16.0-48|11.16.0]]&lt;br /&gt;
| v32673&lt;br /&gt;
| 6C&lt;br /&gt;
| 2.58-0&lt;br /&gt;
| 0710pseg-ciuser&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above kernel/FIRM versions are in the format: &amp;lt;KERNEL_VERSIONMAJOR&amp;gt;.&amp;lt;KERNEL_VERSIONMINOR&amp;gt;-&amp;lt;KERNEL_VERSIONREVISION&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== SAFE_MODE_FIRM ===&lt;br /&gt;
SAFE_MODE is used for running the [[System_Settings#System_Updater|System Updater]]. SAFE_MODE_FIRM and NATIVE_FIRM for the initial versions are exactly the same, except for the system core version fields. Kernel/FIRM versions for SAFE_MODE_FIRM are: (old3ds) v432 = 3.27-0, v5632 = 3.32-0, (new3ds) v16081 = 3.45-3.&lt;br /&gt;
&lt;br /&gt;
=== TWL_FIRM ===&lt;br /&gt;
TWL_FIRM handles DS(i) backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
The 3DS-mode ARM9 core seems to switch into DSi-mode(for running DSi-mode ARM9 code) by writing to a [[PDN]] register(this changes the memory layout to DSi-mode / etc, therefore this register poke *must* be executed from ITCM). This is the final 3DS-mode register poke before the ARM9 switches into DSi-mode. DS(i)-mode ARM7 code is run on the internal [[ARM7]] core, which is started up during TWL_FIRM boot. Trying to read from the exception-vector region(address 0x0) under this DSi-mode ARM7 seems to only return 0x00/0xFF data. Also note that this DSi-mode ARM7 runs code(stored in TWL_FIRM) which pokes some DSi-mode registers that on the DSi were used for disabling access to the DSi bootROMs, however these registers do not affect the 3DS DSi-mode ARM9/ARM7 &amp;quot;bootrom&amp;quot; region(exceptionvector region + 0x8000) at all.&lt;br /&gt;
&lt;br /&gt;
For shutting down the system, TWL_FIRM writes u8 value 8 to [[I2C]] MCU register 0x20. For returning to 3DS-mode, TWL_FIRM writes value 4 to that MCU register to trigger a hardware system reboot.&lt;br /&gt;
&lt;br /&gt;
The TWL_FIRM ARM11-process includes a TWL bootloader, see [http://dsibrew.org/wiki/Bootloader here] and [[Memory_layout#Detailed_TWL_FIRM_ARM11_Memory|here]] for details.&lt;br /&gt;
&lt;br /&gt;
TWL_FIRM verifies all TWL RSA padding with the following. This is different from the DSi &amp;quot;BIOS&amp;quot; code.&lt;br /&gt;
* The first byte must be 0x0.&lt;br /&gt;
* The second byte must be 0x1 or 0x2.&lt;br /&gt;
* Executes a while(&amp;lt;value of byte at current pos in RSA message&amp;gt;). When the second_byte in the message is 0x1, the byte at curpos must be 0xFF(otherwise the non-zero value of the byte at curpos doesn&#039;t matter). This loop must find a zero byte before offset 0x7F in the message otherwise an error is returned.&lt;br /&gt;
* Returns an address for msg_curpos+1.&lt;br /&gt;
totalhashdatasize = rsasig_bytesize - above position in the message for the hashdata. The actual &amp;quot;totalhashdatasize&amp;quot; in the RSA message must be &amp;lt;= &amp;lt;expected hashdata_size&amp;gt;(0x74 for bootloader). The TWL_FIRM code copies the RSA &amp;quot;hashdata&amp;quot; to the output buffer, using the actual size of the RSA &amp;quot;hashdata&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AGB_FIRM ===&lt;br /&gt;
AGB_FIRM handles running GBA VC titles. The ARM9 FIRM section for TWL_FIRM and AGB_FIRM are exactly the same (for TWL_FIRM and AGB_FIRM versions which were updated with the same system-update).&lt;br /&gt;
&lt;br /&gt;
== FIRM Launch Parameters ==&lt;br /&gt;
The FIRM-launch parameters structure is located at FCRAM+0, size 0x1000-bytes. The ARM11-kernel copies this structure elsewhere, then clears the 0x1000-bytes at FCRAM+0. It will not handle an existing structure at FCRAM+0 if [[CONFIG Registers#CFG_BOOTENV|CFG_BOOTENV]] is zero. The ARM9 kernel [[Configuration_Memory#0x1FF80016|writes some values]] about the boot environment to AXI WRAM during init to enable this.&lt;br /&gt;
&lt;br /&gt;
Note: it seems NATIVE_FIRM ARM11-kernel didn&#039;t parse this during boot until [[3.0.0-5|3.0.0-X]]?&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TWL auto-load parameters, passed as-is onto the new title. NS will only read the oldTitleId field from it and add it to the TWL title list if it&#039;s a CTR titleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x300&lt;br /&gt;
| 0x100&lt;br /&gt;
| &#039;TLNC&#039; block created by TWL applications, handled by NS for backwards-compatibility purposes. See [[NS#Auto-boot|here]] for more info.&lt;br /&gt;
|-&lt;br /&gt;
| 0x400&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x410&lt;br /&gt;
| 0xC&lt;br /&gt;
| This is used for overriding the FIRM_* fields in [[Configuration_Memory]], when the flag listed below is set, in the following order(basically just data-copy from here to 0x1FF80060): &amp;quot;FIRM_?&amp;quot;, FIRM_VERSIONREVISION, FIRM_VERSIONMINOR, FIRM_VERSIONMAJOR, FIRM_SYSCOREVER, and FIRM_CTRSDKVERSION.&lt;br /&gt;
|-&lt;br /&gt;
| 0x438&lt;br /&gt;
| 0x4&lt;br /&gt;
| The kernel checks this field for value 0xFFFF, if it matches the kernel uses the rest of these parameter fields, otherwise FIRM-launch parameters fields are ignored by the kernel.&lt;br /&gt;
|-&lt;br /&gt;
| 0x43C&lt;br /&gt;
| 0x4&lt;br /&gt;
| CRC32, this is calculated starting at FIRM-params offset 0x400, with size 0x140(with this field cleared to zero during calculation). When invalid the kernel clears the entire buffer used for storing the FIRM-params, therefore no actual FIRM-params are handled after that.&lt;br /&gt;
|-&lt;br /&gt;
| 0x440&lt;br /&gt;
| 0x10&lt;br /&gt;
| Titleinfo [[Filesystem_services#ProgramInfo|Program Info]], used by NS during NS startup, to launch the specified title when the below flag is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x450&lt;br /&gt;
| 0x10&lt;br /&gt;
| Titleinfo [[Filesystem_services#ProgramInfo|Program Info]]. This might be used for returning to the specified title, once the above launched title terminates?&lt;br /&gt;
|-&lt;br /&gt;
| 0x460&lt;br /&gt;
| 0x4&lt;br /&gt;
| Bit0: 0 = titleinfo structure isn&#039;t set, 1 = titleinfo structure is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x480&lt;br /&gt;
| 0x20&lt;br /&gt;
| This can be set via buf1 for [[APT:SendDeliverArg]]/[[APT:StartApplication]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A0&lt;br /&gt;
| 0x10&lt;br /&gt;
| This can be set by [[NSS:SetWirelessRebootInfo]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B0&lt;br /&gt;
| 0x14&lt;br /&gt;
| SHA1-HMAC of the banner for TWL/NTR titles. This can be set by [[NSS:SetTWLBannerHMAC]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x500&lt;br /&gt;
| 0x40&lt;br /&gt;
| This is used by [[APT:LoadSysMenuArg]] and [[APT:StoreSysMenuArg]].&lt;br /&gt;
|-&lt;br /&gt;
| 0xD50&lt;br /&gt;
| 0x20&lt;br /&gt;
| Atheros WiFi configuration struct&lt;br /&gt;
|-&lt;br /&gt;
| 0xD70&lt;br /&gt;
| 0x290&lt;br /&gt;
| [[Config Savegame|Config]] data struct for LGY FIRM.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Flags from offset 0x400:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| This can be used for overriding the default FCRAM [[Memory_layout|memory-regions]] allocation sizes(APPLICATION, SYSTEM, and BASE). The values for this is the same as [[Configuration_Memory#APPMEMTYPE|Configmem-APPMEMTYPE]]. Values 0-1 are handled the same way by the kernel. However for NS, 0=titleinfo structure for launching a title isn&#039;t set, while non-zero=titleinfo structure is set.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Setting bit0 here enables overriding the FIRM_* fields in [[Configuration_Memory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Atheros WiFi configuration struct for booting TWL_FIRM, from offset 0xD50. This struct is copied directly to 0x20005E0 in DSi memory. Since DSi cartridge ROMs include SDIO drivers for the wireless card and can&#039;t be updated, this structure allows interoperability between the original DSi wireless cards (AR6002/DWM-W015 and AR6013/DWM-W024) as well as the 3DS&#039;s AR6014/DWM-W028.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| WiFi Board Type (1=DWM-W015, 2=DWM-W024, 3=DWM-W028; 0x03 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Unknown (0x00)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| CRC16 from 0x4 to 0x20 (0x1C bytes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM Vars/Host Interest address (0x520000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM base (0x520000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Atheros RAM size (0x20000 on 3DS)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| Unknown (Zeroed)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Config Savegame|Config]] struct for booting LGY FIRMs from offset 0xD70:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  OFFSET&lt;br /&gt;
!  SIZE&lt;br /&gt;
!  DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| RTC compensation value (config block 0x30000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| Sound output mode (config block 0x70001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| System language (config block 0xA0002).&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| [[Cfg:SecureInfoGetRegion|Region from SecureInfo]] (&amp;quot;pseudo-block&amp;quot; 0x140000 in LGY FIRM).&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xF&lt;br /&gt;
| [[CfgS:SecureInfoGetSerialNo|Serial number from SecureInfo]] (&amp;quot;pseudo-block&amp;quot; 0x140001 in LGY FIRM).&lt;br /&gt;
|-&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x1&lt;br /&gt;
| TWL country code (config block 0x100002).&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x10&lt;br /&gt;
| TWL &amp;quot;movable&amp;quot; UID, used for DSiWare exports (config block 0x100003).&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x2&lt;br /&gt;
| TWL EULA info (config block 0x100000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x1&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x27&lt;br /&gt;
| 0x1&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x94&lt;br /&gt;
| TWL parental control data (config block 0x100001).&lt;br /&gt;
|-&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 0x2&lt;br /&gt;
| LCD flicker calibration data (config block 0x50000).&lt;br /&gt;
|-&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 0x2&lt;br /&gt;
| Backlight data (config block 0x50001).&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 0x38&lt;br /&gt;
| Backlight PWM table (config block 0x50002).&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0x20&lt;br /&gt;
| Power saving mode (ABL) calibration (config block 0x50004).&lt;br /&gt;
|-&lt;br /&gt;
| 0x118&lt;br /&gt;
| 0x134&lt;br /&gt;
| CODEC calibration data (config block 0x20000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x24C&lt;br /&gt;
| 0x10&lt;br /&gt;
| Touch screen calibration data (config block 0x40000).&lt;br /&gt;
|-&lt;br /&gt;
| 0x25C&lt;br /&gt;
| 0x1C&lt;br /&gt;
| Analog stick calibration data (config block 0x40001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x278&lt;br /&gt;
| 0x4&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x27C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Cleared to zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x280&lt;br /&gt;
| 0x8&lt;br /&gt;
| User time offset (config block 0x30001).&lt;br /&gt;
|-&lt;br /&gt;
| 0x288&lt;br /&gt;
| 0x2&lt;br /&gt;
| CRC16 over the above fields from offset 0x0, size 0x288. If not valid, LGY FIRM uses dummy data from .(ro)data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28A&lt;br /&gt;
| 0x2&lt;br /&gt;
| Version, maybe? If non-zero, the size (below) is hardcoded (currently) to value 0x288, otherwise the size field below is used.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Value 0x288 (size used for verifying the CRC16).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Cleared to zero&amp;quot; fields above are not read at all by LGY FIRM.&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Home_Menu&amp;diff=1535</id>
		<title>Home Menu</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Home_Menu&amp;diff=1535"/>
		<updated>2011-11-07T11:08:10Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: /* Versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
The &#039;&#039;&#039;Home Menu&#039;&#039;&#039; is the heart of the Nintendo 3DS. From there one can start games, channels, and manage contacts and settings. It is launched first, and working background with 3DS games, without System Settings or DS/DSi mode game.&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version &lt;br /&gt;
! JPN&lt;br /&gt;
! USA &lt;br /&gt;
! EUR&lt;br /&gt;
! Release date &lt;br /&gt;
! Changelog &lt;br /&gt;
! CDN Availability&lt;br /&gt;
! CDN Post Date&lt;br /&gt;
|-&lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| 432 &lt;br /&gt;
| 432&lt;br /&gt;
| 432&lt;br /&gt;
| February 26, 2011&lt;br /&gt;
| Shipped with 3DS on launch&lt;br /&gt;
| Available&lt;br /&gt;
| February 18, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-0|1.1.0-0]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| Update from some game cards&lt;br /&gt;
| Unavailable&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-1|1.1.0-1]] &lt;br /&gt;
| 1472 &lt;br /&gt;
| 1472 &lt;br /&gt;
| 1472&lt;br /&gt;
| February ?, 2011&lt;br /&gt;
| General bug fixes&lt;br /&gt;
Added 3D Video title to menu. (&amp;quot;For a Limited Time Only&amp;quot;)&lt;br /&gt;
| Available&lt;br /&gt;
| March 1, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.0.0-2|2.0.0-2]]&lt;br /&gt;
| 2516&lt;br /&gt;
| 2516&lt;br /&gt;
| 2516&lt;br /&gt;
| June 6/7, 2011&lt;br /&gt;
| From the update notification:(DSiWare management isn&#039;t mentioned in the notice but is available) [[Nintendo eShop]] added, web browser available, [[System Transfer]] added. Full DSiWare data management available. [[SpotPass|Automatic]] system updates added.&lt;br /&gt;
| Available&lt;br /&gt;
| June 6, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-3|2.1.0-3]]&lt;br /&gt;
| 3553&lt;br /&gt;
| 3553&lt;br /&gt;
| 3553&lt;br /&gt;
| June 15, 2011&lt;br /&gt;
| Fixes the Ridge Racer freeze.&lt;br /&gt;
| Available&lt;br /&gt;
| June 15, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-4|2.1.0-4]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| July 25, 2011&lt;br /&gt;
| System stability improvements and other adjustments.&lt;br /&gt;
| Available&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [[2.2.0-4|2.2.0-4]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| November 6, 2011&lt;br /&gt;
| Improve the arrangement of [[Friend List]]. Update from some game cards such as Mario 3D Land(JPN).&lt;br /&gt;
| Unavailable&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo Software]]&lt;br /&gt;
[[Homeメニュー|Japanese]]&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
http://www.nintendo.com/consumer/systems/3ds/en_na/menu_update.jsp&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Home_Menu&amp;diff=1518</id>
		<title>Home Menu</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Home_Menu&amp;diff=1518"/>
		<updated>2011-11-04T17:04:02Z</updated>

		<summary type="html">&lt;p&gt;Danny8376: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
The &#039;&#039;&#039;Home Menu&#039;&#039;&#039; is the heart of the Nintendo 3DS. From there one can start games, channels, and manage contacts and settings. It is launched first, and working background with 3DS games, without System Settings or DS/DSi mode game.&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version &lt;br /&gt;
! JPN&lt;br /&gt;
! USA &lt;br /&gt;
! EUR&lt;br /&gt;
! Release date &lt;br /&gt;
! Changelog &lt;br /&gt;
! CDN Availability&lt;br /&gt;
! CDN Post Date&lt;br /&gt;
|-&lt;br /&gt;
| [[1.0.0-0|1.0.0-0]]&lt;br /&gt;
| 432 &lt;br /&gt;
| 432&lt;br /&gt;
| 432&lt;br /&gt;
| February 26, 2011&lt;br /&gt;
| Shipped with 3DS on launch&lt;br /&gt;
| Available&lt;br /&gt;
| February 18, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-0|1.1.0-0]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| Update from some game cards&lt;br /&gt;
| Unavailable&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| [[1.1.0-1|1.1.0-1]] &lt;br /&gt;
| 1472 &lt;br /&gt;
| 1472 &lt;br /&gt;
| 1472&lt;br /&gt;
| February ?, 2011&lt;br /&gt;
| General bug fixes&lt;br /&gt;
Added 3D Video title to menu. (&amp;quot;For a Limited Time Only&amp;quot;)&lt;br /&gt;
| Available&lt;br /&gt;
| March 1, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.0.0-2|2.0.0-2]]&lt;br /&gt;
| 2516&lt;br /&gt;
| 2516&lt;br /&gt;
| 2516&lt;br /&gt;
| June 6/7, 2011&lt;br /&gt;
| From the update notification:(DSiWare management isn&#039;t mentioned in the notice but is available) [[Nintendo eShop]] added, web browser available, [[System Transfer]] added. Full DSiWare data management available. [[SpotPass|Automatic]] system updates added.&lt;br /&gt;
| Available&lt;br /&gt;
| June 6, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-3|2.1.0-3]]&lt;br /&gt;
| 3553&lt;br /&gt;
| 3553&lt;br /&gt;
| 3553&lt;br /&gt;
| June 15, 2011&lt;br /&gt;
| Fixes the Ridge Racer freeze.&lt;br /&gt;
| Available&lt;br /&gt;
| June 15, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [[2.1.0-4|2.1.0-4]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| July 25, 2011&lt;br /&gt;
| System stability improvements and other adjustments.&lt;br /&gt;
| Available&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [[2.2.0-4|2.2.0-4]]&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| November 25, 2011&lt;br /&gt;
| Improve the arrange of [[Friend List]].&lt;br /&gt;
| Unavailable&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo Software]]&lt;br /&gt;
[[Homeメニュー|Japanese]]&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
http://www.nintendo.com/consumer/systems/3ds/en_na/menu_update.jsp&lt;/div&gt;</summary>
		<author><name>Danny8376</name></author>
	</entry>
</feed>