windows - ring øjeblikkeligt versus call dword nær [[dword addr]]

Indlæg af Hanne Mølgaard Plasc

Problem



Så for nylig har jeg lyst til at kalde nogle Win32-opkald fra samling, og jeg har brugt NASM som min eksterne samler. Jeg ringer SendMessage i min kode på følgende måde:


call \_\_imp\_\_SendMessageW@16


Dette blev samlet i et relativ spring (0xE8 opcode) og resultatet var en adgangsfejl. I debuggeren syntes den beregnede hoppeforskydning at være den rigtige (at \_\_imp\_\_SendMessageW@16 virkelig syntes at bo der), men det fungerede ikke desto mindre. Ved at undersøge samlingen produceret af Visual Studio, da jeg kaldte funktionen fra C ++, bemærkede jeg, at det ikke var et relativt hurtigt spring, det brugte, men i stedet (på MASM's sprog) en call dword ptr [\_\_imp\_\_SendMessageW@16] svarende til en 0xFF15 opcode . Efter lidt forundring fandt jeg ud af, at NASM-syntaxen koder for dette som call dword near [dword \_\_imp\_\_SendMessageW@16] og gør ændringen min kode pludselig fungerede.


Mit spørgsmål er, hvorfor arbejder man og ikke den anden? Er der nogen flytning af koden foregår, der får det relative øjeblikkelige opkald til at springe et sted uvenligt? Jeg har aldrig været meget af en forsamlingsprogrammerer, men mit indtryk var altid, at de to opkald skulle gøre det samme, og den største forskel er, at man er position uafhængig og den anden ikke er (forudsat at de flytter IP'en til det samme sted ). Flytningen af ​​kode teori giver mening, men da hvordan forklarer du debuggeren, der viser den rigtige adresse?


Også: Hvad er logikken bag syntaxen [] i denne opkald? Forskydningen er stadig en øjeblikkelig (kun lille endian kodet umiddelbart efter 0xFF15), der er ingen hukommelsestilgang foregået udenfor instruktionshentet (jeg har en tendens til at tænke på [] som en dereference uden for rammerne af lea).

Bedste reference


call dword[\_\_imp\_\_SendMessageW@16]


\_ imp \_SendMessageW @ 16 er en adresse til din importafdeling, der indeholder adressen til API-funktionen. Du bruger firkantede parenteser til respekt (kalder adressen gemt af denne adresse)