2012-12-19 54 views
2

如何在內聯asm中編寫此代碼?我想把數據包的值寫入inline asm的洞穴內存位置,怎麼樣?我可以用WriteProcessMemory的做,但我想擺脫這一點,並與ASM內聯asm向內存寫入值

int SendToClient(BYTE *packet, int Length) 
{ 
    int cave = (int)VirtualAllocEx(hProcess, NULL, Length, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 

    if (WriteProcessMemory(hProcess, (void*)cave, packet, Length, NULL)) 
    { 

    } 

    __asm 
    { 
     //how? 
    } 
} 

例如更換,說我想從地址senderOffset讀書,我會做:

int GetSenderID() 
{ 
    int value; 

    __asm 
    { 
     mov eax, senderOffset 
     mov value, eax 
    } 


    return *(int*)value; 
} 

這正在做什麼「ReadProcessMemory(GetCurrentProcess(),(VOID *)senderOffset,&值,0)會這樣做,我只是尋找同樣的方法來」內存asme的「WriteProcessMemory」

+1

你正在使用哪種編譯器和操作系統? –

+0

VC++ Windows 8. – Dean

+3

爲什麼內聯asm?爲什麼不簡單地'memcpy((void *)洞穴,(void *)數據包,長度* sizeof(BYTE))' – log0

回答

3

如果你想要什麼要做的事實質上是在inl中重寫WriteProcessMemory()集會,忘記它,它不會發生。 WriteProcessMemory()是一個操作系統接口,允許您更改另一個進程的虛擬內存空間的內容,無論您使用什麼指令,都無法直接從用戶空間進程執行此操作。無論是內聯還是單獨的彙編源文件,彙編數量都無法投射魔法咒語,以允許在其虛擬內存沙箱中運行的流程不用通過操作系統就可以寫入另一個流程的虛擬內存沙箱這樣做。在您的用戶模式程序中運行時,MMU被設置爲讓您的進程訪問自己的內存&沒有別的。即使試圖訪問沒有分配給你的進程的內存,也會給你一些訪問衝突錯誤(在Linux-land中稱爲SIGSEGV;儘管我知道你在Windows上)。

要訪問另一個進程的地址空間中的內存,您必須調用操作系統來執行此操作。每個系統都有一個控制OS調用的方式,將處理器從用戶模式切換到內核模式。在x86中,這些被稱爲「戒指」,操作系統在特權最高的「ring 0」中運行,用戶模式代碼運行在特權最低的「ring 3」中。駕駛員在另外兩個環中工作。您不能簡單地將CPU從環3切換到環0;試圖這樣做會觸發特權違規。在第3環中,您不能更改MMU以允許您的進程訪問(讀取或寫入或執行)另一個進程的內存空間。

+0

不,我只是試圖將數據包複製到位於洞穴內存。我正在做這個過程,而不是像WriteProcessMemory那樣在外部工作 – Dean

+0

@Dean - 好的,那你爲什麼要使用VirtualAllocEx()來分配內存,爲什麼要使用WriteProcessMemory()在你自己的進程中複製內存? – phonetagger

+0

我分配內存來存儲值,我試圖不使用WriteProcessMemory這個,這就是我要求幫助。 – Dean