0

了解しました。早くするようにします。別のプロセスでDLLを挿入する方法を学習しようとしています。現時点では、電卓を開いたときにメッセージを出力するタイミングを検出しようとしています。私は次のDLLを作成しました:

#include <windows.h>
#include <iostream>

using namespace std;
extern "C"{
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
    {       
       cout << "I'M NOT WORKING " << endl;
       // Bunch of code...
       return CallNextHookEx(0, nCode, wParam, lParam);
    } 
    void ASimpleFunc(){
        cout << "DLL WORKING" << endl;
    }
}

そして、これが私のインジェクターです(まあ...それは現時点でDLLをロードしようとしているだけです)。

#include <windows.h>
#include <iostream>

using namespace std;
typedef LRESULT (*CBTProc)(int,WPARAM,LPARAM); 
typedef void (*ASimpleFunc)(); 
int main()
{   
    // My two functions... 
    LRESULT _CBTProc;
    ASimpleFunc _ASimpleFunc;

   HMODULE hDll = LoadLibrary("myDLL.dll");
   if(!hDll){
       cout << "DLL FAILED TO LOAD" << endl;
   }else{
       cout << "DLL LOAD SUCCESS" << endl;

       // This one is working
       _ASimpleFunc = (ASimpleFunc)GetProcAddress(hDll, "ASimpleFunc");

       // This one is not working
        _CBTProc = (CBTProc)GetProcAddress(hDll, "CBTProc");
        if(!_ASimpleFunc || !_CBTProc){
            cout << "UNABLE TO CALL HOOK" << endl;
        }else{
            // other code...
        }
    }
   return 1;
} 

何か案は?

編集:これはコードの100%ではありません。DLLMainのような明らかなものや、問題と直接相互作用しないものをすべて取り出しました。

4

3 に答える 3

2

CALLBACKマクロはstdcall 呼び出し規則を提供するCBTProcため、その名前には先頭のアンダースコアとバイト カウントで注釈が付けられます (たとえば、_CBTProc@12. GetProcAddressエクスポートの正確な名前で呼び出す必要があります。この名前は、dumpbin ツールを使用して見つけることができます。

CALLBACK関数ポインターを介して関数を呼び出すときに、正しい呼び出し規則が使用されるように、関数ポインターにも注釈を付ける必要があることに注意してください。

于 2013-01-03T03:48:11.420 に答える
1

これを機能させるには、実際にDLLを他のプロセスにロードする必要があります。これを行うには、DLL をロードする他のプロセスにリモート スレッドを作成します。

DLLMain次に、フックしたい関数をフックするために、のロードでフックを実行する必要があります。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

http://en.wikipedia.org/wiki/DLL_injection

これらの 2 つのリンクは、正しい方向を示しているはずです。

于 2013-01-03T03:44:26.820 に答える
0

これがなくても機能する理由はわかりませんが、関数を DLL からエクスポートする場合は、明示的にエクスポートする必要があります。これを行うには、次の 2 つの方法があります。

  1. コンパイラ固有の方法でコンパイラに伝えます。

    Visual C++の場合__declspec(dllexport)、.

  2. モジュール定義ファイルを使用します。

于 2013-01-03T03:44:51.063 に答える