CSm1n Posted December 27, 2016 Report Posted December 27, 2016 (edited) 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? Edited December 27, 2016 by CSm1n 2 Quote
Active Members MrGrj Posted December 28, 2016 Active Members Report Posted December 28, 2016 sau @Ganav daca are timp. Quote
Usr6 Posted December 28, 2016 Report Posted December 28, 2016 ai incercat? jmp 0x8CCE6C sau push 0x8CCE6C jmp ebp Quote
CSm1n Posted December 28, 2016 Author Report Posted December 28, 2016 (edited) @Usr6 Instructiunea pe care vreau eu sa o implementez nu este un jump, pur si simplu incarca in edx continutul adresei respective. Deci ce mi-ai dat nu este compatibil... Edited December 28, 2016 by CSm1n Quote
Usr6 Posted December 28, 2016 Report Posted December 28, 2016 mov edx, dword ptr[0x8CCE6C] iti incarca 4 byte din locatia respectiva, word daca iti trebuie 2 sau byte daca ai nevoie de primul byte sau push dword ptr [0x8CCE6C] pop edx Quote
CSm1n Posted December 28, 2016 Author Report Posted December 28, 2016 @Usr6Metoda 1 am incercat-o deja, am mentionat asta in prima postare. La a 2-a metoda se elimina dereferentierea ca la celelalte, si anume debuggerul arata: push plm.exe+4CCE6C pop edx Asa ca in edx imi incarca adresa in loc sa imi incarce continutul adresei. Ar putea fi vinovat compilatorul? Folosesc VS2015, dar inclin sa cred ca nu poate sa fie o problema atat de mare intr-un un produs M$... Quote
Usr6 Posted December 28, 2016 Report Posted December 28, 2016 nu e vinovat, el doar optimizeaza codul MrGrj zice: project properties -> build -> "optimize code" sau, daca tii neaparat, editezi fisierul executabil cu ollydbg si pui acolo mov edx, dword ptr[0x8CCE6C] in loc de: mov edx, plm.exe+4CCE6C 3 Quote
CSm1n Posted December 28, 2016 Author Report Posted December 28, 2016 Ar fi o idee sa modific manual executabilul, insa opcodeul cu dereferentiere este mai mare cu un byte, iar asta implica sa modific si instructiunile care urmeaza, asa ca cel mai bine raman la solutia cu registrul suplimentar. Mersi de ajutor! Quote