您的位置:程序门 -> vc/mfc -> 进程/线程/dll



其它进程加载的模块信息


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


其它进程加载的模块信息[无满意答案结贴,结贴人:red_berries]
发表于:2007-04-05 23:02:00 楼主
请看下面代码,(向目标进程中新建一个弹出对话框的线程)
struct   mydata
{
  char   sz[64];   //   对话框显示内容
  dword   dwmessagebox;   //   对话框的地址
};
dword   __stdcall   rmtfunc(mydata   *pdata)
{
  //下面这句话是我想要问的问题(1)
  //int   a;   如果这句话不注释掉,那么a在内存中的地址是和它处函数相邻的还是单独的呢
  typedef   int(__stdcall*mmessagebox)(hwnd,lpctstr,lpctstr,uint);
  mmessagebox   msgbox   =   (mmessagebox)pdata-> dwmessagebox;
  msgbox(null,   pdata-> sz,   null,   mb_ok);
  return   0;
}
int   main()
{
    mydata   data;
  zeromemory(&data,   sizeof   (mydata));
  strcat(data.sz,   "对话框的内容. ");
  hinstance   huser   =   loadlibrary( "user32.dll ");
  if   (!   huser)
  {
    cout < < "can   not   load   library\n ";
    return   0;
  }
  data.dwmessagebox   =   (dword)getprocaddress(huser,   "messageboxa ");
  freelibrary(huser);
  if   (!   data.dwmessagebox)
    return   0;
      ......
      ......
        void   *premotethread
        =   virtualallocex(hprocess,   0,
            1024*4,   mem_commit ¦mem_reserve,
            page_EXECute_readwrite);
    if   (!   premotethread)
            return   0;
//下面为第二个问题
    if   (!   writeprocessmemory(hprocess,   premotethread,   &rmtfunc,   1024*4,   0))
            return   0;
//这句话中是向另一个进程的内存空间写入rmtfunc这个函数中的所有代码吗?
  mydata   *pdata
    =   (mydata*)virtualallocex(hprocess,   0,
            sizeof   (mydata),   mem_commit,
            page_readwrite);
  if   (!pdata)
    return   0;
  if   (!   writeprocessmemory(hprocess,   pdata,   &data,   sizeof   (mydata),   0))
    return   0;    
  ......

      handle   hthread
    =   createremotethread(hprocess,   0,
              0,   (lpthread_start_routine)premotethread,
              pdata,   0,   0);
  if   (!   hthread)
  {
    cout < < "远程线程创建失败\n ";
    return   0;
  }
  ::waitforsingleobject(hthread,infinite);
  closehandle(hthread);
}
上面的两个问题已经在代码中
另外还有一个问题就是这个程序我运行了,结果正确,但是在弹出对话框点了确定后,目标进程出现非常地址访问0x00e5264指令引用的0x00e5264内存不能为read.这是为什么呢?
,希望大家指教一下,上面是一些关键代码,
发表于:2007-04-05 23:02:401楼 得分:0
#include   "iostream.h "
#include   "windows.h "
//   ==========   定义一个代码结构,本例为一个对话框============
struct   mydata
{
  char   sz[64];   //   对话框显示内容
  dword   dwmessagebox;   //   对话框的地址
};

//   ==========   远程线程的函数   ==============================
dword   __stdcall   rmtfunc(mydata   *pdata)
{
  typedef   int(__stdcall*mmessagebox)(hwnd,lpctstr,lpctstr,uint);
  mmessagebox   msgbox   =   (mmessagebox)pdata-> dwmessagebox;
  msgbox(null,   pdata-> sz,   null,   mb_ok);
  return   0;
}
int   main(int   argc,   char*   argv[])
{
//   =====   获得需要创建remotethread的进程句柄   ===============================
hwnd   hwnd   =::findwindow(null, "换线工具 ");   //   选取一个进程做为例子
int   x=::getlasterror();
  dword   dwprocessid;
  ::getwindowthreadprocessid(hwnd,   &dwprocessid);
  handle   hprocess   =   ::openprocess(
                process_all_access,
                false,
                dwprocessid);
          x=::getlasterror();
//   =========   代码结构   ================================================
  mydata   data;
  zeromemory(&data,   sizeof   (mydata));
  strcat(data.sz,   "对话框的内容. ");
  hinstance   huser   =   loadlibrary( "user32.dll ");
  if   (!   huser)
  {
    cout < < "can   not   load   library\n ";
    return   0;
  }
  data.dwmessagebox   =   (dword)getprocaddress(huser,   "messageboxa ");
  freelibrary(huser);
  if   (!   data.dwmessagebox)
    return   0;

//   =======   分配空间   ===================================================
  void   *premotethread
    =   virtualallocex(hprocess,   0,
            1024*4,   mem_commit ¦mem_reserve,
            page_EXECute_readwrite);
      x=::getlasterror();
  if   (!   premotethread)
    return   0;
  if   (!   writeprocessmemory(hprocess,   premotethread,   &rmtfunc,   1024*4,   0))
    return   0;

  mydata   *pdata
    =   (mydata*)virtualallocex(hprocess,   0,
            sizeof   (mydata),   mem_commit,
            page_readwrite);
  if   (!pdata)
    return   0;

  if   (!   writeprocessmemory(hprocess,   pdata,   &data,   sizeof   (mydata),   0))
    return   0;

//   ===========   创建远程线程   ===========================================
  handle   hthread
    =   createremotethread(hprocess,   0,
              0,   (lpthread_start_routine)premotethread,
              pdata,   0,   0);
  if   (!   hthread)
  {
    cout < < "远程线程创建失败\n ";
    return   0;
  }
  ::waitforsingleobject(hthread,infinite);
  closehandle(hthread);
  virtualfreeex(hprocess,   premotethread,   1024*3,   mem_release);
  virtualfreeex(hprocess,   pdata,   sizeof   (mydata),   mem_release);
  closehandle(hprocess);
  cout < < "hello   world!\n ";
  return   0;
}
发表于:2007-04-05 23:03:082楼 得分:0
发表了才发现题目弄错了,郁闷啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


快速检索

最新资讯
热门点击