±à¼ÍƼö: |
½éÉÜÁË Android App³£¼û±£»¤·½·¨¼°Æä¶ÔÓ¦µÄÄæÏò·ÖÎö·½·¨£¬ÒÔ¼°·ÖÎöÁ˳£¼ûµÄ¼Ó¹Ì·½°¸ÔÀíÓë¶Ô¿¹·½·¨¡£
±¾ÎÄÀ´×ÔÓÚÍøÒ×Ò×¶Ü£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
°²×¿APP°²È«°üº¬ºÜ¶àÄÚÈÝ£¬±¾´Î·ÖÏíÁË»ìÏý´úÂë¡¢ÕûÌåDex¼Ó¹Ì¡¢²ð·Ö
Dex ¼Ó¹Ì¡¢ÐéÄâ»ú¼Ó¹ÌµÈ·½Ãæ¡£ÊÂʵÉÏ£¬ÕâЩÄÚÈÝÒ²ÊǹúÄÚ½ü¼¸ÄêAndroid App°²È«±£»¤µÄÒ»ÖÖÖ÷ÒªÇ÷ÊÆ¡£
Ò»¡¢»ìÏý´úÂë
Java´úÂëÊǷdz£ÈÝÒ×·´±àÒëµÄ£¬×÷ΪһÖÖ¿çÆ½Ì¨µÄ¡¢½âÊÍÐÍÓïÑÔ£¬Java Ô´´úÂë±»±àÒë³ÉÖм䡰×Ö½ÚÂ롱´æ´¢ÓÚclassÎļþÖС£ÓÉÓÚ¿çÆ½Ì¨µÄÐèÒª£¬ÕâЩ×Ö½ÚÂë´øÓÐÐí¶àµÄÓïÒåÐÅÏ¢£¬ºÜÈÝÒ×±»·´±àÒë³ÉJavaÔ´´úÂ롣ΪÁ˺ܺõر£»¤JavaÔ´´úÂ룬¿ª·¢ÕßÍùÍù»á¶Ô±àÒëºÃµÄclassÎļþ½øÐлìÏý´¦Àí¡£
»ìÏý¾ÍÊǶԷ¢²¼³öÈ¥µÄ³ÌÐò½øÐÐÖØÐÂ×éÖ¯ºÍ´¦Àí£¬Ê¹µÃ´¦ÀíºóµÄ´úÂëÓë´¦Àíǰ´úÂëÍê³ÉÏàͬµÄ¹¦ÄÜ£¬¶ø»ìÏýºóµÄ´úÂëºÜÄѱ»·´±àÒ룬¼´Ê¹·´±àÒë³É¹¦Ò²ºÜÄѵóö³ÌÐòµÄÕæÕýÓïÒå¡£ProGuard¾ÍÊÇÒ»¸ö»ìÏý´úÂëµÄ¿ªÔ´ÏîÄ¿£¬Äܹ»¶Ô×Ö½ÚÂë½øÐлìÏý¡¢Ëõ¼õÌå»ý¡¢ÓÅ»¯µÈ´¦Àí¡£
Proguard´¦ÀíÁ÷³ÌͼÈçÏÂËùʾ£¬°üº¬Ñ¹Ëõ¡¢ÓÅ»¯¡¢»ìÏý¡¢Ô¤¼ìËĸöÖ÷Òª»·½Ú£º

