Skip to content

lsieun/learn-java-asm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

50 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Learn Java ASM

Gitee Github GitHub GitHub stars GitHub forks GitHub issues GitHub last commit

๐Ÿ Java ASM is an open-source java library for manipulating bytecode.

ๆœฌ้กน็›ฎๆ—จๅœจ็ณป็ปŸๅœฐไป‹็ปๅฆ‚ไฝ•ๅญฆไน Java ASM็š„็Ÿฅ่ฏ†๏ผŒไธป่ฆๆถ‰ๅŠCore APIใ€OPCODEๅ’ŒTree API็ญ‰ๅ†…ๅฎนใ€‚่‡ณไบŽๅญฆไน ็š„้ข„ๆœŸ็›ฎๆ ‡ๅฐฑๆ˜ฏ๏ผŒ็”จไธ€ไธชๅฝข่ฑก็š„่ฏดๆณ•ๆฅ่ฎฒ๏ผŒ่ฎฉๅญ—่Š‚็ ๅœจไฝ ็š„ๆ‰‹ไธญโ€œ่ทณ่ˆžโ€๏ผš็œ‹็œ‹ไฝ ็š„ๅทฆๆ‰‹๏ผŒไธ€ไธชๅฎŒๆ•ด็š„ClassFileๆ‹†่งฃๆˆไธๅŒ็ฒ’ๅบฆ็š„ๅญ—่Š‚็ ๅ†…ๅฎน๏ผ›็œ‹็œ‹ไฝ ็š„ๅณๆ‰‹๏ผŒไธๅŒ็ฒ’ๅบฆ็š„ๅญ—่Š‚็ ๅ†…ๅฎนๅˆ้‡ๆ–ฐ็ป„็ป‡ๆˆไธ€ไธชClassFile็ป“ๆž„ใ€‚

           _______                                 ,        _        _        
          (,     /'                              /'/      /' `\     ' )     _)
               /'                              /' /     /'   ._)    //  _/~/' 
             /'____ .     ,   ____          ,/'  /     (____      /'/_/~ /'   
   _       /'/'    )|    /  /'    )        /`--,/           )   /' /~  /'     
 /' `    /'/'    /' |  /' /'    /'       /'    /          /'  /'     /'       
