首页
社区
课程
招聘
[求助]请教WriteProcessMemory修改jmp
发表于: 2009-7-9 20:48 6900

[求助]请教WriteProcessMemory修改jmp

2009-7-9 20:48
6900
我要修改的原始程序代码为:
004014FE  /75 07          jnz short 4.00401507
00401500  |68 98354000    push 4.00403598
00401505  |EB 05          jmp short 4.0040150C
00401507  \68 A0354000    push 4.004035A0                            ; ASCII "

我想让代码变为:
004014FE  /EB 07          jmp short 4.00401507        //就想修改这行
00401500  |68 98354000    push 4.00403598
00401505  |EB 05          jmp short 4.0040150C
00401507  \68 A0354000    push 4.004035A0                            ; ASCII "

我写好的程序为:
  HWND mainhwnd1=::FindWindow(NULL,_T("4"));    //查找主窗口
  GetWindowThreadProcessId(mainhwnd1  ,&p);//得到窗口的ProcessID  
  HANDLE  m_hProcess=OpenProcess(PROCESS_ALL_ACCESS,true,p);//打开Process  
  WriteProcessMemory(m_hProcess,(LPVOID)0x004014FE,&_T("EB07"),1,NULL);
为什么我运行修改程序之后会变成
004014FE    45              inc ebp
004014FF    07              pop es
00401500    68 98354000    push 4.00403598
00401505    EB 05          jmp short 4.0040150C
00401507    68 A0354000    push 4.004035A0                            ; ASCII "

请各位位大大给点参考代码

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
WriteProcessMemory(m_hProcess,(LPVOID)0x004014FE,&_T("EB07"),1,NULL);
这个是把'E'的asc值给byte ptr ds:[0x004014FE]
所以EB就被改为45了
2009-7-9 20:52
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
BYTE b=0x90;
WriteProcessMemory(m_hProcess,(LPVOID)0x004014FE,&b,1,NULL);
恩这样改下就可以了
但我还有个问题
比如我用CFile读取一个字符串放在CString str;中比如str="0x90"
如何转成BYTE  0x90;
我下面的转换不成功
        CString str1,str2;
        int a1,a2;
        str1="0x90";
        str2="0xEB";
        a1=_ttoi(str1);
        a2=_ttoi(str2);
        BYTE b1=a1;
        BYTE b2=a2;
请问哪里错了
2009-7-9 21:37
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CString str = _T("0XEB");
  int nResult = 0;
_stscanf_s( str, _T("%x"), &nResult );
BYTE m = (BYTE)nResult;
这样问题解决了
但地址的CString还不能解决
完整代码:
    CString str = _T("0XEB");
    int nResult = 0;

        _stscanf_s( str, _T("%x"), &nResult ); // vs 2005   
        BYTE m = (BYTE)nResult;

        CString str2;
        str2="0x004014FE";

        int nResult1 = 0;
        _stscanf_s( (LPCTSTR)str2, _T("%x"), &nResult ); // vs 2005   

   unsigned   long   p=0x00;  
   HWND mainhwnd1=::FindWindow(NULL,_T("4"));     //查找主窗口
   GetWindowThreadProcessId(mainhwnd1,&p);//得到窗口的ProcessID   
   HANDLE  m_hProcess=OpenProcess(PROCESS_ALL_ACCESS,true,p);//打开Process   
   WriteProcessMemory(m_hProcess, (LPVOID)nResult1,&m,1,NULL);

请教各位大大如何将str2="0x004014FE"; 字符串中的数据变成指针地址
2009-7-9 23:19
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
上面完整代码我运行后用od看没反应
改成WriteProcessMemory(m_hProcess, (LPVOID)0x004014FE,&m,1,NULL);
后可用
哪里出问题了...
2009-7-9 23:21
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
忽然看见&nResult 写错了
应该是&nResult 1
郁闷
以后写代码不能偷懒。。。。。
2009-7-9 23:27
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
先学习语言基础吧
2009-7-9 23:53
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
脚踏实地,先打基础
2009-7-12 22:51
0
雪    币: 223
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这两个函数可以用来转换字符串为16进制的地址

unsigned long strtoul(const char *nptr,  char **endptr, int base );
unsigned long wcstoul(const wchar_t *nptr,wchar_t **endptr,int base );

请教各位大大如何将str2="0x004014FE"; 字符串中的数据变成指针地址

CString str2 = "0x004014FE";
unsigned long ulAddress = 0;
#ifdef _UNICODE
   ulAddress = wcstoul(str2.GetBuffer(), NULL, 16);
#else
    ulAddress = strtoul(str2.GetBuffer(), NULL, 16);
#endif
2009-7-13 10:43
0
游客
登录 | 注册 方可回帖
返回
//