<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Winapi on devcodenote.gitlab.io</title><link>https://devcodenote.gitlab.io/tags/winapi/</link><description>Recent content in Winapi on devcodenote.gitlab.io</description><generator>Hugo -- gohugo.io</generator><language>es-es</language><lastBuildDate>Wed, 26 Aug 2026 13:19:00 -0600</lastBuildDate><atom:link href="https://devcodenote.gitlab.io/tags/winapi/index.xml" rel="self" type="application/rss+xml"/><item><title>Cómo realizar una inyección de DLL y un API hooking en VC++.</title><link>https://devcodenote.gitlab.io/posts/dll-injection-and-api-hooking/</link><pubDate>Wed, 26 Aug 2026 13:19:00 -0600</pubDate><guid>https://devcodenote.gitlab.io/posts/dll-injection-and-api-hooking/</guid><description>&lt;img src="https://i.imgur.com/OevSvSv.png" alt="Featured image of post Cómo realizar una inyección de DLL y un API hooking en VC++." />&lt;h1 id="que-es-una-inyección-de-dll">Que es una inyección de DLL?
&lt;/h1>&lt;p>La inyección de dll es una técnica que permite inyectar código en procesos legítimos, esto se hace para modificar el comportamiento de un ejecutable o para ocultar código malicioso en procesos.&lt;/p>
&lt;p>para poder explicar que es una inyección de dll debemos crear un ejecutable que nos permita ver que es lo que pasa.&lt;/p>
&lt;p>este programa va a ser util como para hacer una inyección dll y hacer api hooking.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;windows.h&amp;gt; &lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;thread&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;chrono&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;fstream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;string&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Running loop. Press Ctrl+C to exit.&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (true) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Sleep&lt;/span>(&lt;span style="color:#ae81ff">5000&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Sleep&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>ifstream &lt;span style="color:#a6e22e">file&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;example.txt&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>file.&lt;span style="color:#a6e22e">is_open&lt;/span>()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cerr &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Error: Could not open the file.&amp;#34;&lt;/span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>endl;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">continue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>string line;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (std&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#a6e22e">getline&lt;/span>(file, line)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> line &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> &lt;span style="color:#e6db74">&amp;#39;\n&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Para este caso vamos a crear una DLL simple que solo tenga un msgbox.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;#34;pch.h&amp;#34;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>BOOL APIENTRY &lt;span style="color:#a6e22e">DllMain&lt;/span>(HMODULE hModule,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD ul_reason_for_call,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> LPVOID lpReserved
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">switch&lt;/span> (ul_reason_for_call)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_PROCESS_ATTACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MessageBoxA&lt;/span>(NULL, &lt;span style="color:#e6db74">&amp;#34;Hello World!&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;DLL de prueba&amp;#34;&lt;/span>, MB_OK &lt;span style="color:#f92672">|&lt;/span> MB_ICONINFORMATION);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_THREAD_ATTACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_THREAD_DETACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_PROCESS_DETACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> TRUE;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Este es el programa que se va a usar para aplicar la inyección DLL; al leer el archivo, se hace uso de WINAPI, más en específico el uso de la WINAPI ReadFile; esto nos va a ser de utilidad más adelante para el API Hooking.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;string&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;thread&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;libloaderapi.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;filesystem&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>using namespace std;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>namespace fs &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>filesystem;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">bool&lt;/span> &lt;span style="color:#a6e22e">dll_exists&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>string&lt;span style="color:#f92672">&amp;amp;&lt;/span> file_name)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (file_name.&lt;span style="color:#a6e22e">empty&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>error_code ec;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>filesystem&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#a6e22e">is_regular_file&lt;/span>(file_name, ec) &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>filesystem&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#a6e22e">path&lt;/span>(file_name).&lt;span style="color:#a6e22e">extension&lt;/span>() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;.dll&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD proc_id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">13568&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span> dll_path[MAX_PATH];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> dll_name &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;nulldll.dll&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">dll_exists&lt;/span>(dll_name)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>( &lt;span style="color:#e6db74">&amp;#34;Err:DLL Doesn&amp;#39;t exist!&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">GetFullPathNameA&lt;/span>(dll_name, MAX_PATH, dll_path, nullptr)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>( &lt;span style="color:#e6db74">&amp;#34;Err:GetFullPathNameA&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HANDLE h_process &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">OpenProcess&lt;/span>(PROCESS_ALL_ACCESS, FALSE, proc_id);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>h_process) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>( &lt;span style="color:#e6db74">&amp;#34;Err:OpenProcess&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> allocated_memory &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">VirtualAllocEx&lt;/span>(h_process, nullptr, MAX_PATH, MEM_RESERVE &lt;span style="color:#f92672">|&lt;/span> MEM_COMMIT, PAGE_READWRITE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>allocated_memory) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Err:VirtualAllocEx&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">char&lt;/span> buffer[&lt;span style="color:#ae81ff">512&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">sprintf_s&lt;/span>(buffer, &lt;span style="color:#e6db74">&amp;#34;Direccion: 0x%p&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, allocated_memory);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>(buffer);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>&lt;span style="color:#a6e22e">WriteProcessMemory&lt;/span>(h_process, allocated_memory, dll_path, MAX_PATH, nullptr)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Err:WriteProcessMemory&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HANDLE h_thread &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">CreateRemoteThread&lt;/span>(h_process, nullptr, NULL, &lt;span style="color:#a6e22e">LPTHREAD_START_ROUTINE&lt;/span>(LoadLibraryA), allocated_memory, NULL, nullptr);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>h_thread) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringA&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Err:CreateRemoteThread&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">CloseHandle&lt;/span>(h_process);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">VirtualFreeEx&lt;/span>(h_process, allocated_memory, NULL, MEM_RELEASE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">CloseHandle&lt;/span>(h_process);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>En este código hay tres WinAPI que son de importancia: VirtualAllocEx, WriteProcessMemory, CreateRemoteThread
`
VirtualAllocEx: Reserva una región de memoria dentro del espacio virtual del proceso objetivo y devuelve su dirección base&lt;/p>
&lt;p>WriteProcessMemory: Copia bytes desde el proceso que llama hacia una dirección del proceso objetivo.&lt;/p>
&lt;p>CreateRemoteThread: Crea un hilo cuya ejecución comienza en el espacio de direcciones del proceso objetivo
`
abrimos un el programa que se va a usar para la inyección DLL&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/yKl5KI6.png"
loading="lazy"
alt="x86dbg dll module symbols"
>&lt;/p>
&lt;p>Vamos al apartado de symbols, donde podemos observar los DLL cargados. Ejecutamos como administrador el programa que se encarga de hacer la inyección DLL. En la parte de x86dbg, vamos a Options -&amp;gt; Preferences y User DLL load la marcamos. Cuando se haga la inyección, x86dbg se va a detener, como se observa en la imagen.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/jh6mvOZ.png"
loading="lazy"
alt="dll injection"
>&lt;/p>
&lt;p>También podemos observar que se cargan más DLL; esto es importante porque en las inyecciones DLL nos puede ocasionar problemas.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/GuDWqOk.png"
loading="lazy"
alt="Modulos Cargados por dll"
>&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/MDtIj75.png"
loading="lazy"
alt="x86dbg dll load"
>&lt;/p>
&lt;h2 id="api-hooking">API Hooking
&lt;/h2>&lt;p>El API hooking es un método por el cual interceptamos una WINAPI en la ejecución de un programa; con esto podemos modificar el comportamiento del programa o podemos observar lo que ocurre con el programa. Como se mencionó al inicio del artículo, vamos a ver qué ocurre con la WINAPI ReadFile. Para esto, lo más fácil es simplemente inyectar una DLL con MinHook, que es una librería que simplifica el hook.&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/TsudaKageyu/minhook" target="_blank" rel="noopener"
>https://github.com/TsudaKageyu/minhook&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone https://github.com/microsoft/vcpkg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#ae81ff">\v&lt;/span>cpkg&lt;span style="color:#ae81ff">\b&lt;/span>ootstrap-vcpkg.bat
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#ae81ff">\v&lt;/span>cpkg&lt;span style="color:#ae81ff">\v&lt;/span>cpkg integrate install
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#ae81ff">\v&lt;/span>cpkg&lt;span style="color:#ae81ff">\v&lt;/span>cpkg install minhook
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://i.imgur.com/JVGY0LY.png"
loading="lazy"
>&lt;/p>
&lt;p>Con esto instalamos MinHook; una vez instalada, creamos una DLL. .&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>BOOL APIENTRY &lt;span style="color:#a6e22e">DllMain&lt;/span>(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">switch&lt;/span> (ul_reason_for_call) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_PROCESS_ATTACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">DisableThreadLibraryCalls&lt;/span>(hModule);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;DLL_PROCESS_ATTACH ok&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">CreateThread&lt;/span>(NULL, &lt;span style="color:#ae81ff">0&lt;/span>, HookThread, NULL, &lt;span style="color:#ae81ff">0&lt;/span>, NULL) &lt;span style="color:#f92672">==&lt;/span> NULL) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Err HookThread&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">case&lt;/span> DLL_PROCESS_DETACH:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;DLL_PROCESS_DETACH fail&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">break&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> TRUE;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://i.imgur.com/g3hOnV1.png"
loading="lazy"
>&lt;/p>
&lt;p>En la parte del código debemos tener en cuenta que ocupamos &lt;code>DisableThreadLibraryCalls&lt;/code> y debemos crear un hilo para no monopolizar el programa; para eso usamos &lt;code>CreateThread&lt;/code>.&lt;/p>
&lt;p>Para hacer un hook podemos usar el código de ejemplo de MinHook; si se usa el ejemplo, queda de esta forma.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>DWORD WINAPI &lt;span style="color:#a6e22e">HookThread&lt;/span>(LPVOID)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">MH_Initialize&lt;/span>() &lt;span style="color:#f92672">!=&lt;/span> MH_OK) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;MinHook failed&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HMODULE hKernelBase &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">GetModuleHandleW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;kernelbase.dll&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>hKernelBase) hKernelBase &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">LoadLibraryW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;kernelbase.dll&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (hKernelBase) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> pReadFile &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)&lt;span style="color:#a6e22e">GetProcAddress&lt;/span>(hKernelBase, &lt;span style="color:#e6db74">&amp;#34;ReadFile&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (pReadFile) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MH_CreateHook&lt;/span>(pReadFile, &lt;span style="color:#f92672">&amp;amp;&lt;/span>HookedReadFile, reinterpret_cast&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">**&amp;gt;&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>TargetReadFile));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> pCreateFileW &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)&lt;span style="color:#a6e22e">GetProcAddress&lt;/span>(hKernelBase, &lt;span style="color:#e6db74">&amp;#34;CreateFileW&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (pCreateFileW) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MH_CreateHook&lt;/span>(pCreateFileW, &lt;span style="color:#f92672">&amp;amp;&lt;/span>HookCreateFileW, reinterpret_cast&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">**&amp;gt;&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>fpCreateFileW));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> pLoadLibraryW &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)&lt;span style="color:#a6e22e">GetProcAddress&lt;/span>(hKernelBase, &lt;span style="color:#e6db74">&amp;#34;LoadLibraryW&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (pLoadLibraryW) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MH_CreateHook&lt;/span>(pLoadLibraryW, &lt;span style="color:#f92672">&amp;amp;&lt;/span>HookLoadLibraryW, reinterpret_cast&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">**&amp;gt;&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>fpLoadLibraryW));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">MH_EnableHook&lt;/span>(MH_ALL_HOOKS) &lt;span style="color:#f92672">==&lt;/span> MH_OK) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;hooks init&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Aquí vemos que se hace hook a las WinAPI de ReadFile, CreateFileW, LoadLibraryW; para cada uno debemos hacer una función.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span> pReadFile &lt;span style="color:#f92672">=&lt;/span> (&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">*&lt;/span>)&lt;span style="color:#a6e22e">GetProcAddress&lt;/span>(hKernelBase, &lt;span style="color:#e6db74">&amp;#34;ReadFile&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (pReadFile) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">MH_CreateHook&lt;/span>(pReadFile, &lt;span style="color:#f92672">&amp;amp;&lt;/span>HookedReadFile, reinterpret_cast&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">void&lt;/span>&lt;span style="color:#f92672">**&amp;gt;&lt;/span>(&lt;span style="color:#f92672">&amp;amp;&lt;/span>TargetReadFile));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Creamos una función para read file; debemos tener en cuenta que los parámetros originales deben ser pasados mediante la función.&lt;/p>
&lt;p>`
ReadFile function (fileapi.h)&lt;/p>
&lt;p>Reads data from the specified file or input/output (I/O) device. Reads occur at the position specified by the file pointer if supported by the device.&lt;/p>
&lt;p>BOOL ReadFile(
[in] HANDLE hFile,
[out] LPVOID lpBuffer,
[in] DWORD nNumberOfBytesToRead,
[out, optional] LPDWORD lpNumberOfBytesRead,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
`&lt;/p>
&lt;p>Por lo que la funcion debe quedar asi.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>BOOL WINAPI &lt;span style="color:#a6e22e">HookedReadFile&lt;/span>(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BOOL ok &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">TargetReadFile&lt;/span>(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (ok &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#a6e22e">GetFileType&lt;/span>(hFile) &lt;span style="color:#f92672">==&lt;/span> FILE_TYPE_DISK) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">wchar_t&lt;/span> path[MAX_PATH];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DWORD r &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">GetFinalPathNameByHandleW&lt;/span>(hFile, path, &lt;span style="color:#a6e22e">_countof&lt;/span>(path), FILE_NAME_NORMALIZED);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (r &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> r &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">_countof&lt;/span>(path)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(&lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;ReadFile: &amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">wcsncmp&lt;/span>(path, &lt;span style="color:#e6db74">L&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\\\\&lt;/span>&lt;span style="color:#e6db74">?&lt;/span>&lt;span style="color:#ae81ff">\\&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>) &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(path &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">4&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">OutputDebugStringW&lt;/span>(path);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> ok;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p> Mediante OutputDebugStringW vamos a leer los resultados y también se va a hacer el uso de ida; hacemos esto con todas las funciones que se vayan a usar.&lt;/p>
&lt;p>Abrimos el ejecutable, que es la prueba.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/7GuVPLD.png"
loading="lazy"
alt="x86dbg"
>&lt;/p>
&lt;p>Nos vamos al apartado de symbols y ponemos el DLL que acabamos de generar. x86dbg tiene una opción para hacer la inyección; por el momento nos va a ser de utilidad, con eso hacemos la inyección.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/Fv6GclT.png"
loading="lazy"
alt="x86dbg"
>&lt;/p>
&lt;p>Una vez cargada la DLL, vemos que hay una DLL que se llama minhook.x64.dll y dllhook.dll; esto significa que está bien cargada la DLL. Vamos a ver qué nos manda dbgview.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/CR9Ueg3.png"
loading="lazy"
alt="x86dbg"
>&lt;/p>
&lt;p>Como podemos observar en la salida, tenemos la ruta del archivo y el nombre de la WinAPI que se llama, por lo que nuestro API hooking está funcionando bien.&lt;/p>
&lt;h1 id="eliminacion-de-minhookdll">Eliminacion de minhook.dll
&lt;/h1>&lt;p>En términos prácticos, si se quiere hacer una inyección mediante AppInit_DLLs, todo debe quedar en un solo DLL; no debemos tener minhook.x32.dll ni minhook.x64.dll. Como sabemos, para procesos de 32 bits debemos usar DLL únicamente en 32 bits; lo mismo pasa para 64 bits.&lt;/p>
&lt;p>Cabe mencionar que también se puede hacer una inyección permanente en user-mode usando el registro.&lt;/p>
&lt;p>32 bits
&lt;code>regjump &amp;quot;HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows&amp;quot;&lt;/code>&lt;/p>
&lt;p>64 bits
&lt;code>regjump &amp;quot;HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows&amp;quot;&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/OevSvSv.png"
loading="lazy"
alt="ida disassembler"
>&lt;/p>
&lt;p>Como podemos observar, la DLL está como dependencia en los DLL importados.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/nFEqrbN.png"
loading="lazy"
alt="IDA dll import"
>&lt;/p>
&lt;p>Para esto debemos instalar&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#ae81ff">\v&lt;/span>cpkg&lt;span style="color:#ae81ff">\v&lt;/span>cpkg install minhook:x86-windows-static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#ae81ff">\v&lt;/span>cpkg&lt;span style="color:#ae81ff">\v&lt;/span>cpkg install minhook:x64-windows-static
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://i.imgur.com/XjpnD4U.png"
loading="lazy"
alt="minhook x64-windows-static"
>&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/JVGY0LY.png"
loading="lazy"
alt="minhook x86-windows-static"
>&lt;/p>
&lt;p>Y se debe configurar lo siguiente en VS Studio.&lt;/p>
&lt;p>&lt;img src="https://i.imgur.com/j0bzu2E.png"
loading="lazy"
>
&lt;img src="https://i.imgur.com/Z23vdsR.png"
loading="lazy"
>&lt;/p>
&lt;p>Una vez configurado esto, ya debemos tener una sola DLL y no depender de minhook.x32.dll.&lt;/p></description></item></channel></rss>