Iisi fiksaus, lisää yksi JMP komento

Kun täällä on guruja joka lähtöön, niin nyt tarvittaisiin yhtä retro assembler jätkää. Kyse on Turbo Pascal 7.0 sovelluksesta jossa on yksi rutiini joka pitäisi ohittaa. ELi joko korvata iffin osuudelta nopeilla tai vaihtoehtoisesti hypätä koko iffin yli. Muistaakseni koodiin ei ole tehty mitään ylimääräisiä tarkistuksia tämän ohituksen osalta.

Löytyisikö ketään joka osaisi tällaisen ihan yksinkertaisen basic fiksauksen tehdä? - Kiitos

Minulla ei ole sopivia reverse engineering tooleja tai assembler osaamista. Siitä ongelma muodostuu. Koitin jo sopivaksi katsomistani kohdista korvata koodinpätkiä nopeilla, mutta eipä tärpännyt.

Täällä tuntuu olevan paljon puhetta, joten katsotaan onko osaamista muutaman tavun vaihtamiseen. ;)

[email protected]
6386
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

onko tämä tehtävä jotain nörtteilyä vai onko tästä jotain oikeaa hyötyäkin?

Äänestä
  • Löysin jo tyypin joka osasi hoitaa homman lennossa. Kyse oli siis ohjelmassa olevata rutiinista joka esti ohjelman toimimisen. Nyt tuo ongelma on poistettu ohittamalla kyseinen rutiini.

    Hatunnosto pätevälle kaverille joka hoiti homman kahdessa tunnissa. Nykyjään vaan on niin paljon koodareita jotka eivät tällaisesta perusjutusta selviä.

    Äänestä

Siis:

kun Pascal -lähdekoodissa on esim:

procedure TForm1.Button1Click(Sender: TObject);
label
P1;

begin
Q := 1;
if Integer(Sender) = 5 then begin
//
Q := 2;
end;
P1:
W := Q;
end;

niin kääntäjä tekee jotain tämäntapaista:
(esimerkkikoodi Delphi7:lla, kysyjän tapaus Turbo Pascalilla MS-DOSissa, joten tästä johtuen esimerkkikoodi on 32-bittistä, TP 7.0 taas tekee 16-bit koodia)

004505FE 837DF805 cmp dword ptr [ebp-$08],$05
00450602 750A jnz $0a
00450604 C705D83B45000200 mov [Q],$00000002
0045060E A1D83B4500 mov eax,[Q]
00450613 A3DC3B4500 mov [W],eax

tässä tapauksessa IF -lohkon ohitus sujuisi näin:

00450602 EB0A jmp $0a

tässä siis muutetaan ehdollinen hyppykäsky jnz (joka hyppää lohkon yli, jos IF -ehto ei toteudu) ehdottomaksi hyppykäskyksi jmp, ja homma hoidettu.

MS-DOSin mukana pitäisi tulla MS:n debug.exe, jolla voi asioita nopeasti kokeilla, vaikka tuo ei muuten parhaita debuggereita olekaan.

huomaa: debug ei osaa tallentaa EXE -tiedostoja!

Mutta ongelman voi kiertää näin:

1. debuggaa EXEen haluamasi muutokset, mutta dokumentoi tarkasti jokainen tekemäsi muutos

2. Testaa halutessasi debugin alaisuudessa, että homma toimii haluamallasi tavalla.

3. lopeta DEBUG (jolloin tekemäsi muutokset unohdetaan)

4. komenna: ren softa.exe softa.bin

5. käynnistä debug uudelleen näin:
debug softa.bin

6. etsi edellä dokumentoimasi muutoskohdat ja tee muutokset uudelleen - huomaa, että kun exe ladataan bin:iksi uudelleennimettynä, osoitteiden selvitys ja relocatointi ei toimi - joten kaikki osoitteet poikkeavat siitä, mitä ne olisivat, jos ohjelma olisi ladattu exe:nä

7. tallenna muuttamasi ohjelma w -komennolla ja poistu (q)

8. nimeä takaisin:

komenna: ren softa.bin softa.exe

Muutoksen pitäisi olla nyt valmis ja toimiva. Voit halutessasi ladata muutetun exe:n, ja tarkistaa vielä kerran, että muutokset vaikuttivat oikeisiin kohtiin.

Jos on if - then - else -rakenne, koodi on hieman monimutkaisempi, mutta pääperiaate on sama.

lisäinfoa: googleta vaikkapa 80386 instruction set.

noissa vanhoissa ms-dos -ohjelmissa siis käytetään 16-bit koodisegmenttejä.

Äänestä
  • ongelmaan joka oli ratkaistu ajat sitten

    Äänestä

  • Täällä foorumeissa ei saa koskaan kukaan kiitosta. Mielestäni se on loistavaa, että joku vastaa pitkästi ja asiantuntevasti yleisten vtuilun sijasta.

    - Kiitos

    Äänestä

Kommentoi aloitusta


Propeller-head kirjoitti:

Kun täällä on guruja joka lähtöön, niin nyt tarvittaisiin yhtä retro assembler jätkää. Kyse on Turbo Pascal 7.0 sovelluksesta jossa on yksi rutiini joka pitäisi ohittaa. ELi joko korvata iffin osuudelta nopeilla tai vaihtoehtoisesti hypätä koko iffin yli. Muistaakseni koodiin ei ole tehty mitään ylimääräisiä tarkistuksia tämän ohituksen osalta.

Löytyisikö ketään joka osaisi tällaisen ihan yksinkertaisen basic fiksauksen tehdä? - Kiitos

Minulla ei ole sopivia reverse engineering tooleja tai assembler osaamista. Siitä ongelma muodostuu. Koitin jo sopivaksi katsomistani kohdista korvata koodinpätkiä nopeilla, mutta eipä tärpännyt.

Täällä tuntuu olevan paljon puhetta, joten katsotaan onko osaamista muutaman tavun vaihtamiseen. ;)

[email protected]

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu