<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es-ES"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://not-d3fau4.com//feed.xml" rel="self" type="application/atom+xml" /><link href="https://not-d3fau4.com//" rel="alternate" type="text/html" hreflang="es-ES" /><updated>2024-12-17T13:43:59+01:00</updated><id>https://not-d3fau4.com//feed.xml</id><title type="html">Not-D3fau4</title><subtitle>Una pagina para subir mis cosas que crea que sean interesantes.</subtitle><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><entry><title type="html">El increible mundo de los hooks en Nintendo Switch</title><link href="https://not-d3fau4.com//NX-hooks/" rel="alternate" type="text/html" title="El increible mundo de los hooks en Nintendo Switch" /><published>2022-06-14T17:56:00+02:00</published><updated>2022-06-14T17:56:00+02:00</updated><id>https://not-d3fau4.com//NX-hooks</id><content type="html" xml:base="https://not-d3fau4.com//NX-hooks/"><![CDATA[<h2 id="archivosprogramas-necesarios">Archivos/Programas necesarios:</h2>
<ul>
  <li>exlaunch por shadowninja108: <a href="https://github.com/shadowninja108/exlaunch">Descargar</a></li>
  <li>hactool por Sciresm: <a href="https://github.com/SciresM/hactool">Descargar</a></li>
</ul>

<p>“exlaunch” es un pequeño proyecto donde viene con las herramientas y recursos suficientes para crear hooks.</p>

<h2 id="1-clonar-repositorio">1. Clonar repositorio</h2>
<p>Primero deberemos empezar obviamente clonando el repositorio.
<img src="../assets/img/nxhook/img1.png" alt="img" /></p>

<h2 id="2-configurar-el-proyecto-al-juego-que-queramos">2. Configurar el proyecto al juego que queramos.</h2>
<p>Para esto deberemos de configurar el <code class="language-plaintext highlighter-rouge">.sh</code> y deberemos de dar en el apartado <code class="language-plaintext highlighter-rouge">titleid</code> el contentid de nuestro juego.</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...
<span class="c"># How you're loading your module. Used to determine how to find the target module. (AsRtld/Module/Kip)</span>
<span class="nb">export </span><span class="nv">LOAD_KIND</span><span class="o">=</span><span class="s2">"Module"</span>
<span class="c"># Program you're targetting. Used to determine where to deploy your files.</span>
<span class="nb">export </span><span class="nv">PROGRAM_ID</span><span class="o">=</span><span class="s2">"010053E002EA2000"</span> <span class="c"># FATE EXTELLA</span>
<span class="c"># Optional path to copy the final ELF to, for convenience.</span>
<span class="nb">export </span><span class="nv">ELF_EXTRACT</span><span class="o">=</span><span class="s2">""</span>
...
</code></pre></div></div>

<h2 id="3-generar-npdm">3. Generar NPDM</h2>
<p>el NPDM es el archivo que contiene los metadatos del ejecutable, como por ejemplo los permisos que tiene y a que servicios tiene acceso.
Lo que deberemos de hacer es generar un json del main.npdm de nuestro juego, para esto deberemos de usar hactool. (<code class="language-plaintext highlighter-rouge">hactool.exe -t npdm --json app.json main.npdm</code>)</p>

<p>Veremos que hactool nos cagará un porrón de información totalmente irrelevante a nuestro fin:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NPDM:
    Magic:                          META
    MMU Flags:                      3
    Main Thread Priority:           44
    Default CPU ID:                 0
    Version:                        0.0.0-0 (0)
    Main Thread Stack Size:         0x100000
    Title Name:                     COSMOS
    ACID:
        Magic:                      ACID
        Signature Key:              0
        Is Retail:                  1
        Pool Partition:             0
        Title ID Range:             0100000000010000-01ffffffffffffff
    ACI0:
        Magic:                      ACI0
        Title ID:                   010053e002ea2000
    Kernel Access Control:
        Lowest Allowed Priority:    28
        Highest Allowed Priority:   59
        Lowest Allowed CPU ID:      0
        Highest Allowed CPU ID:     2
        Allowed SVCs:               svcSetHeapSize                      (0x01)
                                    svcSetMemoryPermission              (0x02)
                                    svcSetMemoryAttribute               (0x03)

...

Done!
</code></pre></div></div>

<p>Y veremos que nos ha generado el json que necesitamos:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
	</span><span class="nl">"name"</span><span class="p">:</span><span class="w">	</span><span class="s2">"COSMOS"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"title_id"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x010053e002ea2000"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"title_id_range_min"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0100000000010000"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"title_id_range_max"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x01ffffffffffffff"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"main_thread_stack_size"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x00100000"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"main_thread_priority"</span><span class="p">:</span><span class="w">	</span><span class="mi">44</span><span class="p">,</span><span class="w">
	</span><span class="nl">"default_cpu_id"</span><span class="p">:</span><span class="w">	</span><span class="mi">0</span><span class="p">,</span><span class="w">
	</span><span class="nl">"version"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x00000000"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"is_retail"</span><span class="p">:</span><span class="w">	</span><span class="kc">true</span><span class="p">,</span><span class="w">
	</span><span class="nl">"pool_partition"</span><span class="p">:</span><span class="w">	</span><span class="mi">0</span><span class="p">,</span><span class="w">
	</span><span class="nl">"is_64_bit"</span><span class="p">:</span><span class="w">	</span><span class="kc">true</span><span class="p">,</span><span class="w">
	</span><span class="nl">"address_space_type"</span><span class="p">:</span><span class="w">	</span><span class="mi">1</span><span class="p">,</span><span class="w">
	</span><span class="nl">"filesystem_access"</span><span class="p">:</span><span class="w">	</span><span class="p">{</span><span class="w">
		</span><span class="nl">"permissions"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4000000000000000"</span><span class="w">
	</span><span class="p">},</span><span class="w">
 </span><span class="err">...</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Ahora deberemos de copiar el contenido del json al archivo exlaunch.json del proyecto y modificar los siguentes valores por estos:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">...</span><span class="w">

</span><span class="nl">"filesystem_access"</span><span class="p">:</span><span class="w">	</span><span class="p">{</span><span class="w">
		</span><span class="nl">"permissions"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0xffffffffffffffff"</span><span class="w">
	</span><span class="p">}</span><span class="err">,</span><span class="w">

