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]
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]
Vastaukset 6
Vanhimmat
onko tämä tehtävä jotain nörtteilyä vai onko tästä jotain oikeaa hyötyäkin?
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ä.
Guru hoisi sen seuraavasti (h.264 video):
http://www.sendspace.com/file/z44pd6
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ä.
ongelmaan joka oli ratkaistu ajat sitten
Täällä foorumeissa ei saa koskaan kukaan kiitosta. Mielestäni se on loistavaa, että joku vastaa pitkästi ja asiantuntevasti yleisten vtuilun sijasta.
- Kiitos