{"id":75,"date":"2011-12-14T18:29:46","date_gmt":"2011-12-14T18:29:46","guid":{"rendered":"http:\/\/52.15.227.128\/?p=75"},"modified":"2018-01-03T23:34:27","modified_gmt":"2018-01-03T23:34:27","slug":"trainer-buscaminas-hook-cheat","status":"publish","type":"post","link":"https:\/\/0aps.me\/blog\/2011\/12\/14\/trainer-buscaminas-hook-cheat\/","title":{"rendered":"Trainer BuscaMinas (hook + cheat)"},"content":{"rendered":"<p>Este art\u00edculo pertenece a una serie de dudas antiguas que fueron publicadas en foros de internet antes de la creaci\u00f3n del blog, lo plasmo aqu\u00ed para no perderlas y que formen parte de la antolog\u00eda.<\/p>\n<p>Post:<\/p>\n<blockquote><p>\nSaludos, <\/p>\n<p>Aqui les dejo un programa que modifica la memoria del buscaminas para sobreescribir las direcciones donde hayan bombas en mapa.<\/p>\n<p>[code language=&#8221;cpp&#8221;]<br \/>\n#include &lt;iostream&gt;<br \/>\n#include &lt;windows.h&gt;<br \/>\n#include &lt;Tlhelp32.h&gt;<\/p>\n<p>using namespace std;<\/p>\n<p>DWORD Buscar_Proceso();<\/p>\n<p>\/*<br \/>\n  Name: trainer buscaminas<br \/>\n  Author: @aps<br \/>\n  Date: 14\/12\/11 17:51<br \/>\n*\/<\/p>\n<p>HANDLE CProc;<br \/>\nHANDLE hProc;<br \/>\nPROCESSENTRY32 Proceso;<br \/>\nDWORD   pid;<\/p>\n<p>int main()<br \/>\n{<\/p>\n<p>BYTE    *celda;<br \/>\nDWORD   mapa = 0x01005360;<br \/>\nDWORD   aux;<\/p>\n<p>     if(Buscar_Proceso() != 0)<br \/>\n     {<br \/>\n                       cout &lt;&lt; &quot;Se encontro el proceso. &quot; &lt;&lt; endl;<br \/>\n                       cout &lt;&lt; &quot;El pid es : &quot; &lt;&lt; hex &lt;&lt; pid &lt;&lt; endl;<br \/>\n     }else cout &lt;&lt; &quot;No se encontro el proceso.&quot; ;  <\/p>\n<p>     if( (hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid) ) == NULL)<br \/>\n                {<br \/>\n                  cout &lt;&lt; &quot;No se pudo abrir el proceso. &quot; &lt;&lt; endl;<br \/>\n                }else cout &lt;&lt; &quot;Se abrio el proceso.&quot; &lt;&lt; endl;<\/p>\n<p>     if( (VirtualProtectEx(hProc ,(void *)mapa, 0x2FF, PAGE_EXECUTE_READWRITE, &amp;aux)) == 0)<br \/>\n         {<br \/>\n           cout &lt;&lt; &quot;Error al cambiar los permisos de la zona &quot; &lt;&lt; mapa &lt;&lt; endl;<br \/>\n         }else cout &lt;&lt; &quot;Se modificaron los permisos en &quot; &lt;&lt; mapa &lt;&lt; endl;<\/p>\n<p>     for(int x(0); (mapa+x) &lt;= (mapa + 0x2ff ); x++ )<br \/>\n     {<\/p>\n<p>             if ( ReadProcessMemory( hProc, (LPVOID)(mapa+x), celda, 1, NULL) == 0)<br \/>\n             {<br \/>\n                        cout &lt;&lt; &quot;Error al leer en &quot; &lt;&lt;  (mapa+x) &lt;&lt; endl;<br \/>\n             }else cout &lt;&lt; &quot;Se leyo en &quot; &lt;&lt; (mapa+x) &lt;&lt; &quot; el valor &quot; &lt;&lt; celda &lt;&lt; endl;          <\/p>\n<p>             if( *celda == 0x8f )<br \/>\n             {<br \/>\n                 *celda = 0x48;<\/p>\n<p>                 if(  WriteProcessMemory(hProc, (void *)(mapa+x), celda,<br \/>\n                        1, NULL)  == 0 )<br \/>\n               {<br \/>\n                        cout &lt;&lt; &quot;Error al escribir en &quot; &lt;&lt; (mapa+x) &lt;&lt; endl;<br \/>\n               }else{ cout &lt;&lt; &quot;Se modifico &quot; &lt;&lt; (mapa+x) &lt;&lt; endl;}    <\/p>\n<p>             }<br \/>\n     }<\/p>\n<p>    setbuf(stdin, NULL);<br \/>\n    cin.get();<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>DWORD Buscar_Proceso()<br \/>\n{<\/p>\n<p>    \/\/Con esto creamos una captura de la lista de procesos y la guardamos en CProc<br \/>\n    CProc          =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   <\/p>\n<p>    Proceso.dwSize =   sizeof(PROCESSENTRY32);<\/p>\n<p>    Process32First(CProc,&amp;Proceso);    \/\/Leemos el primer proceso<\/p>\n<p>    \/\/Mientras haya procesos para leer leemos el siguiente<br \/>\n\twhile(Process32Next(CProc,&amp;Proceso))<br \/>\n\t{<\/p>\n<p>\t  if(!strcmp(Proceso.szExeFile, &quot;winmine.exe&quot;) )<br \/>\n         {<br \/>\n           return pid = Proceso.th32ProcessID;<\/p>\n<p>         }<br \/>\n    }<br \/>\n    return  pid = 0;<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Y aqui una dll que hookea la api CreatePen, intente hacer una combinacion de dos metodos para hacer api-hooking de practica. Esto me llevo toda la tarde hacerlo asi que apreciaria si alguien puede hacerle algun comentario, verle un fallo, algo a mejorar? : )<\/p>\n<p>[code language=&#8221;cpp&#8221;]<br \/>\n\/* Replace &quot;dll.h&quot; with the name of your header *\/<\/p>\n<p>#include &lt;windows.h&gt;<br \/>\n#include &lt;Tlhelp32.h&gt;<br \/>\n#include &lt;stdio.h&gt;<\/p>\n<p>\/*<br \/>\n  Name: trainer buscaminas<br \/>\n  Author: @aps<br \/>\n  Date: 14\/12\/11 17:51<br \/>\n*\/<\/p>\n<p>void HookImport();<br \/>\nHPEN __stdcall CreatePenF( int , int , COLORREF  );<\/p>\n<p>BOOL APIENTRY DllMain (HINSTANCE hInst     \/* Library instance handle. *\/ ,<br \/>\n                       DWORD reason        \/* Reason this function is being called. *\/ ,<br \/>\n                       LPVOID reserved     \/* Not used. *\/ )<br \/>\n{<br \/>\n    switch (reason)<br \/>\n    {<br \/>\n      case DLL_PROCESS_ATTACH:<br \/>\n          HookImport();<br \/>\n        break;<\/p>\n<p>      case DLL_PROCESS_DETACH:<br \/>\n        break;<\/p>\n<p>      case DLL_THREAD_ATTACH:<br \/>\n        break;<\/p>\n<p>      case DLL_THREAD_DETACH:<br \/>\n        break;<br \/>\n    }<\/p>\n<p>    \/* Returns TRUE on success, FALSE on failure *\/<br \/>\n    return TRUE;<br \/>\n}<\/p>\n<p>void HookImport()<br \/>\n{<br \/>\n  HMODULE Prog  = GetModuleHandle(0);<br \/>\n  HMODULE Gdi32   = GetModuleHandle(&quot;Gdi32.dll&quot;);<br \/>\n  DWORD CreatePen = (DWORD)GetProcAddress(Gdi32, &quot;CreatePen&quot;);<br \/>\n  int x;<\/p>\n<p>  PIMAGE_DOS_HEADER Img = (PIMAGE_DOS_HEADER)Prog;<\/p>\n<p>  \/\/e lfanew apunta a donde empieza el encabezado nt<br \/>\n  PIMAGE_NT_HEADERS Pe  = (PIMAGE_NT_HEADERS) ((BYTE*)Img + Img-&gt;e_lfanew); <\/p>\n<p>  \/\/ obtengo la direccion del import en la seccion .text<br \/>\n  LPDWORD ImportAddr = (LPDWORD)(<br \/>\n  Pe-&gt;OptionalHeader.BaseOfCode + (DWORD)Img);<\/p>\n<p>  DWORD old;<\/p>\n<p>  \/\/le cambio los privilegios<br \/>\n  VirtualProtect(ImportAddr,<br \/>\n  Pe-&gt;OptionalHeader.SizeOfCode, PAGE_READWRITE, &amp;old); <\/p>\n<p>  for ( x= 0; x &lt; Pe-&gt;OptionalHeader.SizeOfCode; x += 4, ImportAddr++)<br \/>\n  {<br \/>\n   \/\/si la funcion es CreatePen<br \/>\n      if (*ImportAddr == CreatePen)<br \/>\n     {<br \/>\n        \/\/cambio los primeros cuatro bytes que apuntan a la direccion de memoria de CreatePen<br \/>\n        \/\/por los de mi funcion<br \/>\n       *ImportAddr = (DWORD)&amp;CreatePenF;<br \/>\n        break;<br \/>\n      }\t\t<\/p>\n<p>   }<\/p>\n<p>}<\/p>\n<p>HPEN __stdcall CreatePenF( int fnPenStyle, int nWidth, COLORREF crColor )<br \/>\n{<br \/>\n    fnPenStyle = PS_DASHDOT;<br \/>\n    nWidth     = 20;<br \/>\n    crColor    = RGB(255, 0, 0);<\/p>\n<p>    BYTE  *Buffer = (BYTE *)malloc(5);<br \/>\n    BYTE  *DirApi = (BYTE *)GetProcAddress(GetModuleHandle(&quot;Gdi32.dll&quot;),&quot;CreatePen&quot;);<\/p>\n<p>    *Buffer=0xE9;<br \/>\n    Buffer++;<\/p>\n<p>    \/\/api menos el principio del buffer<br \/>\n    *((signed int *) Buffer) = DirApi &#8211; Buffer &#8211; 4;<\/p>\n<p>    return ( (HPEN(__stdcall *) (int,int, COLORREF) ) Buffer-1)(fnPenStyle, nWidth, crColor);<\/p>\n<p>}<br \/>\n[\/code]<\/p>\n<p>Para inyectar la dll usen http:\/\/www.portalhacker.net\/index.php\/topic,146134.0.html<br \/>\nLuego cuando abran el buscaminas vayan a game, activen y desactiven la casilla color y ya esta.<\/p>\n<p>Espero q alguien le sirva!<\/p>\n<p>PD. Estoy en windows sp3, ingles y me funciona a la perfeccion.<\/p>\n<p>Saludos.  \ud83d\ude1b\n<\/p><\/blockquote>\n<p>Respuesta:<\/p>\n<blockquote><p>\nHaha tienes razon no lo comente.  \ud83d\ude1b<\/p>\n<p>Fijate en el buscaminas se reserva memoria para el mapa y cada una de las celdas. Cuando no hay nada en la celda es porque esta este byte (0x0F). Cuando hay un 1 o un 2, 3, etc, estan estos bytes (0x41 o 0x42, 0x43, etc.). Cuando hay una mina en la celda esta este byte (0x8f).<\/p>\n<p>El mapa comienza en esta direccion 0x01005360 y termina en 0x01005360+0x2ff. Por lo tanto lo que hago es recorrer el mapa en busqueda de este byte 0x8f y lo cambio por este 0x48 (8).<\/p>\n<p>En la dll lo que hago es hookar la api CreatePen, usando el import addres table hooking.  En el buscaminas las importaciones estan dentro de la seccion .text al principio.<\/p>\n<p>Asi que busco donde esta la seccion .text y le sumo el ImageBase. Luego voy avanzado cada 4 bytes hasta que encuentro la direccion d Create Pen, y la sustituyo por la direccion de mi funcion.<\/p>\n<p>Luego en la funcion cambio los parametros  y creo un buffer que haga un salto hacia la funcion original pasandole los parametros modificados. : D<\/p>\n<p>Queda asi cuando ejecutas la dll y el cheat.<br \/>\n<img decoding=\"async\" src=\"http:\/\/img141.imageshack.us\/img141\/9408\/buscaminas.png\" \/><br \/>\nEs la primera vez que hago este tipo de cosas asi que han de haber muchos errores y formas de hacerlo mejor. xP<\/p>\n<p>un saludos.  : )\n<\/p><\/blockquote>\n<p>Saludos,<br \/>\n\u00c1ngel<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo pertenece a una serie de dudas antiguas que fueron publicadas en foros de internet antes de la creaci\u00f3n del blog, lo plasmo aqu\u00ed para no perderlas y que formen parte de la antolog\u00eda. Post: Saludos, Aqui les dejo un programa que modifica la memoria del buscaminas para sobreescribir las direcciones donde hayan bombas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[44,42,46,45,43],"class_list":["post-75","post","type-post","status-publish","format-standard","hentry","category-prog","tag-api-hook","tag-buscaminas","tag-c","tag-cheat","tag-hook"],"acf":[],"_links":{"self":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/75","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/comments?post=75"}],"version-history":[{"count":3,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/75\/revisions"}],"predecessor-version":[{"id":78,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/75\/revisions\/78"}],"wp:attachment":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/media?parent=75"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/categories?post=75"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/tags?post=75"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}