</span><span class="err">...</span><span class="w">

            </span><span class="nl">"type"</span><span class="p">:</span><span class="w">	</span><span class="s2">"syscalls"</span><span class="err">,</span><span class="w">
			</span><span class="nl">"value"</span><span class="p">:</span><span class="w">	</span><span class="p">{</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x00"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetHeapSize"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x01"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetMemoryPermission"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x02"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetMemoryAttribute"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x03"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x04"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x05"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcQueryMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x06"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcExitProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x07"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateThread"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x08"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcStartThread"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x09"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcExitThread"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSleepThread"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetThreadPriority"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetThreadPriority"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetThreadCoreMask"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetThreadCoreMask"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x0f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetCurrentProcessorNumber"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x10"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSignalEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x11"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcClearEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x12"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapSharedMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x13"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapSharedMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x14"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateTransferMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x15"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCloseHandle"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x16"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcResetSignal"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x17"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcWaitSynchronization"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x18"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCancelSynchronization"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x19"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcArbitrateLock"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcArbitrateUnlock"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcWaitProcessWideKeyAtomic"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSignalProcessWideKey"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetSystemTick"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcConnectToNamedPort"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x1f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSendSyncRequestLight"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x20"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSendSyncRequest"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x21"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSendSyncRequestWithUserBuffer"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x22"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSendAsyncRequestWithUserBuffer"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x23"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetProcessId"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x24"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetThreadId"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x25"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcBreak"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x26"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcOutputDebugString"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x27"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReturnFromException"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x28"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x29"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcFlushEntireDataCache"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcFlushDataCache"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapPhysicalMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapPhysicalMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetFutureThreadInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetLastThreadInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x2f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetResourceLimitLimitValue"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x30"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetResourceLimitCurrentValue"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x31"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetThreadActivity"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x32"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetThreadContext3"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x33"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcWaitForAddress"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x34"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSignalToAddress"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x35"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x36"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x37"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x38"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x39"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcDumpInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcDumpInfoNew"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x3f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateSession"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x40"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcAcceptSession"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x41"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReplyAndReceiveLight"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x42"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReplyAndReceive"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x43"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReplyAndReceiveWithUserBuffer"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x44"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x45"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x46"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x47"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapPhysicalMemoryUnsafe"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x48"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapPhysicalMemoryUnsafe"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x49"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetUnsafeLimit"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateCodeMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcControlCodeMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSleepSystem"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReadWriteRegister"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetProcessActivity"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x4f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateSharedMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x50"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapTransferMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x51"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapTransferMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x52"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateInterruptEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x53"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcQueryPhysicalAddress"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x54"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcQueryIoMapping"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x55"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateDeviceAddressSpace"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x56"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcAttachDeviceAddressSpace"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x57"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcDetachDeviceAddressSpace"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x58"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapDeviceAddressSpaceByForce"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x59"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapDeviceAddressSpaceAligned"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapDeviceAddressSpace"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapDeviceAddressSpace"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcInvalidateProcessDataCache"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcStoreProcessDataCache"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcFlushProcessDataCache"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x5f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcDebugActiveProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x60"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcBreakDebugProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x61"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcTerminateDebugProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x62"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetDebugEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x63"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcContinueDebugEvent"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x64"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetProcessList"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x65"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetThreadList"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x66"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetDebugThreadContext"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x67"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetDebugThreadContext"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x68"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcQueryDebugProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x69"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcReadDebugProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcWriteDebugProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetHardwareBreakPoint"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetDebugThreadParam"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnknown"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetSystemInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x6f"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreatePort"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x70"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcManageNamedPort"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x71"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcConnectToPort"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x72"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetProcessMemoryPermission"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x73"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x74"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x75"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcQueryProcessMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x76"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcMapProcessCodeMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x77"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcUnmapProcessCodeMemory"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x78"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x79"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcStartProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7a"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcTerminateProcess"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7b"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcGetProcessInfo"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7c"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCreateResourceLimit"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7d"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcSetResourceLimitLimitValue"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7e"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"svcCallSecureMonitor"</span><span class="p">:</span><span class="w">	</span><span class="s2">"0x7f"</span><span class="w">
			</span><span class="p">}</span><span class="w">

</span><span class="err">...</span><span class="w">

</span></code></pre></div></div>

<p>Una vez terminado esto ya prácticamente tenemos el proyecto configurado para que funcione en nuestro juego.</p>

<h2 id="4-programar-toca">4. Programar toca</h2>

<p>exlaunch viene ya con un hook de ejemplo que normalmente no suele funcionar, en caso de del juego que quiero aplicarle hooks (Fate Extella) para empezar he decido hacer un hook a la hora de montar y abrir archivos para controlar que archivos lee.
En <code class="language-plaintext highlighter-rouge">exl_main</code> para que esto funcione mínimo tiene que tener lo siguiente:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">extern</span> <span class="s">"C"</span> <span class="kt">void</span> <span class="nf">exl_main</span><span class="p">(</span><span class="kt">void</span><span class="o">*</span> <span class="n">x0</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">x1</span><span class="p">)</span> <span class="p">{</span>
    <span class="cm">/* Setup hooking enviroment. */</span>
    <span class="n">envSetOwnProcessHandle</span><span class="p">(</span><span class="n">exl</span><span class="o">::</span><span class="n">util</span><span class="o">::</span><span class="n">proc_handle</span><span class="o">::</span><span class="n">Get</span><span class="p">());</span>
    <span class="n">exl</span><span class="o">::</span><span class="n">hook</span><span class="o">::</span><span class="n">Initialize</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Esto configura e inicia el entorno para hacer hooks.
Ahora declararemos la función a la que queramos hacer un hook. 
Hay dos formas posibles:</p>
<ul>
  <li>Declarando la función en nuestro código.</li>
  <li>Buscando la dirección de memoria de esta en algún desensamblador.</li>
</ul>

<p>En el primer caso sería haciendo lo siguente:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">namespace</span> <span class="n">nn</span><span class="o">::</span><span class="n">fs</span> <span class="p">{</span>
    <span class="n">Result</span> <span class="n">MountRom</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">path</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">romCache</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">cacheSize</span><span class="p">);</span>
<span class="p">}</span>

</code></pre></div></div>

