2016-05-22 13 views
0

この方法で正しい値を得ることができますが、ReadProcessMemoryを使わずに自分のプロセスのメモリを読み込む方法の例が欲しいです。ReadProcessMemoryを使用せずに私自身のプロセスのメモリを読み取る

var 
    Modulo : HMODULE; 
    Value1, Value2, Read : Cardinal; 
    GetWindowTextAAPI: function (hWnd: HWND; lpString: PChar; nMaxCount: integer):integer; stdcall; 
begin 
    Modulo := GetModuleHandle('user32.dll'); 
    if (Modulo <> 0) then 
    begin 
    @GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA'); 
    if (@GetWindowTextAAPI <> nil) then 
    begin 
     ReadProcessMemory(GetCurrentProcess, Pointer(@GetWindowTextAAPI), Addr(Value1), 4, Read); 
     ReadProcessMemory(GetCurrentProcess, Pointer(DWORD(@GetWindowTextAAPI)+4), Addr(Value2), 4, Read); 
     ShowMessage(
     IntToStr(Value1) 
     + ' ' + 
     IntToStr(Value2) 
    ); 
    end; 
    end; 
end; 

CopyMemoryの機能の使い方は?

+0

'Assert(PDWORD(@GetWindowTextAAPI)^ = Value1)'。私は理解しているかどうかわからない.. –

+1

ようこそStackOverflow! [あなたの質問](https://stackoverflow.com/users/6365505)ごとに新しいアカウントを作成しないでください。 APIフックに興味があるようです。それが正しいか? –

+0

@SertacAkyuzはアサーションエラーを返します。 – 0x4

答えて

0

自分のプロセスからメモリを読み込むために特別なことは何もありません。それはあなたのプログラムが既にを実行していることです。いつもです。確かにReadProcessMemoryは必要ありません。代わりに、あなたは単にポインタを間接参照します。

あなたはAPI関数を呼び出すに興味を持っているように、それは見ていないので、あなたはあなたの関数ポインタ宣言簡素化することで起動することができます、そして、

var 
    GetWindowTextAAPI: PDWord; 

をポインタを割り当てて、値を読みます:

GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA'); 
Value1 := GetWindowTextAAPI^; 
+0

正常に動作しましたが、+ 0x4(BitBltAPI^+ 4)を使用すると正しい値が返されません。 – 0x4

+0

いつものように、Delphiでは、コードが構文的に正しいことを要求しています。 –

+0

私の現在の試みIntToStr(BitBltAPI^+ 4)それはうまくいかない、どうすれば正しいだろうか? – 0x4

関連する問題