2016-08-29 22 views
2

です。VirtualAllocExの成功はベースアドレスを返しますが、WriteProcessは失敗し、エラーは487

int main() 
{ 
HANDLE hTargetHandle; 
int TargetProcessId=GetTargetProcessId(); 


hTargetHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,TargetProcessId); 

if(hTargetHandle==INVALID_HANDLE_VALUE) 
{ 
    DWORD d=GetLastError(); 
    printf("openprocess fail\n"); 
    printf("the TargetProcessId is: %d\n",TargetProcessId); 

    printf("the result of getlast is: %d\n",d); 
    system("PAUSE"); 
    exit(-1); 
} 

DWORD dwBufferSize=(DWORD)GetTargetProcessId-(DWORD)create; 

DWORD dwProcBaseAddress=(DWORD)VirtualAllocEx(hTargetHandle,NULL,1024*1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE);  //the size here is 1024*1024,I don't know the size of the function I am going to inject to another process,so I use 1024*1024 here.I have ever tried to use 1024*1024*10,but it is the same error. 

if(dwProcBaseAddress==NULL) 
{ 
    DWORD d=GetLastError(); 
    printf("virtualallocex has fail\n"); 
    printf("the last error is:%d\n",d); 
    system("PAUSE"); 
    exit(-1); 
} 

int a=WriteProcessMemory(hTargetHandle,&dwProcBaseAddress,create,1024*1024,NULL);    //create is a function I defined,used to inject to another process. 
if(a==0) 
{ 
    DWORD d=GetLastError(); 
    printf("writeprocessmemory has fail\n"); 
    printf("the last error is %d\n",d); 
    system("PAUSE"); 
    exit(-1); 
} 

DWORD dwThreadId; 

HANDLE hRemoteThreadHandle=CreateRemoteThread(hTargetHandle,NULL,NULL,(LPTHREAD_START_ROUTINE)dwProcBaseAddress,NULL,0,&dwThreadId); 

if(hRemoteThreadHandle!=INVALID_HANDLE_VALUE) 
{ 

    printf("succeed\n"); 
    system("PAUSE"); 
    exit(-1); 
} 


system("PAUSE"); 
return 1; 
} 

以下は結果である。 WriteProcessMemory関数が失敗し、エラー487が発生します。これは、アドレスが無効であることを意味します。

Error message

しかし、アドレスがVirtualAllocEx関数の戻り値では、戻り値がnullではないので、アドレスが利用可能であるべきです。私はどこに問題があるのか​​分からない。

+5

ちょうどタイプミス。 'dwProcBaseAddress'を渡すことを意味するときに、'&dwProcBaseAddress'をWriteProcessMemoryに渡しています。 –

答えて

6

エラーコードが発生した場合は、それを参照してください。それはここに文書化されています:https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx。あなたには487があり、これはERROR_INVALID_ADDRESSです。関連する説明は次のとおりです。

無効なアドレスにアクセスしようとしています。

だから、もっと深く掘り下げよう。無効なアドレスがある場合、それは何でしょうか?関数に渡す2つのアドレスは、2番目と3番目の引数にあります。確かに最初のもの、lpBaseAddressが間違っています。割り当てたメモリのアドレスを渡すことを意味します。代わりに、そのアドレスを含む変数のアドレスを渡します。

あなたの問題の一部が間違ったタイプキャストであると思われます。 VirtualAllocExLPVOIDを返します。 DWORDへのキャストは、32ビットプロセスでは問題ありませんが、64ビットプロセスでは不可能です。しかし、なぜあなたはまったくキャストしていますか? LPVOIDは、WriteProcessMemoryに渡す必要があります。あなたのコードは間違ったキャストで散らばっています。広範なルールとして、あなたのやり方を型キャストすることは、エラーを示唆するコードの匂いです。あなたが行っている方法をキャストすると、コンパイラはあなたのコードをタイプすることができなくなります。

これはどのようにベースアドレス変数が宣言されるべきである:あなたがintを使用し、なぜ私にはわからない

BOOL retval = WriteProcessMemory(..., lpBaseAddress, ...); 

LPVOID lpBaseAddress = VirtualAllocEx(...); 

次にあなたがWriteProcessMemoryを呼び出すときに、その変数を渡します戻り値はWriteProcessMemoryです。ドキュメントにはBOOLと書かれています。それは意味の意味を伝えます。また、PIDにはintを使用します。 PIDのタイプはDWORDです。

機能の長さを知らないと問題になる可能性があります。 createを超えて1024*1024バイトを読み取れない場合はどうなりますか?

プログラムの不具合は十分に簡単です。あなたは間違ったアドレスを渡しました。しかし、私は少し後退する必要があると思います。その欠陥を修正して移動しないでください。実際には、Win32 APIが使用する型で時間を費やす必要があります。あなたの無慈悲な型キャスティングは、あなたが癖をつけない限り何度もあなたを傷つけるでしょう。

関連する問題