<p>Y en <code class="language-plaintext highlighter-rouge">exl_main</code> declarándolo así:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="n">nn</span><span class="o">::</span><span class="n">fs</span> <span class="p">{</span>
    <span class="n">Result</span> <span class="n">MountRom</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">path</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">romCache</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">cacheSize</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">extern</span> <span class="s">"C"</span> <span class="kt">void</span> <span class="nf">exl_main</span><span class="p">(</span><span class="kt">void</span><span class="o">*</span> <span class="n">x0</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">x1</span><span class="p">)</span> <span class="p">{</span>
    <span class="cm">/* Setup hooking enviroment. */</span>
    <span class="n">envSetOwnProcessHandle</span><span class="p">(</span><span class="n">exl</span><span class="o">::</span><span class="n">util</span><span class="o">::</span><span class="n">proc_handle</span><span class="o">::</span><span class="n">Get</span><span class="p">());</span>
    <span class="n">exl</span><span class="o">::</span><span class="n">hook</span><span class="o">::</span><span class="n">Initialize</span><span class="p">();</span>

    <span class="n">INJECT_HOOK_T</span><span class="p">(</span><span class="n">nn</span><span class="o">::</span><span class="n">fs</span><span class="o">::</span><span class="n">MountRom</span><span class="p">,</span> <span class="n">romMounted</span><span class="p">);</span> <span class="c1">// INJECT_HOOK_T(función que queramos sustituir, nombre de la dirección de memoria donde queremos que vaya el programa);</span>
    <span class="n">INJECT_HOOK_T</span><span class="p">(</span><span class="mh">0x71007C7524</span><span class="p">,</span> <span class="n">romMounted</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>o en el caso de no saber como está declarado en el código en cualquier desensamblador buscamos la función que necesitemos:</p>

<p><img src="../assets/img/nxhook/ida1.png" alt="img1" /></p>

<p>en mi caso es <code class="language-plaintext highlighter-rouge">0x71007C7524</code>.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="n">nn</span><span class="o">::</span><span class="n">fs</span> <span class="p">{</span>
    <span class="n">Result</span> <span class="n">MountRom</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">path</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">romCache</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">cacheSize</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">extern</span> <span class="s">"C"</span> <span class="kt">void</span> <span class="nf">exl_main</span><span class="p">(</span><span class="kt">void</span><span class="o">*</span> <span class="n">x0</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">x1</span><span class="p">)</span> <span class="p">{</span>
    <span class="cm">/* Setup hooking enviroment. */</span>
    <span class="n">envSetOwnProcessHandle</span><span class="p">(</span><span class="n">exl</span><span class="o">::</span><span class="n">util</span><span class="o">::</span><span class="n">proc_handle</span><span class="o">::</span><span class="n">Get</span><span class="p">());</span>
    <span class="n">exl</span><span class="o">::</span><span class="n">hook</span><span class="o">::</span><span class="n">Initialize</span><span class="p">();</span>

    <span class="n">INJECT_HOOK_T</span><span class="p">(</span><span class="mh">0x71007C7524</span><span class="p">,</span> <span class="n">romMounted</span><span class="p">);</span> <span class="c1">// INJECT_HOOK_T(dirección de memoria que quieras sustituir, nombre de la dirección de memoria donde queremos que vaya el programa);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ahora lo que nos falta es declarar el código donde queramos que se ejecute, para esto debemos de usar lo siguiente:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="cm">/*
MAKE_HOOK_T(tipo de función que remplazamos (void, int, bool, etc...), nombre de la variable con la dirección de esta función, (sobrecargas de la función original),
    Result res = impl(args); // impl() redirige y ejecuta la función original, 
    return res; // retornamos el resultado en caso de que sea necesario.
);
*/</span>

<span class="n">MAKE_HOOK_T</span><span class="p">(</span><span class="n">Result</span><span class="p">,</span> <span class="n">romMounted</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="k">const</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">romCache</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">cacheSize</span><span class="p">),</span>
    <span class="n">Result</span> <span class="n">res</span> <span class="o">=</span> <span class="n">impl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">romCache</span><span class="p">,</span> <span class="n">cacheSize</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">);</span>

</code></pre></div></div>

<p>Ahora querremos saber si realmente está funcionando nuestro hook y que no es una trola, para eso lo que haremos es crear un archivo en la microsd y así comprobamos de que se está realizando.</p>

<p>En la función que acabamos de declarar añadiremos lo siguiente:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">"lib.hpp"</span><span class="cp">
#include</span> <span class="cpf">"nn.hpp"</span><span class="c1"> // debemos de añadir el include de las libs de nintendo.</span><span class="cp">
</span>
<span class="n">MAKE_HOOK_T</span><span class="p">(</span><span class="n">Result</span><span class="p">,</span> <span class="n">romMounted</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="k">const</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">romCache</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">cacheSize</span><span class="p">),</span>
    <span class="n">Result</span> <span class="n">res</span> <span class="o">=</span> <span class="n">impl</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">romCache</span><span class="p">,</span> <span class="n">cacheSize</span><span class="p">);</span>
    <span class="n">nn</span><span class="o">::</span><span class="n">fs</span><span class="o">::</span><span class="n">MountSdCardForDebug</span><span class="p">(</span><span class="s">"sd"</span><span class="p">);</span> <span class="c1">// montamos la SD</span>
    <span class="n">nn</span><span class="o">::</span><span class="n">fs</span><span class="o">::</span><span class="n">CreateFile</span><span class="p">(</span><span class="s">"sd:/exlaunch.txt"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1">// y creamos en la raiz de la SD un archivo.</span>
    <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">);</span>
</code></pre></div></div>

<p>y ahora solo deberemos de compilar y copiar a nuestra consola a la carpeta <code class="language-plaintext highlighter-rouge">atmosphere/contents/&lt;titleid&gt;/exefs</code> los archivos generados en <code class="language-plaintext highlighter-rouge">deploy</code>.</p>

<p><img src="../assets/img/nxhook/img2.png" alt="img2" />
<img src="../assets/img/nxhook/img3.png" alt="img3" /></p>

<p>Y una vez copiado solo debemos ejecutar el juego y si todo ha salido bien el juego no debería de crashear, si crashea es que no has puesto bien la dirección de memoria o cualquier otra cosa. Revisa tu código.</p>

<p><img src="../assets/img/nxhook/img4.png" alt="img4" /></p>

<p>Y eso es todo.</p>

<h2 id="créditos">Créditos:</h2>

<ul>
  <li>Gracias a <a href="https://github.com/shadowninja108/">shadowninja108</a> por resolverme todas las dudas de su programa por discord.</li>
</ul>]]></content><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><category term="Switch" /><category term="NX" /><category term="TraduSquare" /><summary type="html"><![CDATA[Archivos/Programas necesarios: exlaunch por shadowninja108: Descargar hactool por Sciresm: Descargar]]></summary></entry><entry><title type="html">Emulación del servidor de updates (d4c-emu)</title><link href="https://not-d3fau4.com//d4c-emu/" rel="alternate" type="text/html" title="Emulación del servidor de updates (d4c-emu)" /><published>2022-04-19T11:17:00+02:00</published><updated>2022-04-19T11:17:00+02:00</updated><id>https://not-d3fau4.com//d4c-emu</id><content type="html" xml:base="https://not-d3fau4.com//d4c-emu/"><![CDATA[<h3 id="️-esto-es-una-prueba-de-concepto-no-me-hago-responsable-de-los-daños-que-puedas-provocar-a-tu-consola"><strong>⚠️ Esto es una prueba de concepto, no me hago responsable de los daños que puedas provocar a tu consola.</strong></h3>

<hr />

<p>Hace un par de días me puse a trabajar en una API para NightFall porque actualmente 
es simplemente un servidor http y quería hacer algo más “profesional”.</p>

<p>La idea que siempre he tenido de NightFall ha sido emular el proceso de actualización 
de la Nintendo Switch, así que me puse a investigar como actualiza el firmware 
vía red la nintendo switch.</p>

<h2 id="investigando-el-proceso-de-update">Investigando el proceso de update</h2>

<p>Si queremos ver que llamadas realiza la nintendo switch a la hora de actualizar deberemos
de usar algo que esté entre medias del servidor y la nintendo switch para poder capturas 
los paquetes que manda y recibe, así que me decante a usar un proxy.</p>

<p>Los servidores de nintendo mayormente usa una autentificación vía certificado SSL
así que tuve que añadir el certificado <strong>único de mi consola</strong> para poder acceder
a los servidores de nintendo, para esto lo que hice fue seguir la guía que viene con
el programa <a href="https://github.com/shadowninja108/NxCertDump">NxCertDump</a> 
de <a href="https://github.com/shadowninja108">shadowninja108</a>, este programa te genera un 
certificado p12 que es compatible con el programa que voy a usar de proxy.</p>

<p><img src="../assets/img/d4c/pc1.png" alt="img" /></p>

<p>En el proxy configuré el certificado generado <code class="language-plaintext highlighter-rouge">nx_tls_client_cert.pfx</code> como certificado cliente
y forzando que lo usé en cualquier llamada.</p>

<p><strong>(A la hora de importar el certificado puede que te pregunte por una contraseña esta
es: <code class="language-plaintext highlighter-rouge">switch</code>)</strong></p>

<p><img src="../assets/img/d4c/pc2.png" alt="img.png" /></p>

<p>También para que la nintendo switch pueda realizar las llamadas correctamente deberemos
de parchear el módulo <code class="language-plaintext highlighter-rouge">ssl</code> que permite recibir respuestas sin verificar el certificado
usé los parches que hay públicos en el repositorio de <a href="https://github.com/misson20000/exefs_patches">misson20000</a></p>

<p>Una vez hecho esto conecté mi nintendo al proxy y entonces pude ver las llamadas</p>

<p><img src="../assets/img/d4c/pc3.png" alt="img" /></p>

<p>Según la <a href="https://switchbrew.org/wiki/Main_Page">switchbrew-wiki</a> las llamadas que nos interesaban vienen de <code class="language-plaintext highlighter-rouge">sun.hac.lp1.d4c.nintendo.net</code>,
<code class="language-plaintext highlighter-rouge">aqua.hac.lp1.d4c.nintendo.net</code> y <code class="language-plaintext highlighter-rouge">atumn.hac.lp1.d4c.nintendo.net</code>.</p>

<p>Estas tres direcciones son las que llama al hacer el proceso de update completo. Las 
funciones de cada una son las siguientes:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">sun</code>: Contiene el nº de versión más reciente en la cdn.</li>
  <li><code class="language-plaintext highlighter-rouge">aqua</code>: Contiene el nº requerido para usar los servicios online de nintendo.</li>
  <li><code class="language-plaintext highlighter-rouge">atumn</code>: es la cdn donde se aloja todos los ncas.</li>
</ul>

<p>Ya hemos identificado las llamadas que necesitamos ahora necesitamos saber el orden al
que llama a estas direcciones y que llamadas hace.</p>

<p><code class="language-plaintext highlighter-rouge">aqua</code> suele ser llamada al encender la consola o de forma aleatoria así que queda fuera
del proceso al hacer update.</p>

<p><code class="language-plaintext highlighter-rouge">sun</code> es siempre llamado para verificar que la versión del <code class="language-plaintext highlighter-rouge">title_id: 0100000000000816</code>
es superior (y no inferior, que en este caso siempre va a devolver una pantalla de que estás
en la última versión) a la versión que tiene actualmente el sistema. En caso de que responda
con una versión superior al del sistema automáticamente llamará a <code class="language-plaintext highlighter-rouge">atumn</code> solicitando mediante 
un <code class="language-plaintext highlighter-rouge">HEAD</code> el id
nca de la versión que indica <code class="language-plaintext highlighter-rouge">sun</code></p>

<p><img src="../assets/img/d4c/pc4.png" alt="img" /></p>

<p>Una vez obtenido el id vuelve a solicitar a <code class="language-plaintext highlighter-rouge">atumn</code> en una solicitud del tipo <code class="language-plaintext highlighter-rouge">GET</code> el NCA
para descargarlo y parsear los title_ids que necesita actualizar para solicitar los ncaid 
y descargar estos.</p>

<p><img src="../assets/img/d4c/pc5.png" alt="img" /></p>

<p>una vez ya la consola tiene los ncas necesarios descargados la consola solicitará al 
usuario si desea realizar la actualización y comprobará en <code class="language-plaintext highlighter-rouge">aqua</code> si dispones de la versión
necesaria para conectarte a los servicios y te mostrara un mensaje de que hay una actualización
de firmware disponible y te permitirá saltar la advertencia y continuar, pero en el caso contrario
te forzara a actualizar si quieres acceder a ese servicio.</p>

<p>y aquí finaliza el proceso de investigación así que me puse a programar el emulador.</p>

<h2 id="programando-d4c-emu">Programando d4c-emu</h2>

<p>Para programar el emulador decidi usar ASP.NET, ya que me permite usar la librería 
<a href="https://github.com/Thealexbarney/LibHac">LibHac</a> que me facilita bastante la lectura de
NCAs</p>

<h3 id="implementando-aqua-y-sun">Implementando <code class="language-plaintext highlighter-rouge">aqua</code> y <code class="language-plaintext highlighter-rouge">sun</code></h3>

<p>Primero programe un controlador para <code class="language-plaintext highlighter-rouge">aqua</code> y <code class="language-plaintext highlighter-rouge">sun</code> ya que estos son dos simples llamadas <code class="language-plaintext highlighter-rouge">GET</code></p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* aqua */</span>
<span class="p">[</span><span class="n">ApiController</span><span class="p">]</span>
<span class="p">[</span><span class="nf">Produces</span><span class="p">(</span><span class="s">"application/json"</span><span class="p">)]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">AquaController</span> <span class="p">:</span> <span class="n">ControllerBase</span>
<span class="p">{</span>
    <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"required_system_update_meta"</span><span class="p">)]</span>
    <span class="k">public</span> <span class="n">ActionResult</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> 
        <span class="nf">GetLastestMandatoryUpdate</span><span class="p">(</span><span class="kt">string</span> <span class="n">device_id</span> <span class="p">=</span> <span class="s">"DEADCAFEBABEBEEF"</span><span class="p">)</span>
        <span class="cm">/* ... */</span>
        
<span class="cm">/* sun */</span>
<span class="p">[</span><span class="n">ApiController</span><span class="p">]</span>
<span class="p">[</span><span class="nf">Route</span><span class="p">(</span><span class="s">"v1/"</span><span class="p">)]</span>
<span class="p">[</span><span class="nf">Produces</span><span class="p">(</span><span class="s">"application/json"</span><span class="p">)]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">SunController</span> <span class="p">:</span> <span class="n">ControllerBase</span>
<span class="p">{</span>
    <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"system_update_meta"</span><span class="p">)]</span>
    <span class="k">public</span> <span class="n">ActionResult</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> 
        <span class="nf">GetLastestUpdate</span><span class="p">(</span><span class="kt">string</span> <span class="n">device_id</span> <span class="p">=</span> <span class="s">"DEADCAFEBABEBEEF"</span><span class="p">)</span>
        <span class="cm">/* ... */</span>
</code></pre></div></div>

<p>Ambas respuestas son del tipo <code class="language-plaintext highlighter-rouge">GET</code> y responden con un <code class="language-plaintext highlighter-rouge">application/json</code> estos como he explicado antes
responde con la versión de firmware más actual así que lo único que hice fue cargar al inicio 
del programa en un <code class="language-plaintext highlighter-rouge">fssystem</code> con todos los ncas y los ordeno según su versión para obtener siempre la ultima versión
entre los NCAs.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">nca</span> <span class="k">in</span> <span class="n">Horizon</span><span class="p">.</span><span class="n">hos</span><span class="p">.</span><span class="n">ncafolder</span><span class="p">.</span><span class="n">Titles</span><span class="p">.</span>
                     <span class="n">Values</span><span class="p">.</span><span class="nf">OrderByDescending</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Version</span><span class="p">.</span><span class="n">Version</span><span class="p">))</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">nca</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="m">0x0100000000000816u</span><span class="n">l</span><span class="p">)</span>
            <span class="p">{</span>
            <span class="cm">/* ... */</span>
</code></pre></div></div>

<p>Una vez que obtengo la última versión devuelvo un json como respuesta con los datos necesarios:</p>

<p><img src="../assets/img/d4c/pc6.png" alt="img" /></p>

<p><img src="../assets/img/d4c/pc7.png" alt="img" /></p>

<p>Y con esto ya está tendríamos implementado tanto <code class="language-plaintext highlighter-rouge">sun</code> como <code class="language-plaintext highlighter-rouge">aqua</code>, ahora nos queda atumn que tiene su chicha.</p>

<h3 id="implementando-atumn">Implementando <code class="language-plaintext highlighter-rouge">atumn</code></h3>

<p>atumn es el encargado de devolver los ncas a la nintendo este tiene una estructura dependiendo de lo que solicite
por ejemplo llamar a <code class="language-plaintext highlighter-rouge">t/s/{contentid}/{version}</code> te devuelve el id del nca según el titleid que solicite y su versión 
y los demás hacen lo siguiente:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">HEAD</code> <code class="language-plaintext highlighter-rouge">t/s/{contentid}/{version}</code>: devuelve el id del nca de tipo <code class="language-plaintext highlighter-rouge">NCA0</code> <strong>(actualmente solo <code class="language-plaintext highlighter-rouge">0100000000000816</code>)</strong> según el titleid que solicite y su versión.</li>
  <li><code class="language-plaintext highlighter-rouge">HEAD</code> <code class="language-plaintext highlighter-rouge">t/a/{contentid}/{version}</code>: devuelve el id del meta nca según el titleid que solicite y su versión.</li>
  <li><code class="language-plaintext highlighter-rouge">GET</code> <code class="language-plaintext highlighter-rouge">c/s/{NcaId}</code>: devuelve el nca de tipo <code class="language-plaintext highlighter-rouge">NCA0</code> <strong>(actualmente solo <code class="language-plaintext highlighter-rouge">0100000000000816</code>)</strong> según el ncaid que solicite.</li>
  <li><code class="language-plaintext highlighter-rouge">GET</code> <code class="language-plaintext highlighter-rouge">c/a/{NcaId}</code>: devuelve el meta nca de según el ncaid que solicite.</li>
  <li><code class="language-plaintext highlighter-rouge">GET</code> <code class="language-plaintext highlighter-rouge">c/c/{NcaId}</code>: devuelve el program (o otro) nca de según el ncaid que solicite.</li>
</ul>

<p>Realmente estas cinco llamadas son iguales o similares a las de <code class="language-plaintext highlighter-rouge">aqua</code> o <code class="language-plaintext highlighter-rouge">sun</code> y solo cambian una sola cosa así lo que hice fue algo así:</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">nca</span> <span class="k">in</span> <span class="n">Horizon</span><span class="p">.</span><span class="n">hos</span><span class="p">.</span><span class="n">ncafolder</span><span class="p">.</span><span class="n">Titles</span><span class="p">.</span><span class="n">Values</span><span class="p">.</span><span class="nf">OrderBy</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Id</span><span class="p">))</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">nca</span><span class="p">.</span><span class="n">Id</span><span class="p">.</span><span class="nf">Equals</span><span class="p">(</span><span class="n">Convert</span><span class="p">.</span><span class="nf">ToUInt64</span><span class="p">(</span><span class="s">$"0x</span><span class="p">{</span><span class="n">contentid</span><span class="p">}</span><span class="s">"</span><span class="p">,</span> <span class="m">16</span><span class="p">))</span> <span class="p">&amp;&amp;</span>
                <span class="n">nca</span><span class="p">.</span><span class="n">Version</span><span class="p">.</span><span class="n">Version</span><span class="p">.</span><span class="nf">Equals</span><span class="p">(</span><span class="n">Convert</span><span class="p">.</span><span class="nf">ToUInt32</span><span class="p">(</span><span class="s">$"</span><span class="p">{</span><span class="n">version</span><span class="p">}</span><span class="s">"</span><span class="p">)))</span>
            <span class="p">{</span>
                <span class="n">HttpContext</span><span class="p">.</span><span class="n">Response</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">"X-Nintendo-Content-ID"</span><span class="p">,</span> <span class="n">nca</span><span class="p">.</span><span class="n">MetaNca</span><span class="p">.</span><span class="n">NcaId</span><span class="p">);</span>
                <span class="n">HttpContext</span><span class="p">.</span><span class="n">Response</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">"X-Nintendo-Content-Hash"</span><span class="p">,</span>
                    <span class="n">Horizon</span><span class="p">.</span><span class="nf">SHA256CheckSum</span><span class="p">(</span><span class="n">Path</span><span class="p">.</span><span class="nf">Combine</span><span class="p">(</span><span class="n">Horizon</span><span class="p">.</span><span class="n">hos</span><span class="p">.</span><span class="n">NcaFolderPath</span><span class="p">,</span> 
                        <span class="n">nca</span><span class="p">.</span><span class="n">MetaNca</span><span class="p">.</span><span class="n">Filename</span><span class="p">)));</span>
