如何得到非本程序的某 WINAPI 地址(100分)

  • 主题发起人 主题发起人 白河愁
  • 开始时间 开始时间

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
如 @messagebox 可以得到 messagebox 的地址,但仅仅限于本程序,<br>如果我要得到别的程序的某个 API 的地址呢?
 
dll載入內存后,任一進程調用它,地址都是一樣的.<br>所以,如果是WinAPI,當然也是一樣.<br>你可以測試一下,在兩個不同的程序里,調用<br>&nbsp; ShowMessage(IntToStr(Integer(Pointer(@MessageBox))));<br>得到的結果都是一樣的.<br><br><br>
 
别人的程序又没代码,无法加进去。<br>而且 @messagebox 我查过不同程序的内存地址是不一样的。
 
那你需要进入别人的进程,可参见进程注入或HookAPI的相关内容。<br>例如,你做了某个系统钩子,当目标程序触发该钩子的时候,你的<br>dll就是在目标进程内部了,这时就可以调用GetProcAddress来取<br>到你需要的API的地址了。<br>
 
我用过 GetProcAddress 来取了,但是取出来的地址就是不正确。<br>一般用@去的是4XXXXX,而G取的是8XXXXXXX
 
上面的測試有問題,ShowMessage出來的地址是MessageBox函數在本進程中的地址.<br>用這個測試可知是一樣的.<br>procedure Test;<br>const<br>&nbsp; ADllName='user32.dll';<br>type<br>&nbsp; TMessageBox=function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;<br>var<br>&nbsp; Lib:Integer;<br>&nbsp; MessageBox:TMessageBox;<br>begin<br>&nbsp; Lib:=LoadLibrary(PChar(ADllName));<br>&nbsp; @MessageBox:=GetProcAddress(Lib,PChar('MessageBoxA'));<br>&nbsp; ShowMessage(IntToStr(Integer(Pointer(@MessageBox))));<br>end;
 
但得到的地址程序没有运行过去?我用SOFTICE设置了一个断点。
 
沒理由的,將上例得到的地址代進去,下面的代碼正常運行.<br>procedure TForm1.Button1Click(Sender: TObject);<br>type<br>&nbsp; TMessageBox=function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;<br>var<br>&nbsp; Msg_Box:TMessageBox;<br>begin<br>&nbsp; Msg_Box:=Pointer(2011378265); //將地址代進去.<br>&nbsp; Msg_Box(Handle,'Hello','test',0);<br>end;
 
messagebox的地址似乎是由一个ebx传进去的........
 
经过多次跟踪,发现虽然smokingroom得到的地址是能用的,但决计不是 MessageBox 的真正地址,因为 bpx messageboxa 是可以中断的,但 bpx 程序得到那个地址却不可以。
 
因為你所指的MessageBox是在Windows.pas單元中聲明的,<br>function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;(A)<br>雖然它的實現是調用API中的"MessageBoxA",但卻與API中"MessageBoxA"的地址是不一樣的,<br><br>
 
那有办法得到真正的 messageboxa 的地址呢?
 
在win32中每个进程 可见的 逻辑上的 内存空间 都是 4G,和别的程序是不相干的<br>实际上,每个进程中的dll载入位置都是不定的,对应api函数位置也不一样。。。<br>&nbsp; 在每个程序中,都有调用的api函数的指针,但是这个指针实际上是一个间接指针。。指向真正的函数地址<br><br>
 
这个我知道,问题是怎么知道该地址呢?
 
已解决了,谢谢。
 
后退
顶部