Ir a contenido

PURCHASE MEMBERSHIP AT A 25% DISCOUNT Apply here

GET 1 MONTH OF MEMBERSHIP BY CHOOSING THE NEW NAME OF OUR COMPANY! Apply here


Photo

[Resuelto]Es este código correcto?


      
[Resuelto]Es este código correcto?

CrazyFrog98
#1

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Buenas, es este código correcto?
Quiero imitar esto: http://i.stack.imgur.com/jQMds.png

Con este código:

Code:
#include <windows.h>
#include <iostream>

void main() {
  HWND hWnd = FindWindow(0, TEXT("WindowName") );
if (hWnd == 0) {
    std::cerr << "Cannot find window." << std::endl;
}
else {
    DWORD pId;
    GetWindowThreadProcessId(hWnd, &pId);
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
    if (hProc) {
        char *newString = "newvalue";
        size_t sz = strlen(newString) + 1;
        LPVOID baseAddress = (LPVOID)0x009B03D0;
        DWORD offset = 0xA7;
        LPVOID ptrAddress = new char[sz];
        SIZE_T bytes_read = 0, bytes_written=0;
        if (ReadProcessMemory(hProc, baseAddress, ptrAddress, sz, &bytes_read) || GetLastError()== ERROR_PARTIAL_COPY) {
            if (bytes_read == 0)
                std::cerr << "Houston, we have a problem..." << std::endl;
            if(!WriteProcessMemory(hProc, baseAddress, (LPCVOID)newString, sz, &bytes_written))
                std::cerr << "Couldn't write process memory:" << GetLastError() << std::endl;
            std::cout << "Done. " << bytes_read <<" bytes read and "<<bytes_written<<" bytes written"<< std::endl;
        }
        else {
            std::cerr<< "Couldn't read process memory:" << GetLastError() << std::endl;
        }
        delete[] ptrAddress;
    }
    else {
        std::cerr << "Couldn't open process " << pId << ": " << GetLastError() << std::endl;
    }
}
std::getchar();
}





Mi intención es editar un programa con este pointer: "WindowName.exe" + 009B03D0 + A7
Pero no me edita el address que quiero... y por lo que veo ptrAddress no se parece mucho a lo que muestra CheatEngine

Gracias

CrazyFrog98
#2

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Lo he cambiado, Ahora lee Perfectamente.. el problema es si en vez de READ lo cambiamos por WRITE, pues no funciona.

Code:
int main()
{
    unsigned long Pointer;  /* to hold the final value */
    unsigned long temp;      /* hold the temp values    */
    unsigned long address = 0x009B03D0;
    unsigned long offset = 0xA7;
    char *newString = "dosydosespesypes";
    size_t sz = strlen(newString);
    SIZE_T bytes_read = 0, bytes_written = 0;
    DWORD pid;
    HWND hwnd;
    hwnd = FindWindow(0, TEXT("NewWindow"));
    if (!hwnd)
    {
        cout << "Process Not Found!\n";
        cin.get();
    }
    else
    {
        GetWindowThreadProcessId(hwnd, &pid);
        HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
        if (!phandle)
        {
            cout << "Unknown error...!\n";
            cin.get();
        }
        else
        {
            while (1)
            {

                ReadProcessMemory(phandle, reinterpret_cast<LPVOID>(address), &temp, sizeof(temp), 0);
                Pointer = temp + offset;
                //Good
                if (!WriteProcessMemory(phandle, reinterpret_cast<unsigned*>(Pointer), (LPCVOID)newString, sz, &bytes_written))
                    std::cerr << "Couldn't write process memory:" << GetLastError() << std::endl;
                cout << reinterpret_cast<LPVOID>(Pointer) << " en " << newString << std::endl;
                Sleep(1000);
            }
            return 0;
        }
    }
}

alexmen10
#3

alexmen10
  • avatar
  • administrator
  • Status :
    HS4L Team
  • Mensajes :
    406
  • Reputación :
    257
  • Points :
    16
  • Registrado :
    2012-09-08
