首页
社区
课程
招聘
[旧帖] 大侠们,帮我看看下面这段代码错在哪里,我要晕了! 0.00雪花
发表于: 2007-3-4 17:42 5179

[旧帖] 大侠们,帮我看看下面这段代码错在哪里,我要晕了! 0.00雪花

2007-3-4 17:42
5179
函数拦截后,调入自已的函数再回到原函数
使用时出现:“内存0x0044A251不能written” 错误 搞了一个晚上了找不出原因,请帮看看!!
代码如下:
void CEDlg::OnOK()
{
       
        // TODO: Add extra validation here
        DWORD hProcId;
        HWND hwnd = ::FindWindow( NULL , "Title" ); //获取窗口句柄
        if(hwnd)
        {
                GetWindowThreadProcessId(hwnd,&hProcId);  //获取进程ID
                HANDLE ghd = OpenProcess( PROCESS_ALL_ACCESS,FALSE,hProcId);  //打开进程读写权
                if(ghd)
                {       
                        FARPROC p=(FARPROC)_dispfunc; //p为函数_dispfunc指针
                        DWORD dwp=(DWORD)p-0x0044A250-0x5;
                        DWORD dwoldflag;
                        VirtualProtectEx(ghd,(void*)00x0044A251,4,PAGE_EXECUTE_READWRITE,&dwoldflag);
                        *((DWORD*)0x0044A251)=(DWORD)dwp;
                        VirtualProtectEx(ghd,(void*)0x0044A251,4,dwoldflag,&dwoldflag);                               
                }  
        }
        CDialog::OnOK();
}

void CEDlg::OnClose()
{
        // TODO: Add your message handler code here and/or call default
        DWORD dwP=0x004A7541-0x0044A250-0x5;   //0x004A7541 为原函数
    DWORD dwOldFlag;
    VirtualProtect((void*)0x0044A251,4,PAGE_READWRITE,&dwOldFlag);
    *((DWORD*)0x0044A251)=dwP;
    VirtualProtect((void*)0x0044A251,4,dwOldFlag,&dwOldFlag);
        CDialog::OnClose();
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
怎么这么多人看,没一个人回哦,,
VC不是很懂,本想用delphi仿写上面的代码,谁知在VC下就出错了!
2007-3-4 23:27
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
3
你hook的地方的原始指令是啥?
2007-3-5 02:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是这个:

地址       指令
0044A250   CALL 004A7541
2007-3-6 01:19
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
*((DWORD*)0x0044A251)=(DWORD)dwp;

===》
WriteProcessMemory(..............)
2007-3-6 10:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
jjnet老兄,

请问下您的意思是:用WriteProcessMemory语句去代替“*((DWORD*)0x0044A251)=(DWORD)dwp;”实现?

能否具体点,在线等!
2007-3-6 18:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
唉!!
三天多了,网上的贴子看了无许!
还没搞定,请高手指点下哈。。。

我用:
WriteProcessMemory(ghd,(void*)0x0044A251,&dwp, 4 , NULL );
代替:
*((DWORD*)0x0044A251)=(DWORD)dwp;

也出现一样的错误,不能写!

凌晨2点了,睡了,明天还得上班
2007-3-7 02:03
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
VirtualProtectEx(ghd,(void*)00x0044A251,4,PAGE_EXECUTE_READWRITE,&dwoldflag);
      *((DWORD*)0x0044A251)=(DWORD)dwp;
      VirtualProtectEx(ghd,(void*)0x0044A251,4,dwoldflag,&dwoldflag);        
    }  
  }
  CDialog::OnOK();
}

void CEDlg::OnClose()
{
  // TODO: Add your message handler code here and/or call default
  DWORD dwP=0x004A7541-0x0044A250-0x5;   //0x004A7541 为原函数
    DWORD dwOldFlag;
    VirtualProtect((void*)0x0044A251,4,PAGE_READWRITE,&dwOldFlag);
    *((DWORD*)0x0044A251)=dwP;
    VirtualProtect((void*)0x0044A251,4,dwOldFlag,&dwOldFlag);

你这个本来就是自相矛盾

前面的代码, 找个进程, 修改其他进程.
后面的代码又是修改自己.

修改其他进程需要用WriteProcessMemory.
如果是你 插到别的进程的代码, 那么这中代码里面才是
    VirtualProtect((void*)0x0044A251,4,PAGE_READWRITE,&dwOldFlag);
    *((DWORD*)0x0044A251)=dwP;
    VirtualProtect((void*)0x0044A251,4,dwOldFlag,&dwOldFlag);
2007-3-7 17:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可能是我没写清楚。。。。大家都没看明白?

我就是要读写另外一个程序窗口的进程内存,,DLL注入到进程里的。

HWND hwnd = ::FindWindow( NULL , "Title" ); //获取窗口句柄

上面这句“Title"不是自已窗口的标识,是另外一个程序窗口的标识哈!

好象没有自相矛盾吧,就是不行,搞不懂为什么,
是不是后面那段不要?这个:
void CEDlg::OnClose()
{
  // TODO: Add your message handler code here and/or call default
  DWORD dwP=0x004A7541-0x0044A250-0x5;   //0x004A7541 为原函数
    DWORD dwOldFlag;
    VirtualProtect((void*)0x0044A251,4,PAGE_READWRITE,&dwOldFlag);
    *((DWORD*)0x0044A251)=dwP;
    VirtualProtect((void*)0x0044A251,4,dwOldFlag,&dwOldFlag);
  CDialog::OnClose();
}

刚才试了试,一样不行!
2007-3-7 18:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
UP  

这里高手好少来哈,看来要满30贴,贴到调试论坛去了
2007-3-8 17:46
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
11
还说不自相矛盾。
仔细想想。
2007-3-9 08:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
jjnet 麻烦你帮我改改,贴上来,我实在找不出原因,
2007-3-9 17:49
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
什么都要慢慢来
2007-3-9 19:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我这代码搞了5天了,在不同论坛发了贴,也试了很多,就是不能写,头都大了
2007-3-9 20:59
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
嘿嘿,我来学习
2007-3-9 21:46
0
雪    币: 295
活跃值: (346)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
16
OnOK 与 OnClose 两处都应该是下面这样:
    ...
    HANDLE ghd = OpenProcess( PROCESS_ALL_ACCESS,FALSE,hProcId);
    if (ghd) {
        dwP=0x004A7541-0x0044A250-0x5;
        VirtualProtectEx(ghd,(void*)00x0044A251,4,PAGE_EXECUTE_READWRITE,&dwoldflag);
        WriteProcessMemory(ghd,(void*)0x0044A251,&dwp, 4 , NULL );
        VirtualProtectEx(ghd,(void*)0x0044A251,4,dwoldflag,&dwoldflag);        
    }
    CloseHandle(ghd);

你的问题:
1. ::OnOK()
  *((DWORD*)0x0044A251)=(DWORD)dwp; 是在改你的程序的内存, 不是改被打开的进程的内存;
  没有调CloseHandle()
2. ::OnClose()
  改别的进程要用 VirtualProtectEx/WriteProcessMemory, 而不是VirtualProtect, *(DW*)xxx=yyy, 那就是在改自己了.
  当然, 也要有h = OpenProcess(),  除非前面的OpenProcess()返回的句柄没调CloseHandle(), 而且存下来了.
2007-3-10 09:19
0
游客
登录 | 注册 方可回帖
返回
//