=============================================================== Inside world of Dalvik Executable Format v0.1 =============================================================== Author : bunseokbot@S.S.G. Contacts : http://blog.smishing.kr, admin@smishing.kr [À§ ¹®¼­´Â S.S.G ÇÁ·ÎÁ§Æ®ÀÎ DEX Disassembler °³¹ß °úÁ¤¿¡¼­ ÀÛ¼º µÈ DEX ÆÄÀÏ ³»ºÎ ±¸Á¶¿¡ °üÇÑ ¹®¼­ÀÔ´Ï´Ù.] =============================================================== 0x01. What is Dalvik? What is DEX File? =============================================================== Dalvik Virtual Machine (´Þºò °¡»ó ¸Ó½Å) ´Þºò °¡»ó ¸Ó½ÅÀ̶õ "·¹Áö½ºÅÍ ÇüÅÂ"ÀÇ ÀÓº£µðµå Ç÷§Æû¿¡ ÃÖÀûÈ­µÈ °¡»ó ¸Ó½ÅÀÌ´Ù. »ó´ëÀûÀ¸·Î ÀûÀº ¸Þ¸ð¸®¿¡¼­µµ µ¹¾Æ°¥ ¼ö ÀÖ´Ù. - Process isolation, Memory Management, Threading°ú °°Àº °æ¿ì¿¡ ¿î¿µÃ¼Á¦¿¡ ÀÇÁ¸ÇÏ´Â ÇüÅÂÀÌÁö¸¸ ¿©·¯°³ÀÇ Dalvik VM Instance °¡ µ¿½Ã¿¡ µ¹¾Æ°¥ ¼ö ÀÖ´Â °ÍÀÌ ÁÖ¿ä Ư¡ÀÌ´Ù. ÀÌ ¶§, VM¿¡¼­ ÀоîµéÀÌ°í Çؼ®ÇÒ ¼ö ÀÖ´Â ÆÄÀÏÀÌ DEX ÆÄÀÏÀÌ´Ù. DVM°ú °°Àº °æ¿ì¿¡´Â JVM°ú ´Þ¸® Java Bytecode¸¦ »ç¿ëÇÏÁö ¾Ê°í, JVMó·³ ½ºÅà ±â¹ÝÀÌ ¾Æ´Ñ ·¹Áö½ºÅ͸¦ ±â¹ÝÀ¸·Î ÇÏ°í ÀÖ´Ù. (ÇöÀç Android 5.0¿¡¼­´Â ART¸¦ Â÷¿ëÇؼ­ »ç¿ëÇÏ°í ÀÖ´Ù.) DEX ÆÄÀÏ°ú °°Àº °æ¿ì¿¡´Â ¾Æ·¡ ±¸Á¶¿Í °°ÀÌ APK ÆÄÀÏ ³» ÃÖ»óÀ§ µð·ºÅ丮¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. ----------------------------- bunseokbot.apk ----------------------------- - META-INF - assets - lib - res - AndroidManifest.xml - resources.arsc - classes.dex (*) ----------------------------- =============================================================== 0x02. Difference between JAR and DEX. =============================================================== ÈçÈ÷ DEX ÆÄÀÏÀ» ºÐ¼®ÇÏ·Á°í Çϸé dex2jar¸¦ ¶°¿Ã¸®±â ½±´Ù. ÀÌ ¶§¹®¿¡ DEXÆÄÀÏ°ú JARÆÄÀÏ°ú °°´Ù°í ¿ÀÇØÇÏ´Â »ç¶÷µéÀÌ ¸¹Àºµ¥ JAR ÆÄÀÏ°ú DEX ÆÄÀÏÀº ¾ö¿¬È÷ ´Ù¸¥ ÆÄÀÏÀÌ´Ù. ÀÏ´Ü JAR ÆÄÀÏ °°Àº °æ¿ì¿¡´Â ¾Æ·¡ ±¸Á¶¸¦ ¶ç°í ÀÖ´Ù. ----------------------------- bunseokbot.jar ----------------------------- - bunseokbot.class ---------------------- | Header | ---------------------- | Constant Pool | ---------------------- | Class | ---------------------- | Field | ---------------------- | method | ---------------------- | Attribute | ---------------------- ... classes ----------------------------- À§¿¡¼­µµ º¼ ¼ö ÀÖµíÀÌ °¢ class ¸¶´Ù °¢°¢ÀÇ ÆÄÀÏ ±¸Á¶¸¦ JAR ÆÄÀÏ ³»ºÎ¿¡ °¡Áö°í ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¶ÇÇÑ JAR ÆÄÀÏÀÇ ¸ÅÁ÷ ¹ÙÀÌÆ® ¸¦ º¸°Ô µÇ¸é "504b 0304" ÀÎ °ÍÀ» ÅëÇØ class ÆÄÀϵéÀ» ¾ÐÃàÇÑ ±¸Á¶ ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ±×·¯³ª ¾Æ·¡ÀÇ DEX ÆÄÀÏÀ» º¸¸é ----------------------------- bunseokbot.dex ----------------------------- - Header ----------------------------- - string_ids ----------------------------- - type_ids ----------------------------- - proto_ids ----------------------------- - fields ----------------------------- - methods ----------------------------- - classes ----------------------------- - Data ----------------------------- ÀÌ·¸°Ô JAR ÆÄÀÏ°ú´Â ´Þ¸® DEX ÆÄÀÏ¿¡¼­´Â ´ÜÀÏ ÆÄÀÏ¿¡¼­ °¢ Ư¡¸¶ ´Ù ¼½¼ÇÀ» °¡Áö´Â ±¸Á¶ÀÎ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ´Â DVMÀÌ ÃÖÀûÈ­µÈ ȯ°æ ÀÚü°¡ ÀûÀº ¸Þ¸ð¸® ÀÚ¿ø¿¡¼­µµ µ¹¾Æ°¥ ¼ö ÀÖ°Ô ÇÑ ±¸Á¶ ¶§¹®¿¡ ÀÌ·¸°Ô class º°·Î ±¸¿ªÀ» ÁöÁ¤ÇÏ´Â ¹æ½ÄÀÌ ¾Æ´Ñ ¼º°Ý¸¶´Ù ¼½¼ÇÀ» ºÐ¸®ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÏ°í ÀÖ´Ù. =============================================================== 0x03. DEX File Header Analysis =============================================================== DEX ÆÄÀÏÀº ¾Æ·¡¿Í °°Àº ±¸Á¶·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ----------------------------- DEX Header ----------------------------- - Magic Number (ubyte[8]) ----------------------------- - checksum (uint) ----------------------------- - signiture (ubyte[20]) ----------------------------- - file_size (uint) ----------------------------- - header_size (uint) ----------------------------- - endian_tag (uint) ----------------------------- - link_size (uint) ----------------------------- - link_off (uint) ----------------------------- - map_size (uint) ----------------------------- - map_off (uint) ----------------------------- - string_ids_size (uint) ----------------------------- - stirng_ids_off (uint) ----------------------------- - type_ids_size (uint) ----------------------------- - type_ids_off (uint) ----------------------------- - proto_ids_size (uint) ----------------------------- - proto_ids_off (uint) ----------------------------- - field_ids_size (uint) ----------------------------- - field_ids_off (uint) ----------------------------- - method_ids_size (uint) ----------------------------- - method_ids_off (uint) ----------------------------- - class_defs_size (uint) ----------------------------- - class_defs_off (uint) ----------------------------- - data_size (uint) ----------------------------- - data_off (uint) ----------------------------- ÀÏ´Ü Çì´õ¿¡´Â °¢ ¼½¼ÇÀÇ Àüü »çÀÌÁî¿Í offset °ªÀÌ uint format À¸·Î ÀúÀåµÈ´Ù. ÀÌ ºÎºÐÀ» ÀÌ¿ëÇؼ­ °¢ ¼½¼ÇÀ» ÆĽÌÇÒ ¶§ ¼±ÇàÀû À¸·Î ÀÌ °ªÀ» ¼±ÇàÀûÀ¸·Î ÆĽÌÇÏ¿© °ªÀ» ¹Þ¾Æ¿Í ÆĽÌÇÏ¸é µÈ´Ù. ÀÌ ÀÌ¿Ü¿¡µµ ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00 } dex\n035\0 ÇüÅÂÀÇ magic number °¡ Á¸ÀçÇÏ°í ±× µÚ¿¡´Â adler32 checksum °ª°ú sha1 signiture°¡ Á¸ÀçÇÑ´Ù. ÀÌ ºÎºÐÀº DVM¿¡ ¿Ã¶ó°¡±â Àü¿¡ ¾Èµå·ÎÀ̵å PackageManager ¿¡¼­ ¹«°á¼º °Ë»ç¸¦ ÁøÇàÇÒ¶§ ÀÌ ºÎºÐ°ú Àüü ºÎºÐÀ» °Ë»çÇÏ°Ô µÈ´Ù. ¿©±â¼­ checksum ¿¡¼­´Â checksum°ú magic number°¡ Á¦¿ÜµÈ °ª¿¡ ´ëÇÑ checksum °ªÀÌ ÀúÀåµÇ¸ç, signiture¿¡´Â signiture ÀÌÈÄÀÇ ¼½¼Ç (= file_size ¼½¼ÇºÎÅÍ)ÀÇ signiture°ªÀ» °è»êÇÏ¿© ÀúÀåÇÑ´Ù. checksum = adler32(Header Section - magic number - checksum) signiture = H(Header - magic number - checksum - signiture) =============================================================== 0x04. DEX File Section Analysis =============================================================== DEX ÆÄÀÏ¿¡´Â °¢ Ư¡¸¶´Ù °íÀ¯ÀÇ ¼½¼ÇÀ» °¡Áö°í ÀÖ´Ù. - string_ids DEX ÆÄÀÏ ³»¿¡¼­ »ç¿ëÇÏ´Â ¸ðµç ¹®ÀÚ¿­À» ÀúÀåÇÏ´Â ¿µ¿ªÀÌ´Ù. - type_ids string_ids ¿µ¿ª¿¡ ÀúÀåµÈ ¹®ÀÚ¿­ÀÇ ¼º°ÝÀ» ÀúÀåÇÏ°í ÀÖ´Â ¿µ¿ªÀÌ´Ù. - proto_ids DEX ÆÄÀÏ ³»¿¡¼­ ÇÔ¼öÀÇ ±¸Á¶¸¦ ÀúÀåÇÏ°í ÀÖ´Â ¿µ¿ªÀÌ´Ù. - field_ids Ŭ·¡½ºÀÇ À̸§, type, class package À̸§À» ÀúÀåÇÏ´Â ¿µ¿ªÀÌ´Ù. - method_ids methodÀÇ À̸§, type, ¼Ò¼Ó class À̸§À» ÀúÀåÇÏ´Â ¿µ¿ªÀÌ´Ù. - class_defs_item class ¿¡ ´ëÇÑ ÀüüÀûÀÎ Á¤º¸¿Í µ¥ÀÌÅÍ¿¡ ´ëÇÑ ±âÃÊ Á¤º¸¸¦ ÀúÀåÇÏ ´Â ¿µ¿ªÀÌ´Ù. ±âŸ À̺¸´Ù ´Ù¾çÇÑ ¿µ¿ªµéÀÌ Á¸ÀçÇÏÁö¸¸ À§ ³»¿ë¿¡¼­ ºÐ¼®ÇÒ ÁÖÁ¦ ¿Í´Â Å©°Ô °ü·ÃÀÌ ¾øÀ¸¹Ç·Î »ý·«ÇÏ¿´´Ù. ÀÌ·¸°Ô ´Ù¾çÇÑ ¿µ¿ªÀÌ Á¸ÀçÇÏ´Â DEX ÆÄÀÏÀº ÀоîµéÀÏ ¶§ Çì´õ¿¡¼­ À§ ¼½¼Ç¿¡ ´ëÇÑ Á¤º¸¸¦ ã¾Æ °¡Á®¿Ã ¼ö ÀÖ´Ù. =============================================================== 0x07. Deep DEX File Analysis =============================================================== DEX ÆÄÀÏÀ» ÀÌÇØÇϱâ Àü¿¡ ÀÏ´Ü °£´ÜÇÑ ¾Èµå·ÎÀÌµå ¾Û °³¹ß °úÁ¤¿¡ ´ëÇؼ­ ¼³¸íÇÏ·Á°í ÇÑ´Ù. MyActivity.java ---------------------------------------------------- package kr.smishing.bunseokbot; import android.app.Activity; import android.util.Log; public class MyActivity extends Activity { @Override public void onCreate(Bundle bundle){ super.onCreate(bundle); setContentView(R.layout.bunseokbot); Log.i(TAG, "Testing Activity"); } } ---------------------------------------------------- À§ÀÇ Äڵ带 ÅëÇؼ­ °¢ DEX ¿µ¿ª¿¡¼­´Â ¾Æ·¡ÀÇ ³»¿ëµéÀÌ ÀúÀåµÈ´Ù. * string_ids ¿µ¿ª À§¿¡¼­ »ç¿ëµÈ ¸ðµç ¹®ÀÚ¿­Àº ¿©±â¿¡ ÀúÀåµÈ´Ù. Landroid/util/Log; Landorid/app/Activity; Testing Activity ÀÌ·¸°Ô Class¿¡ ´ëÇÑ Á¤º¸³ª, const-string °ú °°Àº string value ¿¡¼­ »ç¿ëÇÏ´Â °ªµµ ¸ðµÎ ÀÌ ¿µ¿ª¿¡ ÀúÀåµÈ´Ù. Áï a.java ¶ó´Â ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù°í Çϸé ÀÌ ÆÄÀÏ¿¡ ½áÁø ¸ðµç ³»¿ë Àº ÀÌ ¿µ¿ª¿¡ ÀúÀåµÈ´Ù. * type_ids ¿µ¿ª ´Ü¼øÈ÷ string_ids ¿µ¿ª¿¡ ÀúÀåµÇ¾ú´Ù°í Çؼ­ ¸ðµÎ string ÇüÅ´ ¾Æ´Ï´Ù. ¿©±â¿¡ ÀúÀåµÈ º¯¼ö typeÀº ¸ðµÎ ÀÌ ¿µ¿ª¿¡ ÀúÀåµÈ´Ù. int, string, char, array µî string_ids ¿µ¿ª¿¡ ÀúÀåµÈ ³»¿ëÀÇ ¼º°ÝÀ» ´ãÀº °á°ú¸¦ ¸®ÅÏÇÑ´Ù. ¿©±â¿¡ ÀúÀåµÇ´Â °ªÀÇ Á¾·ù´Â ¾Æ·¡¿Í °°´Ù. TypeDescriptor ¡æ 'V' | FieldTypeDescriptor FieldTypeDescriptor ¡æ NonArrayFieldTypeDescriptor | ('[' * 1¡¦255) NonArrayFieldTypeDescriptor NonArrayFieldTypeDescriptor¡æ 'Z' | 'B' | 'S' | 'C' | 'I' | 'J' | 'F' | 'D' | 'L' FullClassName ';' * proto_ids ¿µ¿ª proto_ids ¿µ¿ª¿¡´Â ¸Þ¼Òµå¿¡ ´ëÇÑ Á¤º¸°¡ ÀúÀåµÈ´Ù. ÀÌ ¿µ¿ª ÇϺΠ±¸Á¶·Î´Â ¼¼ °¡Áö ±¸Á¶·Î µÇ¾îÀÖ´Ù. - shorty_idx (ÆÄÀÏ Å¸ÀÔ¿¡ ´ëÇÑ Á¤º¸¸¦ string_ids ¿¡¼­ ºÒ·¯¿Â´Ù.) - return_type_idx (return type¿¡ ´ëÇÑ Á¤º¸¸¦ ºÒ·¯¿Â´Ù.) - parameter_off (ÆĶó¹ÌÅÍ¿¡ ´ëÇÑ Á¤º¸¸¦ ºÒ·¯¿Â´Ù. ÀÌ ¶§ ÀÌ °ªÀÌ 0 ÀÎ °æ¿ì´Â void)·Î ó¸®ÇÑ´Ù. =============================================================== 0x08. Addressing inside DEX File =============================================================== ÀÏ´Ü ÀÌ ºÎºÐÀ» ÀÌÇØÇÏ°í ³­ ÈÄ¿¡´Â ´Ù¸¥ ºÎºÐÀº ¼Ò½º¸¦ ÀÌ·ç±â À§ÇÑ ±âÃÊ ´Ü°èÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ±âÃÊ ´Ü°èÀÌÀÚ Åä´ë°¡ µÇ´Â Section Áß¿¡¼­ °¡Àå Áß¿äÇÑ class_defs_item À̶ó´Â ¼½¼Ç°ú data ¼½¼Ç¿¡ ´ëÇؼ­ ¼³¸íÇÒ·Á°í ÇÑ´Ù. ÀÏ´Ü class_defs_itemÀÇ »ó¼¼ ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù. <±¸Á¶µµ ±×¸®±â ±ÍÂú´Ù> ÀÌ ¼¼ ºÎºÐÀÌ °¢°¢ class¿¡ ÇØ´çÇÏ´Â ÄÚµå À§Ä¡¸¦ ÁöÁ¤ÇÑ´Ù. Disassembler¸¦ Á¦ÀÛÇÒ ¶§ ÀÌ ºÎºÐÀ» Âü°íÇÏ¿© Address °ªÀ» °¡Á®¿Â µÚ¿¡ ÇØ´ç À§Ä¡·Î À̵¿ÇÏ¿© Äڵ带 Çؼ®Çϸé Çؼ®ÇÒ ¼ö ÀÖ´Ù. - À̸¦ ÀÀ¿ëÇϸé Taint Analysis ¸¦ ÁøÇàÇϴµ¥ ¸¹Àº µµ¿òÀÌ µÈ´Ù. =============================================================== 0x09. Main Instructions =============================================================== Dalvik VM ¿¡¼­ Çؼ®ÇÒ ¼ö ÀÖ´Â Instruction Àº ±²ÀåÈ÷ ´Ù¾çÇϸç, ¶Ç ´Ù¾çÇÑ Condition ÀÏ ¶§ »ç¿ëµÈ´Ù. ±×·¯³ª Á¤¸®ÇÏÀÚ¸é ¾Æ·¡¿Í °°´Ù. ºí¶óºí¶óºí¶óºí¶ó ÀÌ·¯ÇÑ ÀνºÆ®·°¼ÇÀº ÀÎÀÚ·Î ¹Þ´Â °ªÀÇ TypeÇü¿¡ ¸¹ÀÌ Á¾¼ÓµÇ´Âµ¥ Å©°Ô ¾Æ·¡¿Í °°Àº TypeÀ» handling ÇÒ ¼ö ÀÖ´Ù. 4 8 16 32 ÀÌ·¯ÇÑ Instruction SetÀ» dict ÇüÅ·ΠÁ¤¸®ÇØ ºÐ¼®Çϸé ÄÚµå µ¥ÀÌÅÍ ¸¦ disassembling ÇÒ ¼ö ÀÖ´Ù. =============================================================== 0x10. Reference =============================================================== http://smishing.kr [¾Èµå·ÎÀÌµå ¾Ç¼ºÄÚµå ÀÚµ¿È­ ºÐ¼®] Best of the Best 3rd Advanced Project (S.S.S - Team 2) [Static Analysis Technique of Dalvik Executable Format File] (¾È³», À§ ¹®¼­´Â ºñ°ø°³ ¹®¼­ÀÓÀ» ¾Ë¸³´Ï´Ù.) https://source.android.com/devices/tech/dalvik/dex-format.html http://developer.android.com/reference/dalvik/system/DexFile.html http://blog.smishing.kr ===============================================================