(_____,/' (___,/(___|/(__(___,/(__   (,/'     (_,(_____,/'(,/'      (_,       

ๅฆ‚ๆžœๆˆ‘ไปฌๅญฆไผšไบ†Java ASMไน‹ๅŽ๏ผŒๅฏ่ƒฝ่ฟ˜ๆ˜ฏ้œ€่ฆไธ€ไธชๅ…ทไฝ“็š„ๅบ”็”จๅœบๆ™ฏๆฅ่ฟ›่กŒไฝฟ็”จ๏ผŒ่ฟ™ไธชๅœบๆ™ฏๅฐฑๆ˜ฏ็”ฑ Java Agent ๅผ€ๅฏ็š„ใ€‚

้‚ฃไนˆ๏ผŒJava ASMๅ’ŒJava Agent่ฟ™ไธค่€…ไน‹้—ดๆ˜ฏไป€ไนˆๅ…ณ็ณปๅ‘ข๏ผŸ Java ASMๆ˜ฏไธ€ไธชๆ“ไฝœๅญ—่Š‚็ ็š„ๅทฅๅ…ท๏ผˆtool๏ผ‰๏ผŒ่€ŒJava Agentๆไพ›ไบ†ไฟฎๆ”นๅญ—่Š‚็ ็š„ๆœบไผš๏ผˆopportunity๏ผ‰ใ€‚ ๆƒณๅƒ่ฟ™ๆ ทไธ€ไธชๅœบๆ™ฏ๏ผš ๆœ‰ไธ€ไธชJVMๆญฃๅœจ่ฟ่กŒ๏ผŒ็ช็„ถJava AgentๅœจJVMไธŠๆ‰“ๅผ€ไธ€ๆ‰‡ๅคง้—จ๏ผŒJava ASM้€š่ฟ‡ๅคง้—จๅ†ฒ่ฟ›JVM้‡Œ้ข๏ผŒๅฐฑ่ฆๅผ€ๅง‹ไฟฎๆ”นๅญ—่Š‚็ ไบ†ใ€‚

.class --- Java ASM --- Java Agent --- JVM

ๅ†ๆ‰“ไธชๆฏ”ๆ–น๏ผŒJava ASMๅฐฑๆ˜ฏโ€œไธ€ๅŒนๅƒ้‡Œ้ฉฌโ€๏ผŒ่€ŒJava Agentๅฐฑๆ˜ฏโ€œไผฏไนโ€ใ€‚ ๅฆ‚ๆžœ้‡ไธๅˆฐโ€œไผฏไนโ€๏ผŒๅฏ่ƒฝโ€œๅƒ้‡Œ้ฉฌโ€็š„ๆ‰่ƒฝๅฐฑๅŸ‹ๆฒกไบ†๏ผ›ๆญฃๅ› ไธบๆœ‰ไบ†โ€œไผฏไนโ€๏ผŒโ€œๅƒ้‡Œ้ฉฌโ€ๅฐฑๆœ‰ไบ†ๆ–ฝๅฑ•ๆ‰่ƒฝ็š„ๆœบไผšใ€‚

ไธ–ๆœ‰ไผฏไน๏ผŒ็„ถๅŽๆœ‰ๅƒ้‡Œ้ฉฌใ€‚
ๅƒ้‡Œ้ฉฌๅธธๆœ‰๏ผŒ่€Œไผฏไนไธๅธธๆœ‰ใ€‚
ๆ•…่™ฝๆœ‰ๅ้ฉฌ๏ผŒ็ฅ—่พฑไบŽๅฅด้šถไบบไน‹ๆ‰‹๏ผŒ้ชˆๆญปไบŽๆงฝๆžฅไน‹้—ด๏ผŒไธไปฅๅƒ้‡Œ็งฐไนŸใ€‚

1. ๅฆ‚ไฝ•ไฝฟ็”จ

1.1 ไปฃ็ ไธ‹่ฝฝ

Gitee Github

ไปŽGitee ไป“ๅบ“ไธ‹่ฝฝไปฃ็ ๏ผŒไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปค๏ผš

git clone https://gitee.com/lsieun/learn-java-asm

ไปŽGitHub ไป“ๅบ“ไธ‹่ฝฝไปฃ็ ๏ผŒไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปค๏ผš

git clone https://github.com/lsieun/learn-java-asm

1.2 ๅผ€ๅ‘็Žฏๅขƒ

Licence Git Java Apache Maven IntelliJ IDEA

ๅœจlearn-java-asm้กน็›ฎๅฝ“ไธญ๏ผŒไฝฟ็”จ็š„ASM็‰ˆๆœฌไธบ9.0ใ€‚ๅฆ‚ๆžœๆƒณไฝฟ็”จๆœ€ๆ–ฐMaven Central ็‰ˆๆœฌ๏ผŒๅฏไปฅไฟฎๆ”นpom.xmlๆ–‡ไปถไธญ็š„asm.versionๅฑžๆ€ง๏ผš

<asm.version>9.0</asm.version>

1.3. ่ฟ่กŒไปฃ็ 

ๅœจlearn-java-asm้กน็›ฎๅฝ“ไธญ๏ผŒๅŒ…ๅซmainๆ–นๆณ•็š„็ฑปไธป่ฆไฝไบŽrunๅŒ…๏ผˆsrc/main/java/run๏ผ‰ใ€‚

2. ่ฏพ็จ‹่ต„ๆ–™

51cto Bilibili lsieun.github.io

  • ใ€ŠJava ASM็ณปๅˆ—ไธ€๏ผšCore APIใ€‹
  • ใ€ŠJava ASM็ณปๅˆ—ไบŒ๏ผšOPCODEใ€‹
  • ใ€ŠJava ASM็ณปๅˆ—ไธ‰๏ผšTree APIใ€‹

2.1. ASM็š„็ป„ๆˆ้ƒจๅˆ†

ไปŽ็ป„ๆˆ็ป“ๆž„ไธŠๆฅ่ฏด๏ผŒJava ASMๆœ‰Core APIๅ’ŒTree APIไธค้ƒจๅˆ†็ป„ๆˆใ€‚

                                   โ”Œโ”€โ”€โ”€ asm.jar
                                   โ”‚
            โ”Œโ”€โ”€โ”€ Core API โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ asm-util.jar
            โ”‚                      โ”‚
            โ”‚                      โ””โ”€โ”€โ”€ asm-commons.jar
Java ASM โ”€โ”€โ”€โ”ค
            โ”‚
            โ”‚                      โ”Œโ”€โ”€โ”€ asm-tree.jar
            โ””โ”€โ”€โ”€ Tree API โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                                   โ””โ”€โ”€โ”€ asm-analysis.jar

ไปŽไพ่ต–ๅ…ณ็ณป่ง’ๅบฆไธŠ่ฏด๏ผŒJava ASMๅฝ“ไธญ็š„ๅ„ไธช.jarไน‹้—ด็š„ไพ่ต–ๅ…ณ็ณปๅฆ‚ไธ‹๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”‚
โ”‚     util           โ”‚    analysis    โ”‚         commons    โ”‚
โ”‚             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚             โ”‚             tree             โ”‚             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                           core                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2. ASM่ƒฝๅคŸๅšไป€ไนˆ

ไปŽๅบ”็”จ็š„่ง’ๅบฆๆฅ่ฏด๏ผŒJava ASMๅฏไปฅ่ฟ›่กŒClass Generationใ€Class Transformationๅ’ŒClass Analysisไธ‰ไธช็ฑปๅž‹็š„ๆ“ไฝœใ€‚

                                   โ”Œโ”€โ”€โ”€ find potential bugs
                                   โ”‚
            โ”Œโ”€โ”€โ”€ analysis โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ detect unused code
            โ”‚                      โ”‚
            โ”‚                      โ””โ”€โ”€โ”€ reverse engineer code
            โ”‚
Java ASM โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ generation
            โ”‚
            โ”‚                      โ”Œโ”€โ”€โ”€ optimize programs
            โ”‚                      โ”‚
            โ””โ”€โ”€โ”€ transformation โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ obfuscate programs
                                   โ”‚
                                   โ””โ”€โ”€โ”€ insert performance monitoring code

2.3. top, nullๅ’Œvoid

ๅœจไธ‹่กจๅฝ“ไธญ๏ผŒtopใ€nullๅ’Œvoidไธ‰่€…็›ธๅฏนๅบ”็š„่ฝฌๆขๅ€ผ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   .class    โ”‚          ASM Type          โ”‚      ASM Value in Frame        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚     top     โ”‚            null            โ”‚ BasicValue.UNINITIALIZED_VALUE โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ aconst_null โ”‚ BasicInterpreter.NULL_TYPE โ”‚   BasicValue.REFERENCE_VALUE   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    void     โ”‚       Type.VOID_TYPE       โ”‚              null              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3. ๆณจๆ„ไบ‹้กน

3.1. ๆทปๅŠ typoๅญ—ๅ…ธ

ๅœจ็ผ–ๅ†™ไปฃ็ ็š„่ฟ‡็จ‹ไธญ๏ผŒไผš้‡ๅˆฐไธ€ไบ›Typoๆ็คบ๏ผŒๅŽŸๅ› ๆ˜ฏinsn็ญ‰ๅ†…ๅฎนไธๆ˜ฏๅˆๆณ•็š„ๅ•่ฏใ€‚

่งฃๅ†ณๆ–นๆณ•๏ผšๅ€ŸๅŠฉไบŽIntelliJ IDEA็š„Spellchecking ็š„ๅŠŸ่ƒฝใ€‚

ๆ“ไฝœๆญฅ้ชค๏ผš

  • ็ฌฌไธ€ๆญฅ๏ผŒๅœจSettings/Preferencesๅฝ“ไธญ๏ผŒๆ‰พๅˆฐEditor | Natural Languages | Spellingไฝ็ฝฎใ€‚
  • ็ฌฌไบŒๆญฅ๏ผŒๅœจๅณไพง็š„Custom dictionariesไฝ็ฝฎ๏ผŒๆทปๅŠ custom dictionary๏ผŒๅœจlearn-java-asm้กน็›ฎๆ น็›ฎๅฝ•ไธ‹๏ผŒๆœ‰ไธ€ไธชaccepted-words.dicๆ–‡ไปถ๏ผŒๆทปๅŠ ่ฏฅๆ–‡ไปถๅณๅฏใ€‚

้…็ฝฎๅฎŒๆˆไน‹ๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐๅฏๅŠจIntelliJ IDEAๆ‰่ƒฝ็”Ÿๆ•ˆใ€‚

3.2. ๆŸฅ็œ‹็ฌ”่ฎฐ

ๅœจ็ผ–ๅ†™ไปฃ็ ็š„่ฟ‡็จ‹ไธญ๏ผŒไธบไบ†ๆ–นไพฟ็†่งฃไปฃ็ ๏ผŒๆˆ‘ๆทปๅŠ ไบ†ไธ€ไบ›็ฌ”่ฎฐ๏ผŒๆ ผๅผๅฆ‚ไธ‹๏ผš

NOTE: ๅธŒๆœ›่ฟ™ๆ˜ฏไธ€ๆกๆœ‰็”จ็š„็ฌ”่ฎฐ

ไฝ†ๆ˜ฏ๏ผŒๅœจ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒๅฎƒๅนถไธไผš้ซ˜ไบฎๆ˜พ็คบ๏ผŒๅ› ๆญคไธๅฎนๆ˜“่ขซๅฏŸ่ง‰ๅˆฐใ€‚

่งฃๅ†ณๆ–นๆณ•๏ผšๅ€ŸๅŠฉไบŽIntelliJ IDEA็š„TODO comments ๅŠŸ่ƒฝใ€‚

ๆ“ไฝœๆญฅ้ชค๏ผš

  • ็ฌฌไธ€ๆญฅ๏ผŒๅœจSettings/Preferencesๅฝ“ไธญ๏ผŒๆ‰พๅˆฐEditor | TODOไฝ็ฝฎใ€‚
  • ็ฌฌไบŒๆญฅ๏ผŒๅœจๅณไพง็š„Patternsไฝ็ฝฎ๏ผŒๆทปๅŠ ไปฅไธ‹ๅ†…ๅฎน๏ผš
\bnote\b.*

้…็ฝฎๅฎŒๆˆไน‹ๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐๅฏๅŠจIntelliJ IDEAๆ‰่ƒฝ็”Ÿๆ•ˆใ€‚

3.3. ๅ…ณ้—ญ่ฐƒ่ฏ•ไฟกๆฏ

ๅœจ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒ่ฟ่กŒไปปไฝ•็ฑป๏ผŒ้ƒฝไผš่พ“ๅ‡บ่ฐƒ่ฏ•ไฟกๆฏใ€‚ๅœจ่ฐƒ่ฏ•ไฟกๆฏไธญ๏ผŒไผšๅธฆๆœ‰[DEBUG]ๆ ‡่ฏ†ใ€‚

ๅฆ‚ๆžœๆƒณๅ…ณ้—ญ่ฐƒ่ฏ•ไฟกๆฏ๏ผŒๅฏไปฅไฟฎๆ”นlsieun.cst.Const็ฑป็š„DEBUGๅญ—ๆฎตๅ€ผไธบfalse๏ผˆ้ป˜่ฎคๅ€ผไธบtrue๏ผ‰๏ผš

public class Const {
    public static final boolean DEBUG = false;
}

็„ถๅŽ๏ผŒๆ‰ง่กŒmvn clean compileๅฏน็ฑป่ฟ›่กŒ้‡ๆ–ฐ็ผ–่ฏ‘๏ผš

mvn clean compile

็ญ‰ๅพ…็ผ–่ฏ‘ๅฎŒๆˆไน‹ๅŽ๏ผŒๅ†ๆฌก่ฟ่กŒ็จ‹ๅบใ€‚

4. ไบคๆตๅ้ฆˆ

  • ๅฆ‚ๆžœๆ‚จๆœ‰ๅฅฝ็š„ๆƒณๆณ•๏ผŒๅฏไปฅๆissues
  • ๅฆ‚ๆžœๆ‚จๆƒณ่ดก็Œฎไปฃ็ ๏ผŒๅฏไปฅ่ฟ›่กŒfork
  • ๅฆ‚ๆžœๆ‚จๆœ‰ๅ…ถๅฎƒ้—ฎ้ข˜๏ผŒๅฏไปฅๆทปๅŠ QQ็พค๏ผˆๅ‚่€ƒ่”็ณปๆ–นๅผ๏ผ‰

5. ่”็ณปๆ–นๅผ

wechat Tencent QQ QQ Group Javaๅญ—่Š‚็ ไบคๆตQQ็พค

6. License

This project is licensed under the MIT License. See the LICENSE file for the full license text.

About

๐Ÿ› Java ASM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages