Jump to content
CSm1n

[ASM] Noob

Recommended Posts

Posted (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 by CSm1n
  • Upvote 2
Posted (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 by CSm1n
Posted

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

Posted

@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$...

Posted

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

 

  • Upvote 3
Posted

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!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...