ѹËõ£¨Shrink£©£º¼ì²â²¢ÒƳý´úÂëÖÐÎÞÓõÄÀà¡¢×ֶΡ¢·½·¨ºÍÌØÐÔ£¨Attribute£©£»
ÓÅ»¯£¨Optimize£©£º¶Ô×Ö½ÚÂë½øÐÐÓÅ»¯£¬ÒƳýÎÞÓõÄÖ¸Áî¡£ÓÅ»¯´úÂ룬·ÇÈë¿Ú½ÚµãÀà»á¼ÓÉÏprivate/static/final£¬Ã»ÓÐÓõ½µÄ²ÎÊý»á±»É¾³ý£¬Ò»Ð©·½·¨¿ÉÄÜ»á±ä³ÉÄÚÁª´úÂ룻
»ìÏý£¨Obfuscate£©£ºÊ¹ÓÃa¡¢b¡¢c¡¢dÕâÑù¼ò¶Ì¶øÎÞÒâÒåµÄÃû³Æ£¬¶ÔÀà¡¢×ֶκͷ½·¨½øÐÐÖØÃüÃû£»
Ô¤¼ì£¨Preveirfy£©£ºÔÚJavaƽ̨É϶Դ¦ÀíºóµÄ´úÂë½øÐÐÔ¤¼ì£¬È·±£¼ÓÔØµÄclassÎļþÊÇ¿ÉÖ´Ðеġ£
ÔÚ·ÖÏíÖУ¬ÖÓÑÇÆ½Õ¹Ê¾ÁËÀûÓÃProguard£¬¶ÔDex2jar½øÐз´±àÒë´¦ÀíºóµÄApkЧ¹ûʾÀý£º

Proguard ´¦Àíǰ

Proguard´¦Àíºó
Proguard»ìÏýÆ÷²»½öÄܹ»±£»¤´úÂ룬¶øÇÒÄܹ»¾«¼ò±àÒëºóµÄ³ÌÐò´óС£¬¼õÉÙÄÚ´æÕ¼Óá£
»ìÏý´úÂëÄæÏò·ÖÎö
Èç¹ûÏëÒª·´±àÒë»ìÏý´úÂ룬ÖÓÑÇÆ½·ÖÏíÁËÒ»¸ö¹úÍâµÄ¹¤¾ßDEGUADR£¬ËüÄܹ»Í¨¹ýͳ¼ÆµÄ·½Ê½À´½â»ìÏý¡£ËäÈ»Õâ¸ö¹¤¾ßµÄÕýÈ·ÂÊ´ï²»µ½100%£¬µ«ÊÇÄÜÔÚÒ»¶¨³Ì¶ÈÉϰïÖú·´±àÒë´úÂë¡£

ʹÓÃDEGUADR½â»ìÏýµÄʾÀý£º

com.xxxxx.common.util.CryptoUtilÍøÕ¾Ò²ÌṩÁËÒ»ÖÖ·´±àÒë·þÎñ£¬ÈçÏÂËùʾ£º
java.lang.String a(byte[]) -> encodeToString
java.lang.String a(byte[],boolean,java.lang.String)
-> a
byte[] a(byte[],byte[]) -> encrypt
byte[] b(byte[]) -> getKey
byte[] b(byte[],byte[]) -> decrypt
byte[] d(java.lang.String) -> getKey
java.lang.String a(byte,char[]) -> a
java.lang.String a(java.io.File) -> getHash
java.lang.String a(java.lang.String) -> c
java.lang.String b(java.lang.String) -> encode
¶þ¡¢ÕûÌåDex¼Ó¹Ì
ΪÁ˼ÓÇ¿Android±£»¤Ç¿¶È£¬Ëæ×Ű²È«¼¼ÊõµÄ·¢Õ¹£¬ÓÖ³öÏÖÁËÐÂÐ͵ġ°¼Ó¹Ì¼¼Êõ¡±¡£DEX¼Ó¹ÌÊǶÔDEXÎļþ½øÐмӿǷÀ»¤£¬·ÀÖ¹±»¾²Ì¬·´±àÒ빤¾ßÆÆ½â¶øÐ¹Â¶Ô´Â룬×î¸Õ¿ªÊ¼³öÏÖµÄÊÇÕûÌå¼Ó¹Ì¼¼Êõ·½°¸¡£