</code></pre></div></div>

<p>y con todo esto ya tenemos el servicio montado y podemos conectar nuestra switch al emulador y poder testear 
el sistema de updates.</p>

<p>Podéis ver el resultado en el siguiente video: <a href="https://youtu.be/bhru9z-hDMc">https://youtu.be/bhru9z-hDMc</a></p>

<h2 id="enlaces">Enlaces</h2>

<ul>
  <li><strong><a href="https://github.com/D3fau4/d4c-emu">d4c-emu</a> - Nintendo Content Delivery server emulator</strong></li>
</ul>]]></content><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><category term="Switch" /><category term="NX" /><summary type="html"><![CDATA[⚠️ Esto es una prueba de concepto, no me hago responsable de los daños que puedas provocar a tu consola.]]></summary></entry><entry><title type="html">Como dumpear tu juego para parchearlo [XCI/Cartuchos]</title><link href="https://not-d3fau4.com//como-dumpear-xci/" rel="alternate" type="text/html" title="Como dumpear tu juego para parchearlo [XCI/Cartuchos]" /><published>2021-12-26T05:24:00+01:00</published><updated>2021-12-26T05:24:00+01:00</updated><id>https://not-d3fau4.com//como-dumpear-xci</id><content type="html" xml:base="https://not-d3fau4.com//como-dumpear-xci/"><![CDATA[<p><strong>Este tutorial es válido para dumpear tus juegos físicos de Nintendo Switch y poder aplicar cualquier parche de traducción de <a href="https://tradusquare.es/">TraduSquare</a></strong></p>

