本帖最后由 aiyingshiwo 于 2019-8-11 12:31 编辑
自己写的一个辅助问题多多
先上代码
[Asm] 纯文本查看 复制代码 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了;
下面是写入的问题
先上代码
[Asm] 纯文本查看 复制代码
__declspec(naked) void zhadan()//要写入的汇编代码
{
__asm
{
pushad
push -1
push 2
mov eax,1
push 5
mov ebx, ds:[0x6A9EC0]
mov ebx, ds:[ebx + 0x768]
push ebx
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
push 2
mov eax,1
push 5
mov ebx, ds:[0x6A9EC0]
mov ebx, ds:[ebx + 0x768]
push ebx
mov edx,0x0040D120
call edx
popad
ret
和前面读取内存的问题一样 都是到了这一步有错误
我也翻了好多百度,还是没解决,说是权限问题,我把电脑登陆用户改成管理员权限 还是没用,VS也用管理权限登陆也没用,甚至换成了VS2015破解版 也没效果。
也添加了权限代码,但是代码是错的,因为是新手,从刚学C,C++,汇编 到现在总共才2个多月不到,所以不会改这代码
代码如下:
[Asm] 纯文本查看 复制代码 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[0].Luid = sed;
tkp->Privileges[0].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 成功的改写了
经过刚刚的调试
写入的内存地址还是没问题
写入的函数地址也没问题
但是却在该内存地址没写成功
总结
应该是此函数写得有问题
此函数的汇编代码没能注入成功应该和 返回的类型 或者 返回类型前面的代码有关,我不知道,请大大帮改改看哪的代码错了
|