Salutare! Lucrez la un programel si m-am lovit de o problema de care nu pot sa ii dau de cap si ma gandeam ca as putea primi o mana de ajutor de aici.
Am un executabil fara cod sursa care la un moment dat executa opcode:
mov edx,[plm.exe+4CCE6C]
Ce vreau eu sa fac este sa reproduc instructiunea asta intr-un dll pe care il incarc in executabilul mai sus mentionat.
Cunostintele mele (care sunt sub nivelul marii) in materie de ASM m-au ajutat sa rescriu niste bucatele din memoria executabilului astfel incat sa faca jmp la mine in dll intr-o functie naked, dar mai departe trebuie sa scriu la mine in functi acel opcode si chiar nu am idee cum.
Base address e constanta, asa ca stiu care este adresa finala (0x400000+0x4CCE6C = 0x8CCE6C)
Am incercat:
// varianta 1:
__asm {
mov edx, [0x8CCE6C]
}
// varianta 2:
__asm {
mov edx, dword ptr[0x8CCE6C]
}
Dar cand am verificat codul in debugger, compilerul a eliminat dereferentierea(cred ca asa se numesc acele paranteze patrate din jurul adresei), iar instructiunea finala arata asa in ambele cazuri:
mov edx, plm.exe+4CCE6C
Daca se poate, imi puteti explica ce fac eu gresit?
------------------------------
// EDIT: Am reusit sa fac o smecherie, si anume dau push la eax pe stack, scriu in eax adresa, fac acea mutare si apoi dau pop la eax de pe stack:
__asm {
push eax
mov eax, 0x8CCE6C
mov edx, [eax]
pop eax
}
Totusi, ce e gresit in primele mele 2 exemple si nu este nicio metoda sa execut acea instructiune fara sa folosesc un register in plus?