<h2 id="archivosprogramas-necesarios">Archivos/Programas necesarios:</h2>
<ul>
  <li>Lockpick_RCM: <a href="https://github.com/shchmue/Lockpick_RCM/releases/latest">Descargar</a></li>
  <li><strong>⚠️Advertencia: El programa adjunto en esta web es una versión modificada y adaptadas a las necesidades de nuestros parches, si quieres ver que modificaciones puedes descargar el parche <a href="https://not-d3fau4.com/assets/files/TR.diff">aquí</a>.</strong>
    <ul>
      <li>nxdumptool: <a href="https://not-d3fau4.com/assets/files/nxdumptool-TR.nro">Descargar</a></li>
    </ul>
  </li>
</ul>

<h2 id="1-dumpear-keys">1. Dumpear Keys</h2>

<p>Para poder dumpear nuestro juego primero deberemos extraer las keys de nuestra consola para esto deberemos usar el payload LockPick_RCM que deberías tener ya descargado y extraído/copiado en la carpeta <code class="language-plaintext highlighter-rouge">/bootloader/payloads/</code>  en caso de que quieras ejecutarlo desde <a href="https://github.com/CTCaer/hekate/releases/latest">Hekate</a> o desde cualquier programa para lanzar payloads.</p>

<p><strong>⚠️Advertencia: En consolas Erista (consolas  sin la caja roja) es necesario tener previamente extraído en la SD <a href="https://github.com/Atmosphere-NX/Atmosphere/releases/latest">Atmosphère</a></strong></p>

