Ik heb Java-code die is gecompileerd naar een .class-bestand. Er is een functie die weinig parameters krijgt en wat actie doet (bijv. Haal int x en int y en doe x + y)

Ik wil aan dit .class-bestand code toevoegen die controleert of x = 1 en oproep naar een andere functie (bijv. oproep naar xy en niet doen x + y)

Hoe kan ik een gecompileerd .class-bestand bewerken en mijn eigen code toevoegen?

Opmerkingen

  • Ik heb de vraag aangepast, hopelijk is dit wat je eigenlijk wilde stellen; zo niet, verduidelijk het dan in een opmerking of bewerk het zelf.

Answer

Er zijn verschillende manieren om dit te bereiken:

  1. Decompileer .class naar .java-broncode ( niet noodzakelijk de originele bron, maar gelijkwaardig), breng je wijzigingen aan, compileer opnieuw. Er zijn veel Java-decompilers beschikbaar, ik zal ze niet allemaal opsommen.

  2. Demonteer .class naar “assembly” (meestal Jasmin-syntaxis), wijzig het, assembleer het weer. Krakatau is een goede tool die het zou moeten kunnen.

  3. Gebruik een tool die / patch de bytecode rechtstreeks in het .class-bestand. Ik heb het “niet geprobeerd, maar Recaf beweert dat ik het kan.

  4. Hook the Java runtime-interpreter om het moment te vangen waarop het begint met het uitvoeren van de doelfunctie en het in plaats daarvan iets anders te laten uitvoeren. Dit is enigszins implementatiespecifiek, maar hier is een voorbeeld waarvan ik weet dat het Java-foutopsporingsprotocol (JWDP) gebruikt: https://github.com/CrowdStrike/pyspresso

Antwoord

U kunt JByteMod gebruiken om de bytecode van uw klas te bewerken. U kunt ook nieuwe methoden maken, methoden en velden verwijderen en toegangen wijzigen.

Het is vrij eenvoudig te gebruiken, laad gewoon de jar en selecteer de klasse die u wilt bewerken.

JByteMod: https://github.com/GraxCode/JByteMod-Beta/releases

Reacties

  • JByteMod hasn ' t had nu helaas een update in twee jaar. De auteur is op verschillende projecten gesprongen, hoewel van vergelijkbare aard.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *