新手 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成功的改写了
经过刚刚的调试
写入的内存地址还是没问题
写入的函数地址也没问题
但是却在该内存地址没写成功
总结
应该是此函数写得有问题
此函数的汇编代码没能注入成功应该和 返回的类型 或者 返回类型前面的代码有关,我不知道,请大大帮改改看哪的代码错了
ReadProcessMemory(进程句柄HANDLE,要读取的内存地址(LPCVOID),存放读取信息的变量,读取的内存大小sizeof(),0)。
你参数用错了 Write的那个也错了。可以去MSND看看函数用法。
如果是权限问题启动编程软件时直接右键,以管理员身份启动就可以了。
本帖最后由 bester 于 2019-8-11 11:03 编辑
zhadan这个函数 不是应该用&取地址转指针吗?如果不是,你在VS里面调试一下,看一下写入和读取的参数,看是否为这个zhadan的函数的地址
delphi 是WriteProcessMemory(hp, Pointer($00401000), Pointer(@wd), 1, wds); 用@取地址用pointer转指针 dushiyu 发表于 2019-8-11 10:58
ReadProcessMemory(进程句柄HANDLE,要读取的内存地址(LPCVOID),存放读取信息的变量,读取的内存大小si ...
最后一个参数我之前也改过 出的问题还是一样 bester 发表于 2019-8-11 11:01
zhadan这个函数 不是应该用&取地址转指针吗?如果不是,你在VS里面调试一下,看一下写入和读取的参数,看是 ...
这个问题之前也想到了,甚至之前函数所有参数都用&来传,还是一样没效果,所以头才大
C:\Users\Administrator\Desktop\333333.png
进入该内存地段,全是空的 本帖最后由 aiyingshiwo 于 2019-8-11 11:54 编辑
通一个函数 WriteProcessMemory ,但是 无CD 大嘴花 无CD的这两个按钮却成功改写内存地址,所以我怀疑我写的类型有错误,但是学得比较浅,不懂真正问题出在哪
内存地址00461565 和 00461566 处,按钮成功改写
写入成功但写入不正确应该是编译选项是debug的问题,选release可以解决,函数调用错误可以用返回值和调用GetLastError来判断原因 本帖最后由 aiyingshiwo 于 2019-8-11 16:49 编辑
苏紫方璇 发表于 2019-8-11 13:30
写入成功但写入不正确应该是编译选项是debug的问题,选release可以解决,函数调用错误可以用返回值和调用Ge ...
谢谢,果然是dedug的问题,但是前面读取还是不成功,之前读取也试过用Release编译,没成功,就以为写入也不是这个问题,请问一下 我要读取这段地址要怎么做
0x006AA00C是基址
我想要找它指向的地址,然后偏移地址
现在返回的地址是错误的 aiyingshiwo 发表于 2019-8-11 16:41
谢谢,果然是dedug的问题,但是前面读取还是不成功,之前读取也试过用Release编译,没成功,就以为写入也 ...
最后那个参数不应该是0吧?他里面是实际读取的字节,如果读取成功 这个参数的值应该是4,也就是一个DWORD单位,所以这个应该也是一个指针或者是变量吧? bester 发表于 2019-8-11 17:21
最后那个参数不应该是0吧?他里面是实际读取的字节,如果读取成功 这个参数的值应该是4,也就是一个DWORD ...
我之前传参没错,因为Pid的类型就是DWORD的
页:
[1]
2