<p>Una vez arrancado el payload veremos la pantalla principal de <a href="https://github.com/shchmue/Lockpick_RCM/releases/latest">Lockpick_RCM</a>.</p>

<p><img src="../assets/img/dumpsgames/lockpick1.jpg" alt="lockpick rcm" /></p>

<p>Para poder desplazarnos por el menú debemos usar los botones de subir y bajar el volumen y el botón de power para aceptar.</p>

<p><strong>⚠️Advertencia: En caso de que tengamos creada una Emummc/EmuNAND veremos que la segunda opción <code class="language-plaintext highlighter-rouge">Dump from EmuNAND  | Key generation:   X</code> estará habilitada para seleccionar, deberás seleccionar está en vez de la opción que se muestra a continuación.</strong></p>

<p>Seleccionamos <code class="language-plaintext highlighter-rouge">Dump from Sysnand  | Key generation:   X</code> y comenzará el proceso de extracción de keys.</p>

<p>Y en unos pocos segundos ya tendremos las keys guardadas en la SD de la consola en la ruta como muestra en pantalla <code class="language-plaintext highlighter-rouge">/switch/prod.keys</code>:
<img src="../assets/img/dumpsgames/lockpick2.jpg" alt="keys dumpeadas" /></p>

<p>Una vez hecho esto procedemos a iniciar la consola con <a href="https://github.com/Atmosphere-NX/Atmosphere/releases/latest">Atmosphère</a> (CFW) para continuar a dumpear tu juego.</p>

<h2 id="2-dumpear-tu-juego">2. Dumpear tu juego</h2>

<p>Ahora en nuestra switch (asumiendo que ya has instalado/extraído el programa nxdumptool en la sd) procederemos a ir al hbmenu accediendo por el álbum del menú de la consola.</p>

<p><img src="../assets/img/dumpsgames/home1.jpg" alt="menu" /></p>

<p>Una vez ya dentro del hbmenu nos desplazamos hasta el programa nxdumptool y pulsamos “A” para ejecutarlo.</p>

<p><img src="../assets/img/dumpsgames/hbmenu1.jpg" alt="hbmenu" /></p>

<p>Ahora podremos ver la interfaz del programa. Nos desplazamos hasta <code class="language-plaintext highlighter-rouge">Dump gamecard content</code> y pulsamos “A” para seleccionar:</p>

<p><img src="../assets/img/dumpsgames/nxdump1.jpg" alt="nxdumptool" /></p>

<p>tardará unos segundos en cargar y nos mostrará una pantalla con la información del cartucho y diferentes opciones a elegir. Debemos de seleccionar la opción <code class="language-plaintext highlighter-rouge">NX Card Image (XCI) dump</code> y pulsar “A” para continuar.</p>

<p><img src="../assets/img/dumpsgames/nxdump2.jpg" alt="menu1" /></p>

<p><strong>⚠️Advertencia: En caso de que tu SD esté en formato FAT32 marca la opción <code class="language-plaintext highlighter-rouge">Split output dump (FAT32 support):</code> a <code class="language-plaintext highlighter-rouge">Yes</code> para generar un dump partido en diferentes archivos que luego deberás unir con cualquier programa que haga esto <a href="https://not-d3fau4.com/unir-tu-dump/">o siguiendo nuestro tutorial si eres usuario de Windows.</a>. Es necesario hacer esto por las características propias del formato FAT32.</strong></p>

<p>Ahora nos mostrará diferentes parámetros a configurar a los cuales a que dejarlos tal que así:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">Keep certificate: Yes</code></li>
  <li><code class="language-plaintext highlighter-rouge">Trim output dump: No</code></li>
  <li><code class="language-plaintext highlighter-rouge">CRC32 checksum calculation + dump verification</code> este ultimo a elección del usuario.</li>
</ul>

<p><img src="../assets/img/dumpsgames/nxdump3.jpg" alt="menu4" /></p>

<p>Una vez escogido estas opciones seleccionamos <code class="language-plaintext highlighter-rouge">Start XCI dump process</code> y pulsamos “A” para empezar. Y ahora solo quedaría esperar a que termine de dumpear el juego.</p>

<p><img src="../assets/img/dumpsgames/nxdump4.jpg" alt="XCI" /></p>

<p><img src="../assets/img/dumpsgames/nxdump5.jpg" alt="enter image description here" /></p>

<p>Una vez terminado el proceso mete en el pc la SD y en la ruta <code class="language-plaintext highlighter-rouge">/switch/nxdumptool/XCI</code> podrás ver tus juegos en formato xci y listos para parchear.</p>

<p><img src="../assets/img/dumpsgames/dumppc.png" alt="output" /></p>

<h2 id="3-dumpear-tu-update">3. Dumpear tu update</h2>

<p>Ahora si queremos dumpear la update del juego deberemos de volver a al menú principal del programa y
nos desplazamos hasta <code class="language-plaintext highlighter-rouge">Dump installed SD card / eMMC content</code> y pulsamos “A” para seleccionar:</p>

<p><img src="../assets/img/dumpsgames/nxdump6.jpg" alt="nxdumpmenu" /></p>

