CSm1n Posted December 27, 2016 Report Share 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 Link to comment Share on other sites More sharing options...
Silviu Posted December 28, 2016 Report Share Posted December 28, 2016 Cred că @Nytro te poate ajuta. Quote Link to comment Share on other sites More sharing options...
Active Members MrGrj Posted December 28, 2016 Active Members Report Share Posted December 28, 2016 sau @Ganav daca are timp. Quote Link to comment Share on other sites More sharing options...
Usr6 Posted December 28, 2016 Report Share Posted December 28, 2016 ai incercat? jmp 0x8CCE6C sau push 0x8CCE6C jmp ebp Quote Link to comment Share on other sites More sharing options...
CSm1n Posted December 28, 2016 Author Report Share 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 Link to comment Share on other sites More sharing options...
Usr6 Posted December 28, 2016 Report Share 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 Link to comment Share on other sites More sharing options...
CSm1n Posted December 28, 2016 Author Report Share 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 Link to comment Share on other sites More sharing options...
Usr6 Posted December 28, 2016 Report Share 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 Link to comment Share on other sites More sharing options...
CSm1n Posted December 28, 2016 Author Report Share 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 Link to comment Share on other sites More sharing options...