Bueno amigo, ya tengo tu proyecto, mañana subiré un vídeo a mi canal, y luego subiré aquí, explicare como añadir cada cosa bueno, gracias por unirte a esta comunidad, eh creado funciones propias y sencillas y cómodas smid_1



HS4L-TEAM

NamesElanceStatus
[HS4L]-Creador v1.9 BetaClick to hereWorking!!
[HS4L]-Creador v1.2 BetaClick to hereWorking!!
[HS4L]-Item CreatorClick to hereWorking!!
[HS4L]-AP Files Item CreatorClick to hereWorking!!

ZzcarloszZ
#4

ZzcarloszZ
  • avatar
  • administrator
  • Mensajes :
    622
  • Reputación :
    220
  • Points :
    6
  • Registrado :
    2012-08-08
@CrazyFrog98 wrote:Lo he cambiado, Ahora lee Perfectamente.. el problema es si en vez de READ lo cambiamos por WRITE, pues no funciona.



Si cambias el read por write, el programa no obtendra la address final, aqui te deja una modificación que hice.

PD: Borre el tmp, es innecesario
Code:
#include <Windows.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
   //variables
   unsigned long Pointer, Baseaddress = 0x009B03D0, offset = 0xA7;
   DWORD pid;
   HWND hwnd;
   string mytexto;
   hwnd = FindWindow(0, TEXT("NewWindow"));//Encuentra la ventana en este caso usando la clase de la ventana
   if (!hwnd)
   {
      printf("Processo No Encontrado!\n");
      cin.get();
   }
   else
   {
      GetWindowThreadProcessId(hwnd, &pid);//Obtiene el PID desde la ventana
      HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);//Abre la memoria
      if (!phandle)
      {
         printf("Error desconocido...\n");
         cin.get();
      }
      else
      {
         //Si cambias el read por write, nunca leera la Baseaddress y no se generara el pointer
         //ReadProcessMemory Lee la memoria
         ReadProcessMemory(phandle, (LPCVOID)Baseaddress, &Pointer, sizeof(Pointer), 0);//Lee la Baseaddress
         Pointer += offset; // Suma el offset y se vuelve la Adress Final
         printf("La Dirección del pointer es 0x%08x\n", Pointer);
         while (1)
         {
            cout << "Ingrese algun texto:";
            cin >> mytexto;
            //WriteProcessMemory Sirve para escribir en la memoria
            //Si solo usas mytexto.length(), solo cambiara dependiendo de la longitud de texto que tenga la address
            if (!WriteProcessMemory(phandle, (LPVOID)(Pointer), (LPCVOID)mytexto.c_str(), mytexto.length()*22, NULL))
            //if (!WriteProcessMemory(phandle, (LPVOID)(Pointer), (LPCVOID)mytexto.c_str(), mytexto.length(), NULL))
               std::cerr << "No se puede escribir en la memoria del proceso:" << GetLastError() << std::endl;

         }
         return 0;
      }
   }
}






Guest te estoy vigilando!!!

CrazyFrog98
#5

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Gracias carlos, lo probaré cuando llegue a casa.

PD: Podrías explicarme esta anotación en tu código? -Mi intención es cambiar el value del address en 16 caracteres exactos.
//Si solo usas mytexto.length(), solo cambiara dependiendo de la longitud de texto que tenga la address


Alex, espero verlo, de seguro me sirve muchísimo para hacer el resto del programa y editar más el código :shock:

CrazyFrog98
#6

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Lo he probado y no paro de recibir el error "998" al tratar de hace el Write

CrazyFrog98
#7

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Arreglado, tenía que modificar los permisos del address de READ a READWRITE antes de modificarlo.

Muchas gracias por la ayuda! (Aun así, si me dijeras a lo que te referías con mytexto.lenght()...)

Ahora el problema está a la hora de leer, el programa al leer el BaseAddress da un pointer random cuando debería dar: https://i.gyazo.com/4a654cdf7b2308f37957c491e6e7fd02.png
Pienso que podría ser culpa del "Program.exe" + BA que no hay en el original..

ZzcarloszZ
#8

ZzcarloszZ
  • avatar
  • administrator
  • Mensajes :
    622
  • Reputación :
    220
  • Points :
    6
  • Registrado :
    2012-08-08