<p>y nos mostrará una lista de todos nuestros juegos instalados pero no veremos los juegos que tengamos en cartucho.</p>

<p><img src="../assets/img/dumpsgames/nxdump7.jpg" alt="menu_new1" /></p>

<p>Pulsamos “Y” para ver el listado updates y dlcs sin juego bases.</p>

<p><img src="../assets/img/dumpsgames/nxdump8.jpg" alt="menu_new2" /></p>

<p>Ahora veremos una pantalla donde se nos mostrará el contenido disponible para hacer un dump.
Seleccionamos <code class="language-plaintext highlighter-rouge">Nintendo Submission Package (NSP) dump</code>.</p>

<p><img src="../assets/img/dumpsgames/nxdump9.jpg" alt="menu_new3" /></p>

<p>Ahora deberemos de configurar unos parámetros para poder generar un dump correcto y limpio.</p>

<p><img src="../assets/img/dumpsgames/nxdump10.jpg" alt="menu_new4" /></p>

<p><strong>⚠️Advertencia (SOLO si tu tarjeta está en FAT32): En caso de que tu SD esté en formato FAT32 marca la opción <code class="language-plaintext highlighter-rouge">Split output dump (FAT32 support):</code> a <code class="language-plaintext highlighter-rouge">Yes</code> para generar un dump partido en diferentes archivos que luego deberás unir con cualquier programa que haga esto <a href="https://not-d3fau4.com/unir-tu-dump/">o siguiendo nuestro tutorial si eres usuario de Windows.</a>. Es necesario hacer esto por las características propias del formato FAT32.</strong></p>

<p>las siguientes opciones deben de quedar tal que así:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Verify dump using No-intro database: No</code></li>
  <li><code class="language-plaintext highlighter-rouge">Remove console specific data: No</code></li>
  <li><code class="language-plaintext highlighter-rouge">Change NPDM RSA key/sig in Program NCA: No</code></li>
</ul>

<p>Una vez escogido estas opciones seleccionamos <code class="language-plaintext highlighter-rouge">Start NSP dump process</code> y pulsamos “A” para empezar. Y ahora solo quedaría esperar a que termine de dumpear el juego.</p>

<p><img src="../assets/img/dumpsgames/nxdump11.jpg" alt="menu_new5" /></p>

<p>Una vez terminado el proceso mete en el pc la SD y en la ruta <code class="language-plaintext highlighter-rouge">/switch/nxdumptool/NSP</code> podrás ver tus juegos en formato nsp y listos para parchear.</p>

<p><img src="../assets/img/dumpsgames/dumppc1.png" alt="output" /></p>

<h2 id="créditos">Créditos:</h2>
<ul>
  <li><strong><a href="https://twitter.com/shchmue">shchmue</a>: Por su programa <a href="https://github.com/shchmue/Lockpick_RCM/">Lockpick_RCM</a>.</strong></li>
  <li><strong><a href="https://twitter.com/DarkMatterCore">Pablo Curiel (@DarkMatterCore)</a>: Por su programa <a href="https://github.com/DarkMatterCore/nxdumptool/">nxdumptool</a>.</strong></li>
</ul>]]></content><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><category term="TraduSquare" /><category term="Switch" /><category term="Dump" /><summary type="html"><![CDATA[Aquí podrás ver como dumpear tus juegos físicos para poder aplicar los parches de TraduSquare]]></summary></entry><entry><title type="html">Como dumpear tu juego para parchearlo [NSP]</title><link href="https://not-d3fau4.com//como-dumpear-nsp/" rel="alternate" type="text/html" title="Como dumpear tu juego para parchearlo [NSP]" /><published>2021-05-27T11:06:00+02:00</published><updated>2021-05-27T11:06:00+02:00</updated><id>https://not-d3fau4.com//como-dumpear-nsp</id><content type="html" xml:base="https://not-d3fau4.com//como-dumpear-nsp/"><![CDATA[<p><strong>Este tutorial es válido para dumpear tus juegos digitales de Nintendo Switch y poder aplicar cualquier parche de traducción de <a href="https://tradusquare.es/">TraduSquare</a></strong></p>

<h2 id="archivosprogramas-necesarios">Archivos/Programas necesarios:</h2>
<ul>
  <li>Lockpick_RCM: <a href="https://github.com/shchmue/Lockpick_RCM/releases/latest">Descargar</a></li>
  <li><strong>⚠️Advertencia: El programa adjunto en esta web es una versión modificada y adaptadas a las necesidades de nuestros parches, si quieres ver que modificaciones puedes descargar el parche <a href="https://not-d3fau4.com/assets/files/TR.diff">aquí</a>.</strong>
    <ul>
      <li>nxdumptool: <a href="https://not-d3fau4.com/assets/files/nxdumptool-TR.nro">Descargar</a></li>
    </ul>
  </li>
</ul>

<h2 id="1-dumpear-keys">1. Dumpear Keys</h2>

<p>Para poder dumpear nuestro juego primero deberemos extraer las keys de nuestra consola para esto deberemos usar el payload LockPick_RCM que deberías tener ya descargado y extraído/copiado en la carpeta <code class="language-plaintext highlighter-rouge">/bootloader/payloads/</code>  en caso de que quieras ejecutarlo desde <a href="https://github.com/CTCaer/hekate/releases/latest">Hekate</a> o desde cualquier programa para lanzar payloads.</p>

<p><strong>⚠️Advertencia: En consolas Erista (consolas  sin la caja roja) es necesario tener previamente extraído en la SD <a href="https://github.com/Atmosphere-NX/Atmosphere/releases/latest">Atmosphère</a></strong></p>

<p>Una vez arrancado el payload veremos la pantalla principal de <a href="https://github.com/shchmue/Lockpick_RCM/releases/latest">Lockpick_RCM</a>.</p>

<p><img src="../assets/img/dumpsgames/lockpick1.jpg" alt="lockpick rcm" /></p>

<p>Para poder desplazarnos por el menú debemos usar los botones de subir y bajar el volumen y el botón de power para aceptar.</p>

<p><strong>⚠️Advertencia: En caso de que tengamos creada una Emummc/EmuNAND veremos que la segunda opción <code class="language-plaintext highlighter-rouge">Dump from EmuNAND  | Key generation:   X</code> estará habilitada para seleccionar, deberás seleccionar está en vez de la opción que se muestra a continuación.</strong></p>

<p>Seleccionamos <code class="language-plaintext highlighter-rouge">Dump from Sysnand  | Key generation:   X</code> y comenzará el proceso de extracción de keys.</p>

<p>Y en unos pocos segundos ya tendremos las keys guardadas en la SD de la consola en la ruta como muestra en pantalla <code class="language-plaintext highlighter-rouge">/switch/prod.keys</code>:
<img src="../assets/img/dumpsgames/lockpick2.jpg" alt="keys dumpeadas" /></p>

<p>Una vez hecho esto procedemos a iniciar la consola con <a href="https://github.com/Atmosphere-NX/Atmosphere/releases/latest">Atmosphère</a> (CFW) para continuar a dumpear tu juego.</p>

