aiyingshiwo 发表于 2019-8-11 10:26

新手 c++逆向 遇到内存读取和写入的问题

本帖最后由 aiyingshiwo 于 2019-8-11 12:31 编辑

自己写的一个辅助问题多多



先上代码



void CMFCApplication6Dlg::OnBnClickedwuxianj()
{
      // TODO: 在此添加控件通知处理程序代码
      
      UpdateData(TRUE);
      DWORD pid = jinchengpid(_T("植物大战僵尸中文版"));//通过寻找进程名称函数获取进程id
      
      HANDLE hp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//获取进程句柄
      if (hp==NULL)
      {
                MessageBox(_T("打开进程失败"), NULL, 0);
               
                return;
      }
      DWORD daxiao = 0;
      DWORD dizhi = 0;
      if(!ReadProcessMemory(hp, (LPVOID)0x006AA00C, (LPVOID)dizhi, sizeof(DWORD), &pid)) ;//读取内存数据
      {
                printf("dizhi= %x\n", dizhi);
                MessageBox(_T("读取内存数据失败"), NULL, 0);
                CloseHandle(hp);
                return;
      }
      


调试后发现




读取内存失败



进程的Pid没有错


但是返回的地址不对 变成0了;




下面是写入的问题

先上代码



__declspec(naked) void zhadan()//要写入的汇编代码
{
      __asm
      {      
                pushad
                push -1
                push2
                moveax,1
                push5
                mov ebx, ds:
                mov ebx, ds:
                pushebx
                mov edx,0x0040D120
                call edx
                popad
                ret
      }
}



void CMFCApplication6Dlg::OnBnClickedzhuru()
{
      // TODO: 在此添加控件通知处理程序代码

      
      //1.打开目标进程
      DWORD pid = jinchengpid(_T("植物大战僵尸中文版"));

      HANDLE hp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
      //2 在目标进程分配空间

      PVOID fenpeidizhi = VirtualAllocEx(hp, NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      
      //3 往分配内存写入代码
      DWORD daxiao = 0;
      ;
         BOOL bb= WriteProcessMemory(hp, fenpeidizhi,zhadan, 4096, &daxiao);
         
      
      //执行目标进程指定地址的代码
         CreateRemoteThread(hp, NULL, NULL, (LPTHREAD_START_ROUTINE)&fenpeidizhi, NULL, NULL, NULL);
      
      

}




调试后发现



分配内存成功




写入时 分配的内存地址也是正确的


但是用OD查看此分配内存地址,没写入成功,如果写入成功应该是:
                pushad
                push -1
                push2
                moveax,1
                push5
                mov ebx, ds:
                mov ebx, ds:
                pushebx
                mov edx,0x0040D120
                call edx
                popad
                ret


和前面读取内存的问题一样 都是到了这一步有错误



我也翻了好多百度,还是没解决,说是权限问题,我把电脑登陆用户改成管理员权限 还是没用,VS也用管理权限登陆也没用,甚至换成了VS2015破解版 也没效果。
也添加了权限代码,但是代码是错的,因为是新手,从刚学C,C++,汇编 到现在总共才2个多月不到,所以不会改这代码
代码如下:

bool CMFCApplication6Dlg::quanxian()
{
      HANDLE lingpai;
      LUID sed;
      PTOKEN_PRIVILEGES tkp=0;
      //PTOKEN_PRIVILEGES* tt = &tkp;

      if (!OpenProcessToken(GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &lingpai))
      {
                return false;
      }
               
      if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sed))
      {
                CloseHandle(lingpai);
                return false;
      }

      tkp->PrivilegeCount = 1;
      tkp->Privileges.Luid = sed;
      tkp->Privileges.Attributes = SE_PRIVILEGE_ENABLED;
      if(!AdjustTokenPrivileges(lingpai, FALSE, tkp /*tt*/, sizeof(tkp), NULL, NULL));
      {
                CloseHandle(lingpai);
                return false;


      }
      return true;
               
}

调试后发现的错误



希望知道问题的大大回答下,谢谢,也是从这论坛才开始学的编程,前面学的还顺,就是这内存读写的函数这两天搞得我头大