ÕûÌå¼Ó¹Ì¼¼ÊõµÄÔÀíÈçÉÏËùʾ£¬°üÀ¨Ìæ»»application/classes.dex¡¢½âÃÜ/¶¯Ì¬¼ÓÔØÔclasses.dex¡¢µ÷ÓÃÔapplicationÏà¹Ø·½·¨¡¢½«Ôapplication¶ÔÏó/Ãû³ÆÉèÖõ½ÏµÍ³ÄÚ²¿Ïà¹Ø±äÁ¿ËÄ´ó»·½Ú¡£ÆäÖÐ×îΪ¹Ø¼üµÄÒ»²½¾ÍÊǽâÃÜ/¶¯Ì¬¼ÓÔØÔclasses.dex£¬Í¨¹ý¼ÓÃܱàÒëºÃµÄ×îÖÕdexÔ´ÂëÎļþ£¬È»ºóÔÚÒ»¸öÐÂÏîÄ¿ÖÐÓÃÐÂÏîÄ¿µÄapplicationÆô¶¯À´½âÃÜÔÏîÄ¿´úÂë²¢¼ÓÔØµ½ÄÚ´æÖУ¬Ôٰѵ±Ç°½ø³ÌÌæ»»Îª½âÃܺóµÄ´úÂ룬Äܹ»ºÜºÃµØÒþ²ØÔ´Âë²¢·ÀÖ¹Ö±½ÓÐԵķ´±àÒë¡£
ÕûÌåDex¼Ó¹ÌÄæÏò·ÖÎö
ÕûÌåDex¼Ó¹ÌÄæÏò·ÖÎöÓÐÁ½ÖÖ³£Óõķ½·¨¡£ÆäÒ»ÊÇÔÚÄÚ´æÖб©Á¦ËÑË÷ dex\n035£¬ÔÙ dump¡£ÒÔÏÂÊÇÔÚ32λϵͳÖеÄЧ¹ûʾÀý£º

ÁíÒ»ÖÖ·½·¨¾ÍÊÇͨ¹ýHook dvmDexFileOpenPartial(void* addr, int
len, DvmDex**)¡£
Èý¡¢²ð·ÖDex¼Ó¹Ì
Ëæ×ÅÒµÎñ¹æÄ£·¢Õ¹µ½Ò»¶¨³Ì¶È£¬²»¶ÏµØ¼ÓÈëй¦ÄÜ¡¢Ìí¼ÓеÄÀà¿â£¬´úÂëÔÚ¼±¾çÅòÕ͵Äͬʱ£¬ÏàÓ¦µÄapk°üµÄ´óСҲ¼±¾çÔö¼Ó£¬ÄÇô¼òµ¥µÄÕûÌå¼Ó¹Ì·½°¸¾Í²»ÄܺܺõØÂú×㰲ȫÐèÇó£¬ÔÚÕûÌå¼Ó¹Ì·½°¸Ö®ÍâÓÖ³öÏÖÁ˲ð·Ö¼Ó¹ÌµÄ¼¼Êõ·½°¸¡£

µ«ÊÇÈçÉÏËùʾ£¬dexÎļþÔÚ¼Ó¹Ìʱ£¬Õë¶ÔÖмäȱʧµÄÒ»²¿·ÖÊý¾Ý»áÒÔ½âÃܺóµÄÊý¾ÝÀ´Ìæ»»£¬ÓеÄʱºòÕâÖÖ²ð·ÖÌæ»»Ò²»áµ¼ÖÂÊý¾Ý²»×¼È·¡£ÄÇôµ½µ×Ó¦¸Ã²ð·ÖʲôÑùµÄÊý¾ÝÄØ£¿¾ÍÐèÒªÁ˽âÒ»ÏÂdexÎļþµÄÊý¾Ý½á¹¹¡£
DexÎļþ½á¹¹¼«Îª¸´ÔÓ£¬ÒÔÏÂͼʾѡȡÁËÆäÖнÏÎªÖØÒªµÄÄÚÈÝ¡£ÊÂʵÉÏ£¬dexÎļþÊÇÒ»¸öÒÔclassΪºËÐÄ×é×°ÆðÀ´µÄÎļþ£¬ÆäÖÐ×îÖØÒªµÄÊÇclassdataºÍclasscodeÁ½²¿·Ö£¬ÓÐÆäÌØ¶¨µÄ½Ó¿ÚºÍÖ¸ÁîÊý¾Ý£¬Ñ¡È¡ÕâÁ½²¿·ÖÀ´²ð·ÖµÄ»°£¬¼´Ê¹²ð·Ö³öÀ´Ò²²»»áй¶classÊý¾ÝºÍ×Ö½ÚÂëÊý¾Ý£¬·´±àÒë³öÀ´Ò²²»ÍêÕû£¬°²È«ÐԽϸߡ£