<h2 id="2-dumpear-tu-juego">2. Dumpear tu juego</h2>

<p>Ahora en nuestra switch (asumiendo que ya has instalado/extraído el programa nxdumptool en la sd) procederemos a ir al hbmenu accediendo por el álbum del menú de la consola.</p>

<p><img src="../assets/img/dumpsgames/home1.jpg" alt="menu" /></p>

<p>Una vez ya dentro del hbmenu nos desplazamos hasta el programa nxdumptool y pulsamos “A” para ejecutarlo.</p>

<p><img src="../assets/img/dumpsgames/hbmenu1.jpg" alt="hbmenu" /></p>

<p>Ahora podremos ver la interfaz del programa:
Nos desplazamos hasta <code class="language-plaintext highlighter-rouge">Dump installed SD card / eMMC content</code> y pulsamos “A” para seleccionar:</p>

<p><img src="../assets/img/dumpsgames/nxdump12.jpg" alt="nxdumptool" /></p>

<p>y nos mostrará una lista de todos nuestros juegos instalados, nos desplazamos hasta el juego que queramos dumpear.</p>

<p><img src="../assets/img/dumpsgames/nxdump13.jpg" alt="menu2" /></p>

<p>Ahora veremos una pantalla donde se nos mostrará el contenido disponible para hacer un dump.
Seleccionamos <code class="language-plaintext highlighter-rouge">Nintendo Submission Package (NSP) dump</code>.</p>

<p><img src="../assets/img/dumpsgames/nxdump14.jpg" alt="menu3" /></p>

<p><strong>⚠️Advertencia: En caso de que el juego tenga una update deberás de dumpear también la update seleccionando <code class="language-plaintext highlighter-rouge">Dump installed update NSP</code> y el juego base seleccionando <code class="language-plaintext highlighter-rouge">Dump base application NSP</code> y seguir los pasos siguientes</strong></p>

<p><img src="../assets/img/dumpsgames/nxdump15.jpg" alt="menu4" /></p>

<p>Ahora deberemos de configurar unos parámetros para poder generar un dump correcto y limpio.</p>

<p><img src="../assets/img/dumpsgames/nxdump16.jpg" alt="menu5" /></p>

<p><strong>⚠️Advertencia (SOLO si tu tarjeta está en FAT32): En caso de que tu SD esté en formato FAT32 marca la opción <code class="language-plaintext highlighter-rouge">Split output dump (FAT32 support):</code> a <code class="language-plaintext highlighter-rouge">Yes</code> para generar un dump partido en diferentes archivos que luego deberás unir con cualquier programa que haga esto <a href="https://not-d3fau4.com/unir-tu-dump/">o siguiendo nuestro tutorial si eres usuario de Windows.</a>. Es necesario hacer esto por las características propias del formato FAT32.</strong></p>

<p>las siguientes opciones deben de quedar tal que así:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Verify dump using No-intro database: No</code></li>
  <li><code class="language-plaintext highlighter-rouge">Remove console specific data: No</code></li>
  <li><code class="language-plaintext highlighter-rouge">Change NPDM RSA key/sig in Program NCA: No</code></li>
</ul>

<p>Una vez escogido estas opciones seleccionamos <code class="language-plaintext highlighter-rouge">Start NSP dump process</code> y pulsamos “A” para empezar. Y ahora solo quedaría esperar a que termine de dumpear el juego.</p>

<p><img src="../assets/img/dumpsgames/nxdump17.jpg" alt="dump1" /></p>

<p><img src="../assets/img/dumpsgames/nxdump18.jpg" alt="dump2" /></p>

<p>Una vez terminado el proceso mete en el pc la SD y en la ruta <code class="language-plaintext highlighter-rouge">/switch/nxdumptool/NSP</code> podrás ver tus juegos en formato nsp y listos para parchear.</p>

<p><img src="../assets/img/dumpsgames/dumppc2.png" alt="output" /></p>

<h2 id="créditos">Créditos:</h2>
<ul>
  <li><strong><a href="https://twitter.com/shchmue">shchmue</a>: Por su programa <a href="https://github.com/shchmue/Lockpick_RCM/">Lockpick_RCM</a>.</strong></li>
  <li><strong><a href="https://twitter.com/DarkMatterCore">Pablo Curiel (@DarkMatterCore)</a>: Por su programa <a href="https://github.com/DarkMatterCore/nxdumptool/">nxdumptool</a>.</strong></li>
</ul>]]></content><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><category term="TraduSquare" /><category term="Switch" /><category term="Dump" /><summary type="html"><![CDATA[Aquí podrás ver como dumpear tus juegos digitales para poder aplicar los parches de TraduSquare]]></summary></entry><entry><title type="html">Como unir tu dump a un solo archivo</title><link href="https://not-d3fau4.com//unir-tu-dump/" rel="alternate" type="text/html" title="Como unir tu dump a un solo archivo" /><published>2021-05-27T11:06:00+02:00</published><updated>2021-05-27T11:06:00+02:00</updated><id>https://not-d3fau4.com//unir-tu-dump</id><content type="html" xml:base="https://not-d3fau4.com//unir-tu-dump/"><![CDATA[<p><strong>Este tutorial es válido para dumpear tus juegos digitales de Nintendo Switch y poder aplicar cualquier parche de traducción de <a href="https://tradusquare.es/">TraduSquare</a></strong></p>

<h2 id="archivosprogramas-necesarios">Archivos/Programas necesarios:</h2>
<ul>
  <li>Script: <a href="../assets/files/join.ps1">Descargar</a></li>
</ul>

<h2 id="1-ejecutar-script">1. Ejecutar script</h2>
<p>Una vez ya descargado el script deberás de hacer click derecho al script y seleccionar la opción <code class="language-plaintext highlighter-rouge">Ejecutar con PowerShel</code> y se nos abrirá una ventana de PowerShell donde nos preguntará por la carpeta que contenga el dump</p>

<p><img src="../assets/img/dumpsgames/script1.png" alt="screen1" /></p>

<p>una vez escrito o arrastrado la carpeta con el dump nos preguntara por una carpeta para poder guardar el dump unido.</p>

<p><img src="../assets/img/dumpsgames/script2.png" alt="screen2" /></p>

<p>Y por ultimo nos preguntará si nuestro dump proviene de la edición física del juego (cartucho) o de la versión digital (eShop).</p>

<p><img src="../assets/img/dumpsgames/script3.png" alt="screen3" /></p>

<p>Y una vez termine el proceso la ventana se cerrara y ya podremos ver en la carpeta que hemos puesto que guarde el dump el archivo completo y listo para poder parchear tu juego.</p>

<p><img src="../assets/img/dumpsgames/dumppc3.png" alt="Screen4" /></p>]]></content><author><name>Not-D3fau4</name><email>d3fau4@not-d3fau4.com</email></author><category term="TraduSquare" /><category term="Switch" /><category term="windows" /><summary type="html"><![CDATA[Aquí podrás ver como unir tu dump en caso de que esté partido en varios archivos]]></summary></entry></feed>