@CrazyFrog98 wrote:Arreglado, tenía que modificar los permisos del address de READ a READWRITE antes de modificarlo.

Muchas gracias por la ayuda! (Aun así, si me dijeras a lo que te referías con mytexto.lenght()...)

Ahora el problema está a la hora de leer, el programa al leer el BaseAddress da un pointer random cuando debería dar: https://i.gyazo.com/4a654cdf7b2308f37957c491e6e7fd02.png
Pienso que podría ser culpa del "Program.exe" + BA que no hay en el original..


Pues si quieres que escriba 16 caracteres solo es modificar asi:
Code:
WriteProcessMemory(phandle, (LPVOID)(Pointer), (LPCVOID)mytexto.c_str(), sizeof(char)*16-1, NULL)


Ahora para la segunda pregunta, vas a necesitar la BaseAddress del exe. La baseaddress siempre cambia dependiendo si es estático y dinámico. En tu caso es dinamico.

te recomiendo usar esta funcion.
Code:
DWORD GetBaseAddress(HANDLE handle)
{
   HMODULE *Modulo;
   int      count = 1;
   DWORD  cb = sizeof(HMODULE) * count;
   DWORD  cbNeeded;
   do
   {
      Modulo = new HMODULE[++count];
      cb = sizeof(HMODULE) * count;
      EnumProcessModulesEx(handle, Modulo, cb, &cbNeeded, LIST_MODULES_ALL);
   } while (cbNeeded > cb);

   return (DWORD)(HMODULE)Modulo[0];
}




Guest te estoy vigilando!!!

ZzcarloszZ
#9

ZzcarloszZ
  • avatar
  • administrator
  • Mensajes :
    622
  • Reputación :
    220
  • Points :
    6
  • Registrado :
    2012-08-08
mas info-> aqui https://www.hs4ldev.com/t2205-c-pointer-offset-tutorialsourcer-code#11087




Guest te estoy vigilando!!!

CrazyFrog98
#10

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Me sale que "EnumProcessModulesEx" no está declarado ni "LIST_MODULES_ALL", he Googleado y dice que se encuentran en windows.h
Pero yo ya he incluido este y aun así no funciona, alguna idea de que puede pasar?

CrazyFrog98
#11

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Arreglado!, Ya encontré lo necesario.
Muchas gracias.
Una duda, al añadir los Offset se les suma además la base del programa al Pointer? -Porque es que si no no entiendo como es que al sumar el offset de distinto a CE en el pointer 1 ._.

CrazyFrog98
#12

CrazyFrog98
  • avatar
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Arreglado, Ya pueden cerrar si eso smid_1

alexmen10
#13

alexmen10
  • avatar
  • administrator
  • Status :
    HS4L Team
  • Mensajes :
    406
  • Reputación :
    257
  • Points :
    16
  • Registrado :
    2012-09-08
Closed -> Motivo: Tema resuelto



HS4L-TEAM

NamesElanceStatus
[HS4L]-Creador v1.9 BetaClick to hereWorking!!
[HS4L]-Creador v1.2 BetaClick to hereWorking!!
[HS4L]-Item CreatorClick to hereWorking!!
[HS4L]-AP Files Item CreatorClick to hereWorking!!

Kirby_Blue
#14

Kirby_Blue
  • avatar
  • super moderator
  • Mensajes :
    1049
  • Reputación :
    87
  • Points :
    0
  • Registrado :
    2012-08-08
Acción aplicada: Moved!

Motivo: Esto no va aquí! (Programación -> Dudas, Preguntas y Sugeréncias)



Do you want to see who I am?
Spoiler:






Sponsored content
#15

Sponsored content

      

Create an account or log in to leave a reply

You need to be a member in order to leave a reply.

Create an account

Join our community by creating a new account. It's easy!


Create a new account

Log in

Already have an account? No problem, log in here.


Log in
You cannot reply to topics in this forum
Staff online
Sponsors
  •  TOTAL POSTS
  •  TOTAL MEMBERS
  •  NEWEST MEMBER