²ð·ÖDex¼Ó¹ÌÄæÏò·ÖÎö
¶ÔÓÚdex²ð·Ö¼Ó¹ÌµÄÄæÏò·ÖÎö£¬ÈçÏÂËùʾ£¬¿ÉÒÔÓÃclassdataÌæ»»´Ó¶ø×é×°³ÉеÄdexÎļþ£¬ËäÈ»ºÍÔÀ´µÄdexÎļþ²»»áÍêȫһÖ£¬µ«Ò²ÔÚÒ»¶¨³Ì¶ÈÉϸ´ÔÁ˱»²ð·ÖÊý¾ÝµÄÑù×Ó¡£

µ«Òª×¢ÒâµÄÊÇ£¬ÕâÖÖ·½·¨½öÊÊÓÃÓÚ±»²ð·Ö³öÈ¥µÄÊý¾Ý±äÐÎÒ»´ÎÐÔÍê³É£¬Ò²¾ÍÊÇ˵£¬ÔÚÓÐÆäËû±£»¤Ë¼Â·µÄÇé¿öϾ¡Á¿±ÜÃâʹÓ㬶øÇÒ¼´Ê¹ÓÐÐèÒªÒ²¾¡Á¿Ñ¡ÔÚÓõ½Õâ¸öÀàµÄʱºò²ÅÈ¥»Ö¸´¡£
´ËÍ⻹ÓÐÒ»¸ö¸üµ×²ãһЩµÄ¹¤¾ßdexhunter£¬Õâ¸ö¹¤¾ß½ÏΪǰÎÀ£¬µ«Í¬Ê±Ò²ÓÐһЩ¾ÖÏÞÐÔ£¬Æ©È粿·ÖÖ¸ÁîÊý¾Ý»á±»ÓÅ»¯£¬ÐγɵĴúÂë½çÃæ²»ÊǺÜÃÀ¹ÛµÈµÈ¡£

ËÄ¡¢ÐéÄâ»ú¼Ó¹Ì
ÐéÄâ»ú¼Ó¹ÌÒ²ÊôÓÚdex²ð·Ö¼Ó¹ÌµÄÒ»ÖÖ£¬ËüÊǶÔ×Ö½Ú×öÁËһЩ±ä»¯´¦Àí¡£ÈçÏÂËùʾ£¬ÕâÊÇÒ»¸öÕý³£°²×¿ÏµÍ³ÖеĴúÂ룬ÔÚÆäÖнøÐÐÁËÐéÄâ»ú¼Ó¹Ì²Ù×÷£º

