2011-09-14 72 views
0

我有這樣的代碼:如何通過MessageBox輸出指針?

extern "C" __declspec(dllexport) void getName(void) 
{ 
    char buf[20]; 
    int slotNumber = 1; 

    DWORD tempdw; 
    DWORD hStorm_LOBBYPTR; 
    hStorm_LOBBYPTR = (DWORD)GetModuleHandleW(L"Storm.dll") + 0x1000 + 0x40000 + 0x8000; 


    __asm 
    { 
    PUSHAD 
    MOV  EAX, DWORD PTR DS:[hStorm_LOBBYPTR] 
    TEST  EAX, EAX 
    JE   nick_false 
    MOV  ECX, DWORD PTR DS:[EAX+0xC464] 
    TEST  ECX, ECX 
    JE   nick_false 
    MOV  EAX, DWORD PTR DS:[ECX+0x170+0xB0] 
    TEST  EAX, EAX 
    JE   nick_false 
    MOV  EDX, slotNumber 
    MOV  ECX, DWORD PTR DS:[EAX+EDX*4] 
    MOV  EAX, DWORD PTR DS:[ECX+0x1A0] 
    MOV  ECX, DWORD PTR DS:[EAX+0x1E4] 
    MOV  EAX, DWORD PTR DS:[ECX+0x1E4] 
    MOV  ECX, DWORD PTR DS:[EAX+0x1E8] 
    MOV  tempdw, ECX 
    POPAD 
    JMP  nick_true 

nick_false: 
    XOR  EAX, EAX 
    MOV  tempdw, EAX 
    POPAD 
    } 

    sprintf(buf,"%d", tempdw); 
    MessageBox(0, buf, "Dll Injector", MB_ICONEXCLAMATION | MB_OK); 

tempdw是一個指針,但是當我嘗試一下吧, 我有這種垃圾的消息框: screenshot pointer messagebox

我應該怎麼辦?

+2

對於初學者來說,使用'MessageBoxA',以確保您使用的ASCII版本。另外,通常使用'%0p'作爲指針的格式說明符。 –

+1

你說'tempdw'是一個指針 - 你應該首先聲明它。 –

+0

AFAIK,指針應該用「%x」格式化。 – Max

回答

2

我的猜測是,你的程序集重蹈覆轍(可能是一個寄存器),這意味着sprintf失敗,緩衝區只包含隨機堆棧噪聲。

通過刪除程序集來檢查。

0

中查找 「%P」 打印符在printf

char temp_buffer[64]; 
char * p_temp_buffer = temp_buffer; // A pointer to display. 
//... 
sprintf(temp_buffer, "%p", (void *) p_temp_buffer); 
MessageBox(0, temp_buffer, "Pointer value", MB_OK); 
+0

這可能是如此,但它不能解釋問題中報告的行爲。 –

+0

OP的問題是如何在消息框中顯示指針;這就是我的回答。我傾向於不回答無法解釋的行爲問題。 –

+0

但是在這種情況下,不明原因的行爲就是Jugo被卡住的原因。 –