首页
社区
课程
招聘
[求助]已注入dll,也得到模块句柄,就是无法读取,和修改。请帮忙看看。
发表于: 2008-7-28 14:42 9320

[求助]已注入dll,也得到模块句柄,就是无法读取,和修改。请帮忙看看。

2008-7-28 14:42
9320
主进程是个服务,我枚举的到的进程ID
 
        //提升权限
        HANDLE  hToken; 
        if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
        {
                TOKEN_PRIVILEGES  tp;
                tp.PrivilegeCount=1;
                LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
                tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
                AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
                CloseHandle(hToken);
        } 
        // 打开目标进程,最大权限
        HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessID );


DLL里我使用void *Handle = GetModuleHandle("date.dll") ,得到dll模块句柄,read,write都失败,但是用 FreeLibrary(GetModuleHandleA("date.dll"));却可以成功释放dll.

DLL代码
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
       switch ( reason )
       {
          case DLL_PROCESS_ATTACH:
           {
               MessageBox( NULL, "DLL已进入目标进程。", "信息", MB_ICONINFORMATION );
               //FreeLibrary(GetModuleHandleA("date.dll")); //这个成功
               void *Handle = GetModuleHandle("date.dll");
              

               char *OBJ_patch = new char[10];
               DWORD size;
               unsigned int OBJ_IP = (int)Handle + 0xD78b;        
               if (ReadProcessMemory(Handle,(void*)OBJ_IP,OBJ_patch,0x0A,&size))
               {
                        MessageBox( NULL, (char*)OBJ_patch, "信息", MB_ICONINFORMATION );
               }
               else
               {
                        MessageBox( NULL, "读取失败。", "信息", MB_ICONINFORMATION );
               }              
           }
          break;
          case DLL_PROCESS_DETACH:
           {
               MessageBox( NULL, "DLL已从目标进程卸载。", "信息", MB_ICONINFORMATION );
           }
          break;
       }
       return 1;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
我要修改的地址,OB打开时是  10011720  /$  6A FF         PUSH -1
                        内存中是   00EB1720  /$  6A FF         PUSH -1

dll的载入地址为:0xEA0000
映像大小为        0x65000

我的到的void *Handle = GetModuleHandle("ArValidate.dll"); 句柄值得为 0xEA0000

是否我的目标地址不正确导致不能读取?应该如何计算?
2008-7-28 15:51
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
我晕死,弟兄们谁知道帮忙看看啊。
2008-7-28 16:49
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
if (ReadProcessMemory(Handle,(void*)OBJ_IP,OBJ_patch,0x0A,&size))
~~~~~~~~~~~~~~~~这个Handle怎么回事,应该是GetCurrentProcess()就好了
2008-7-28 17:08
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
会楼上,这个Handle 就是下面这句的来的,
void *Handle = GetModuleHandle("date.dll");
GetModuleHandle根据模块名获得句柄,必须是同一个线程才能用,所以在注入的dll里调用。
2008-7-28 18:40
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
6
GetModuleHandle获取的值你输出看看,一般GetModuleHandle获取的地址就是模块基地址,你用virtualprotect之类的修改属性再读着试下。

补充说明:
汗,刚看了Boneasher 的回答,确实是你使用错了,那个句柄是错的,那个参数应该是进程句柄呢。
2008-7-28 20:16
0
雪    币: 1946
活跃值: (263)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
7
楼主分不清instance和handle
2008-7-28 21:28
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
8
GetCurrentProcess(); 的值是0xffffffff 不对吧
2008-7-28 22:15
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
9
我说下,我要修改的不是当前注入进程,是注入进程里的一个dll文件 date.dll文件。

都说要在注入dll里用 void *Handle = GetModuleHandle("date.dll");的到进程里模块句柄。

难道我理解错了?
2008-7-28 22:17
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
10
GetModuleHandle获取的值你输出看看

我打印了,输出刚好就是我想修改的date.dll文件在进程里的 载入地址(Process Explore 可以看)
2008-7-28 22:19
0
雪    币: 1946
活跃值: (263)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
11
MessageBox( NULL, (char*)(GetModuleHandle("date.dll")+0xD78b), "信息", MB_ICONINFORMATION );
2008-7-28 22:24
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
12
现在内存的地址又变了,我这样显示
void *Handle = GetModuleHandle("ArValidate.dll");
int adder = (int)Handle + 0x5D50;               
MessageBox( NULL, IntToHex(adder,2).c_str(), "地址", MB_ICONINFORMATION );
---------------------------
地址
---------------------------
EA5D50

我按照这个地址读取10字节,能读,但是不是我要的那块数据内容
  char *OBJ_patch = new char[10];
  DWORD size;
  unsigned int OBJ_IP = 0xBE5D50;

  HANDLE hand = GetCurrentProcess();
  ReadProcessMemory(hand,(void*)adder,OBJ_patch,10,&size) ;           

               
2008-7-28 22:46
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
13
OB 打开是10015d50  内存里确实是 EA5D50
2008-7-28 22:47
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
14
ReadProcessMemory(hand,(void*)adder,OBJ_patch,10,&size) ;   

这里的adder 是否要计算,我要读0xEA5D50 ,这里的adder 如何计算呢?
2008-7-28 22:59
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
15
GetCurrentProcess(); 的值是0xffffffff 这不是刚好是4G的寻址空间么.....

但是,如何计算我要找的地址呢?
2008-7-28 23:06
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
终于得到了  
OB 中的地址 10015D50  /$  6A FF         PUSH -1
内存中的地址就是GetCurrentProcess() + 0x15d50
2008-7-28 23:33
0
游客
登录 | 注册 方可回帖
返回
//