ÒÔadd-int v0, v1, v2¡¢sub-int v0, v1, v2¡¢mul-int v0,
v1, v2ÕâÈýÌõÖ¸Áî½øÐÐÌæ»»£¬È»ºó½øÐмӹ̱àÒ룬ÕâÑù×Ó²Ù×÷ºó£¬¼´Ê¹°ÑÌæ»»ºóµÄÊý¾Ý»Ö¸´ÁË£¬Ò²²»»á
ÐéÄâ»ú¼Ó¹ÌÄæÏò·ÖÎö¡ªHOOK JNI ½Ó¿Ú
ÕâÖÖ·½Ê½ÏµÄÄæÏò·ÖÎö£¬Ò»·½Ãæ¿ÉÒÔͨ¹ýHOOK JNI ½Ó¿ÚÀ´ÊµÏÖ£¬ËüÓÐÁ½ÖÖʵÏÖ·½Ê½¡£
ÆäÒ»ÊÇÀà³ÉÔ±/¾²Ì¬±äÁ¿²Ù×÷Ïà¹Ø½Ó¿Ú£¬±ÈÈ磺
GetStaticDoubleField SetStaticDoubleField GetDoubleField
SetDoubleField ¡
(byte, object, int, long¡)
Æä¶þÊÇ·´Éäµ÷ÓÃÀà·½·¨£¬±ÈÈ磺
CallVoidMethodA CallBooleanMethodA CallShortMethodA
CallObjectMethodA ¡
CallStaticVoidMethodA CallStaticBooleanMethodA CallStaticShortMethodA
CallStaticObjectMethodA ¡
(byte, int, long, double ¡)
CallObjectMethodA(JNIEnv * env, jobject object, jmethoID
method, ¡)

ͨ¹ýHOOK JNI ½Ó¿ÚʵÏÖÐéÄâ»ú¼Ó¹ÌÄæÏò·ÖÎö
ͨ¹ýHOOK JNI ½Ó¿Ú²»ÓÃÄæÏòµ×²ã£¬¾Í¿ÉÒÔÁ˽âAPP´óÖµĵ÷ÓÃÁ÷³Ì¡£µ«ÊǶÔÓÚ¸´Ôӵĵ÷Óùý³Ì£¬»òÕßÐéÄ⻯·½·¨ÊýÁ¿½Ï¶àµÄÇé¿ö£¬ÕâÖÖÄæÏò·ÖÎöÊֶο´ÆðÀ´»á±È½Ï»ìÂÒ£»¶ÔÓÚ²»ÐèÒª·µÉäµ½Java²ãÖ´ÐеÄÖ¸ÁÈçËãÊõ¡¢Âß¼ÔËËãµÈ£¬ÔòÎÞ·¨¼à¿Øµ½¡£
ÐéÄâ»ú¼Ó¹ÌÄæÏò·ÖÎö¡ª·ÖÎöÖ¸Áî²Ù×÷ÂëÓ³Éä
ÁíÒ»·½Ã棬Ҳ¿ÉÒÔͨ¹ý·ÖÎöÖ¸Áî²Ù×÷ÂëÓ³ÉäÀ´ÄæÏò·ÖÎö¡£ÔÚͬһ¼Ó¹Ì°æ±¾£¬»òÕßÓ³Éä¹ØÏµÏàͬµÄÇé¿öÏ£¬¿ÉÒÔ²ÉÈ¡ÒÔÏÂËùʾµÄ·½·¨£º

µ«ÔÚʵ¼ÊÇé¿öÖУ¬Ã¿´Î¼Ó¹ÌʱµÄÓ³Éä¹ØÏµ¶¼ÊÇËæ»ú±ä»¯µÄ£¬ÈçÏÂËùʾ£¬ÕâÖÖÇé¿öϾÍÎÞ·¨Ö±½Ó½¨Á¢Ó³Éä¹ØÏµ¡£

²»ÒÀÀµÓÚ²Ù×÷ÂëµÄÓ³Éä¹ØÏµÖ»ÓëÐéÄâ»ú½á¹¹Óйأ¬ËùÒÔÐèÒª¸ù¾ÝÆ«ÒÆ¹ØÏµ½¨Á¢Ó³Éä¹ØÏµ£¬´Ó¶ø½øÐÐÄæÏò·ÖÎö¡£


ÒÔÉϾÍÊǴ˴Ρ¶°²×¿APPÄæÏòÓë±£»¤¡·Ö÷ÌâµÄÈ«²¿·ÖÏíÄÚÈÝ¡£
|