同样的函数 WriteProcessMemory 另外两个 无cd 和 大嘴 花cd的两个按钮却能成功的在内存写入代码



内存地址00461565 和 00461566成功的改写了


经过刚刚的调试






写入的内存地址还是没问题



写入的函数地址也没问题






但是却在该内存地址没写成功


总结
应该是此函数写得有问题

此函数的汇编代码没能注入成功应该和 返回的类型 或者 返回类型前面的代码有关,我不知道,请大大帮改改看哪的代码错了

dushiyu 发表于 2019-8-11 10:58

ReadProcessMemory(进程句柄HANDLE,要读取的内存地址(LPCVOID),存放读取信息的变量,读取的内存大小sizeof(),0)。
你参数用错了   Write的那个也错了。可以去MSND看看函数用法。
如果是权限问题启动编程软件时直接右键,以管理员身份启动就可以了。

bester 发表于 2019-8-11 11:01

本帖最后由 bester 于 2019-8-11 11:03 编辑

zhadan这个函数 不是应该用&取地址转指针吗?如果不是,你在VS里面调试一下,看一下写入和读取的参数,看是否为这个zhadan的函数的地址

delphi 是WriteProcessMemory(hp, Pointer($00401000), Pointer(@wd), 1, wds); 用@取地址用pointer转指针

aiyingshiwo 发表于 2019-8-11 11:14

dushiyu 发表于 2019-8-11 10:58
ReadProcessMemory(进程句柄HANDLE,要读取的内存地址(LPCVOID),存放读取信息的变量,读取的内存大小si ...

最后一个参数我之前也改过 出的问题还是一样

aiyingshiwo 发表于 2019-8-11 11:25

bester 发表于 2019-8-11 11:01
zhadan这个函数 不是应该用&取地址转指针吗?如果不是,你在VS里面调试一下,看一下写入和读取的参数,看是 ...
这个问题之前也想到了,甚至之前函数所有参数都用&来传,还是一样没效果,所以头才大


C:\Users\Administrator\Desktop\333333.png
进入该内存地段,全是空的

aiyingshiwo 发表于 2019-8-11 11:51

本帖最后由 aiyingshiwo 于 2019-8-11 11:54 编辑

通一个函数 WriteProcessMemory ,但是 无CD 大嘴花 无CD的这两个按钮却成功改写内存地址,所以我怀疑我写的类型有错误,但是学得比较浅,不懂真正问题出在哪

内存地址00461565 和 00461566   处,按钮成功改写
      




苏紫方璇 发表于 2019-8-11 13:30

写入成功但写入不正确应该是编译选项是debug的问题,选release可以解决,函数调用错误可以用返回值和调用GetLastError来判断原因

aiyingshiwo 发表于 2019-8-11 16:41

本帖最后由 aiyingshiwo 于 2019-8-11 16:49 编辑

苏紫方璇 发表于 2019-8-11 13:30
写入成功但写入不正确应该是编译选项是debug的问题,选release可以解决,函数调用错误可以用返回值和调用Ge ...
谢谢,果然是dedug的问题,但是前面读取还是不成功,之前读取也试过用Release编译,没成功,就以为写入也不是这个问题,请问一下 我要读取这段地址要怎么做

0x006AA00C是基址
我想要找它指向的地址,然后偏移地址
现在返回的地址是错误的

bester 发表于 2019-8-11 17:21

aiyingshiwo 发表于 2019-8-11 16:41
谢谢,果然是dedug的问题,但是前面读取还是不成功,之前读取也试过用Release编译,没成功,就以为写入也 ...

最后那个参数不应该是0吧?他里面是实际读取的字节,如果读取成功 这个参数的值应该是4,也就是一个DWORD单位,所以这个应该也是一个指针或者是变量吧?

aiyingshiwo 发表于 2019-8-11 18:06

bester 发表于 2019-8-11 17:21
最后那个参数不应该是0吧?他里面是实际读取的字节,如果读取成功 这个参数的值应该是4,也就是一个DWORD ...
我之前传参没错,因为Pid的类型就是DWORD的
页: [1] 2
查看完整版本: 新手 c++逆向 遇到内存读取和写入的问题