ã³ãã³ãjava -Xmx512m -jar baksmali.jar -a -d -o Phone -x Phone.apk
â API Android. JB â 16
â , .
, Phone\com\android\phone\util\VoiceRecorderHelper.smali
䜿çšããŠãDalvikã³ãŒãã®åã«è§£æãããã¡ã€ã«ãjava -Xmx512m -jar baksmali.jar -a -d -o Phone -x Phone.apk
â API Android. JB â 16
â , .
, Phone\com\android\phone\util\VoiceRecorderHelper.smali
java -Xmx512m -jar baksmali.jar -a -d -o Phone -x Phone.apk
â API Android. JB â 16
â , .
, Phone\com\android\phone\util\VoiceRecorderHelper.smali
.field public static final IS_INCALL_RECORDING_ENABLE:Z = false
ã« .field public static final IS_INCALL_RECORDING_ENABLE:Z = true
ãã¡ã€ã«ãæ»ãïŒ java -Xmx512m -jar smali.jar -a 16 Phone -o classes.dex
å
ã®ãã¡ã€ã«ã®çµæã®classes.dexãã¢ãŒã«ã€ããŒã«çœ®ãæããŸã
é»è©±ã§Phone.apkãæžãæãã
ããã€ãã®é話ã®é²é³ããã¹ããããšãããé»è©±ã¯æšæºã®å
èµãã€ã¹ã¬ã³ãŒããŒã§äŒè©±ãé²é³ãããšåæã«ãéåžžã«éåžžã«é«å質ã§é²é³ããããšãããããŸããã ãã¡ã€ã«ã®ååã¯èªåçã«çæãããé話è
ã®çªå·ãŸãã¯ååãããã³éè©±ã®æ¥æãå«ãŸããŸãã ãã¡ã€ã«ä¿å圢åŒã¯ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ãèšå®ã§ããŸãã ãããã®é話èšé²ãå¿
èŠãªã®ã¯ãªãã§ããïŒ
ãŸããæåã«ãããã¯éåžžã«äŸ¿å©ã§ãã ç§ã®åŠ»ã¯ã賌å
¥ãã補åã®ãªã¹ããåŒã³åºããŠèšã£ãããé²é³ããå Žæã¯ãªãã®ã§ãã¬ã³ãŒããŒã圹ç«ã¡ãŸãã
第äºã«ãé»è©±ã§ç§ã¯ã¯ã©ã€ã¢ã³ãã顧客ãšè©±ããªããã°ãªããŸãããæã«ã¯ãå¿
èŠã§éèŠãªæ
å ±ãçŽå€±ããããèãããªãã£ããããããšããããŸãã ãŸãã¯ãéèŠãªäŒè©±ãè¡ããããšããŸããããéèŠãªäŒè©±ãèããŠåæããã¿ã€ã ãªãŒãªæ±ºå®ãäžãããããžãã¹ããŒãããŒãä»ã®äººãšè¡åãèµ·ããå¿
èŠããããŸãã
第äžã«ãä»äºãšç掻ã«ãããéåžžã«äŸ¿å©ãªèšŒæ ããŒã¹ã
ãŸãããµãŒãããŒãã£ã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããªãçç±ãå°ããããšãã§ããŸãããµãŒãããŒãã£ã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ããªãŒãã³ã§ç¡æã®ã¢ã¯ã»ã¹ããããããããŸããïŒ
- ãµãŒãããŒãã£ã®ãã¹ããããŠããªãã¢ããªã±ãŒã·ã§ã³ãä¿¡é ŒããŠããŸããã å€ãã®å Žåããããã®åã¢ããªã±ãŒã·ã§ã³ã¯æºåž¯é»è©±ã®ã¡ã¢ãªã§çµ¶ãããã³ã°ã¢ããããããã»ããµæéãæ¶è²»ãããããããããªãŒãäžè¶³ããŸãã
- é²é³å質ã¯ãåžžã«çŽæããããã®ãšäžèŽãããšã¯éããŸããã
- ç§ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠå¥œãå«ãããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã¯è±å¯ãããããŸããããGUIãç§ã«ãšã£ãŠéœåãæªãå Žåã¯ã䜿çšããŸããã æ®å¿µãªããšã«ãå€ãã®åœå
ã®çºå±ã¯ããã«æ¬ ããŠããŸãã
ããã¯ã©ã®ããã«æ©èœããŸããïŒ
ãã¹ãŠã®Androidéçºè
ã¯ãã·ã¹ãã ãããŸããŸãªæšæºãããŒããã£ã¹ãã¡ãã»ãŒãžã§ãã£ã±ãã§ããããšãç¥ã£ãŠããŸãã ã·ã¹ãã ã§äœãèµ·ãã£ãŠãããã®ãããªã¡ãã»ãŒãžã®ããã®ãåä¿¡è
ãå®è£
ããŠããã°ãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ãåä¿¡ã§ããŸãã ãããŒããã£ã¹ãã¡ãã»ãŒãžãäœæã§ããŸãããã®ã¡ãã»ãŒãžã®åä¿¡è
ã®ã¿ããã¢ããªã±ãŒã·ã§ã³èªäœãŸãã¯äœæããã¢ããªã±ãŒã·ã§ã³å
šäœãšãªããäœããã®æ¹æ³ã§ãã®ã¡ãã»ãŒãžãåŠçããŸãã GoDialerãšGoSMSProã§å®éã«ãããèŠãŸããã
ãµãŒãããŒãã£ã®é話é²é³ã¢ããªã±ãŒã·ã§ã³ãåãããã«æ©èœããŸãã é話ã確ç«ããããšããã¡ãã»ãŒãžãæž¡ããããšããã«ãé²é³ãéå§ãããŸãã åŒã³åºãã忢ãããšãèšé²ã忢ãããããã¡ããã¡ã€ã«ã«æžã蟌ãŸããŸãã
ç§ã®ä»äºã¯ããã®ã¡ãã»ãŒãžã圢æãŸãã¯åŠçãããå ŽæãèŠã€ããäžå¿
èŠãªãžã§ã¹ãã£ãŒãããã«é話ã®é²é³ã匷å¶çã«éå§ããããšã§ããã çµå±ã®ãšããã黿ºãå
¥ããã®ãå¿ããããåã«æéããªãããšããããããŸãã 倧éã®ãã¡ãŒã ãŠã§ã¢ã³ãŒãã§é©åãªå Žæãäžè¬çã«èŠã€ããæ¹æ³ã¯ã次ã®èšäºã®ãããã¯ã§ãããä»ã¯ãç§ãã¡ã®å Žæãã«é²ã¿ãŸãããã
ãã³ãã©ãŒããŸãã¯2ã€ã¯ããã¡ã€ã«\ com \ android \ phone \ CallNotifier.javaã«ãªããŸãã
Javaã®Dalvikããã®éã³ã³ãã€ã«ãããã³ãŒãïŒããã§ã¯ã³ãŒãã®äžéšã®ã¿ã瀺ããŸãïŒã¯ã次ã®ããã«ãªããŸããã
private void onCallConnected(AsyncResult paramAsyncResult) { Connection localConnection = (Connection)paramAsyncResult.result; String str = ((IfConnection)localConnection).getDialString(); VLog.d("onCallConnected() dialed number:" + str); removeMessages(120000); removeMessages(120001); this.mIsEccNeedRetry = false; this.mEccIsSwitchingForRetrying = false;
ãããŠ
private void onDisconnect(AsyncResult paramAsyncResult) { Phone.State localState = this.mCM.getState(); if (CallNotifier.VDBG) super.log("onDisconnect()... CallManager state: " + this.mCM.getState()); VLog.d(this, "onDisconnect()"); removeMessages(120000); removeMessages(120001);
åã®èšäºã«æ¯ã¹ãŠãã¿ã¹ã¯ã¯è€éã§ãã åååçŽãªé¢æ°ãä¿®æ£ããå¿
èŠããã£ãå Žåãããã§ã¯ä¿®æ£ããããšãã§ããŸãããæžãæããããã®ãœãŒã¹ã³ãŒãããªãããã§ãã ããã§ãã³ãŒããåã蟌ãå¿
èŠããããŸãã
Dalvikãšã¯äœã§ããïŒ
ããã¯ãããšããã«ç°¡åã«æžãããŠããŸã ã ããã«ç°¡åãªèšèªã§èšãã°ãä»®æ³ãã·ã³ã®ãã€ãã³ãŒãã¯ãã¬ãžã¹ã¿ïŒå€æ°ãåŠçããããã«å²ãåœãŠãããã¡ã¢ãªé åïŒãšå€ãã®åœä»€ãšæŒç®åã«åºã¥ããŠããŸãã æäœã®æå³ãšåçã¯éåžžã«ç°¡åã§ããã¬ãžã¹ã¿ã«å€ãæžã蟌ãã§ããæäœãå®è¡ãããšãæäœã®çµæãã¢ã¯ã·ã§ã³ãé©çšããå Žæã«è¿ãããŸãã ãã¹ãŠã®æŒç®åãšæé ã®è©³çްã«ã€ããŠã¯ãDalvik VMã®ãã€ãã³ãŒããåç
§ããŠãã ããã
ã³ãŒããåã蟌ã
äœããå
¥åããã«ã¯ãããã«äœãå
¥åããããç¥ãå¿
èŠããããŸãã [èšé²ã®éå§]ãã¿ã³ãã³ãã©ãŒããã³ãŒãããªããããšãã§ããŸãã
Androidã®åå¿è
ããã°ã©ããŒã§ããããã³ãã©ãŒã®ä¿åå ŽæãèŠã€ããããšã¯é£ãããããŸããã ãã®åŸãä»åŸã®èšäºã§äœãã©ã®ããã«æ¢ããã«æ»ããŸãã æåã®èšäºã®æ¬è³ªã¯ãååã説æããŠããŸãã
ãã¿ã³ãæŒããããšã次ã®ã³ãŒããããªã¬ãŒãããŸãã
VoiceRecorderHelper localVoiceRecorderHelper = VoiceRecorderHelper.getInstance(); if (!localVoiceRecorderHelper.isRecording()) { localVoiceRecorderHelper.start(); }
ã€ãŸãããã¹ãŠã®åŒã³åºãã®èšé²ãèªååããã«ã¯ããã®ã³ãŒããonCallConnectedãã³ãã©ãŒã«è¿œå ããå¿
èŠããããŸãã
ãã®ãšã³ããªã®Dalvikã³ãŒãã¯æ¬¡ã®ããã«ãªããŸã
invoke-static {}, Lcom/android/phone/util/VoiceRecorderHelper;->getInstance()Lcom/android/phone/util/VoiceRecorderHelper; move-result-object v1 invoke-virtual/range {v1 .. v1}, Lcom/android/phone/util/VoiceRecorderHelper;->isRecording()Z move-result v2 const/4 v3, 0x0 if-ne v3, v2, :cond_a9 invoke-virtual/range {v1 .. v1}, Lcom/android/phone/util/VoiceRecorderHelper;->start()Z :cond_a9
ã³ãŒãã1è¡ãã€è§£æããŠã¿ãŸãããã
- invoke-staticã¯VoiceRecorderHelperã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåŒã³åºããŸã
- ã€ã³ã¹ã¿ã³ã¹ãä¿åããŠv1ãç»é²ãã
- ãã®ã¯ã©ã¹ã®isRecordingãšããã¡ãœãããåŒã³åºããtrueãŸãã¯falseãè¿ããŸã
- çµæã¯ã¬ãžã¹ã¿v2ã«æžã蟌ãŸããŸã
- ã¬ãžã¹ã¿v3ã«å€0ãæžã蟌ã¿ãŸã
- 2ã€ã®ã¬ãžã¹ã¿v2ãšv3ã®æ¯èŒãè¡ã£ãŠããŸãã ããžãã¯ïŒv2ïŒ= V3ã isRecordingãTRUEãè¿ãå Žåãv2ã®å€ã¯1ã«ãªããFALSEã®å Žåã¯ãã®éã«ãªããŸãã æ¡ä»¶ãæ©èœããªãå Žåã¯ãcond_a9ããŒã«ãŒã«ãžã£ã³ãããŸãã ããã§ãªãå Žåã¯ã
- ã¬ãžã¹ã¿v1ã«æ ŒçŽãããŠããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã®startã¡ãœãããåŒã³åºãããŸã
- äŒè©±ãé²é³ããå§ããŸããã
onCallConnectedã«æ»ããŸãã 圌ã®dalvikã³ãŒãã¯æ¬¡ã®ãšããã§ãã
.method private onCallConnected(Landroid/os/AsyncResult;)V .registers 8 .parameter "r" .prologue .line 2302 iget-object v0, p1, Landroid/os/AsyncResult;->result:Ljava/lang/Object; check-cast v0, Lcom/android/internal/telephony/Connection; .local v0, c:Lcom/android/internal/telephony/Connection; move-object v2, v0
ãã®ã³ãŒããåæããŠãäœãäœã§ããããæç¢ºã«ããŸã
.registers 8
ãã®æ©èœã«å¿
èŠãã€äœ¿çšãããã¡ã¢ãªã¬ãžã¹ã¿ã®æ°parameter "r"
ã¯ããœãŒã¹ã³ãŒãã§äœ¿çšããããã©ã¡ãŒã¿ãŒã®ååã§ãã ãããç§ãã¡ã®èå³ãåŒãããšã¯ãã£ãã«ãããŸãããprologue
-颿°ã¢ã«ãŽãªãºã ã®å§ãŸã.line 2302
ãœãŒã¹ã³ãŒãã®è¡çªå·ã ããã¯ãããã°å°çšã§ããiget-object v0, p1, Landroid/os/AsyncResult;->result:Ljava/lang/Object;
次ã®è¡ã¯ã (Connection)paramAsyncResult.result;
察å¿ããŠã(Connection)paramAsyncResult.result;
check-cast v0, Lcom/android/internal/telephony/Connection;
Connection
察å¿.local v0, c:Lcom/android/internal/telephony/Connection;
localConnection
äžèŽmove-object v2, v0
ããŒã«ã«å€æ°v0ãã¬ãžã¹ã¿v2ã«è€è£œ- ãªã©
説æãåç
§ããŠJavaã³ãŒããšæ¯èŒããã°ãã³ãŒããè§£æããããšã¯ããã»ã©é£ãããããŸããã
ãã¿ã³ã¯ãªãã¯ãã³ãã©ãŒããã³ãŒããã³ããŒããã³ãŒã«ãã³ãã©ãŒã®å
é ã«è²Œãä»ããã ãã§å®äºã§ãã ããã«ã¯ãããŸããã§ããã æã
ããã¯åäœããŸãããã»ãšãã©ã¯åäœããŸããã å®éãããŒã¿ãæžã蟌ãã¬ãžã¹ã¿ã¯ããã°ã©ã ã®ãããªãã³ãŒãã§äœ¿çšã§ããæåã«ééã£ãã¬ãžã¹ã¿ã䜿çšããŠäœããæžã蟌ããšãããã°ã©ã ã®å®è¡äžã«ãšã©ãŒãçºçããã¢ã«ãŽãªãºã å
šäœãæ
éããå¯èœæ§ããããŸãã ãã®å Žåãæåã«é¢æ°ãå
¥åããæåã«åæåãããªãã¬ãžã¹ã¿ã䜿çšã§ãããšããç¹ã§åçŽã§ãããããã®ã¬ãžã¹ã¿ã¯å°æ¥äžæžããããããã§ãã ããããå€ãã®å Žåãã³ãŒãã¯ããã°ã©ã ã®éäžã®ã©ããã«åã蟌ãå¿
èŠããããã¬ãžã¹ã¿ã«æ³šæããå¿
èŠããããŸãã ããã¯å°æ¥ã®èšäºã«ããããŸãã
ã¬ãžã¹ã¿å€æŽ
åã蟌ã¿å¯èœãªã³ãŒãã®æåã®2è¡ã«ã¯æ¬¡ã®ãã®ããããŸãã
invoke-static {}, Lcom/android/phone/util/VoiceRecorderHelper;->getInstance()Lcom/android/phone/util/VoiceRecorderHelper; move-result-object v1
é©åãªã¬ãžã¹ã¿çªå·ãæ¢ãæãç°¡åãªæ¹æ³ã¯ãå¿
èŠãªã¬ãžã¹ã¿çªå·ã«æžã蟌ãŸããŠããããŒã¿ã®çš®é¡ãã¡ãœããèªäœã§èª¿ã¹ãããšã§ãã ã³ãŒããèŠããšãv2ãšv 3ã§move-result-objectãæžã蟌ãŸããŠããããšãããããŸãã
ãããã£ãŠãåã蟌ã¿å¯èœãªã³ãŒãã®v1ã¯ãã¹ãŠv2ãŸãã¯v3ã«çœ®ãæããããŸã
åã蟌ã¿å¯èœãªã³ãŒãã®ã¬ãžã¹ã¿çªå·ã眮ãæããããã®ãã¹ãŠã®æäœãè¡ã£ãåŸã次ã®å³ãååŸããŸãã
invoke-static {}, Lcom/android/phone/util/VoiceRecorderHelper;->getInstance()Lcom/android/phone/util/VoiceRecorderHelper; move-result-object v3 invoke-virtual/range {v3 .. v3}, Lcom/android/phone/util/VoiceRecorderHelper;->isRecording()Z move-result v4 const/4 v5, 0x0 if-ne v5, v4, :cond_27 invoke-virtual/range {v3 .. v3}, Lcom/android/phone/util/VoiceRecorderHelper;->start()Z :cond_27
ããŒã«ãŒcond_a9ãcond_27ã«å€æŽããããšã¯æ³šç®ã«å€ããŸãã å®éãcond_a9ããŒã«ãŒã¯ãã³ãŒããåã蟌ãã ãã¡ã€ã«å
ã«æ¢ã«ååšããŠããã2åç®ã¯ãã®ãããªããŒã«ãŒã䜿çšã§ããŸããã ããŒã«ãŒçªå·ã¯16é²ã³ãŒãã§ãããä»»æã®ãæãéèŠãªããšã«ã¯äžæã«ããããšãã§ããŸãã
次ã«ããœãŒã¹ãã¡ã€ã«ã§ãè¡.line 2302
ãåã蟌ã¿å¯èœã³ãŒãã«çœ®ãæããŠã
.method private onCallConnected(Landroid/os/AsyncResult;)V .registers 8 .parameter "r" .prologue invoke-static {}, Lcom/android/phone/util/VoiceRecorderHelper;->getInstance()Lcom/android/phone/util/VoiceRecorderHelper; move-result-object v3 invoke-virtual/range {v3 .. v3}, Lcom/android/phone/util/VoiceRecorderHelper;->isRecording()Z move-result v4 const/4 v5, 0x0 if-ne v5, v4, :cond_27 invoke-virtual/range {v3 .. v3}, Lcom/android/phone/util/VoiceRecorderHelper;->start()Z :cond_27 .line 2302 iget-object v0, p1, Landroid/os/AsyncResult;->result:Ljava/lang/Object; check-cast v0, Lcom/android/internal/telephony/Connection; .local v0, c:Lcom/android/internal/telephony/Connection; move-object v2, v0
ã³ãã³ãjava -Xmx512m -jar smali.jar -a 16 Phone -o classes.dex
ã䜿çšããŠã³ãŒããåéãã java -Xmx512m -jar smali.jar -a 16 Phone -o classes.dex
ã§çœ®ãæããŠãã¹ãããŸãã
Javaã§ã¯ãç§ãã¡ã®ä»äºã¯æ¬¡ã®ããã«ãªãå§ããŸããã
private void onCallConnected(AsyncResult paramAsyncResult) { VoiceRecorderHelper localVoiceRecorderHelper = VoiceRecorderHelper.getInstance(); if (!localVoiceRecorderHelper.isRecording()) { localVoiceRecorderHelper.start(); } Connection localConnection = (Connection)paramAsyncResult.result; String str = ((IfConnection)localConnection).getDialString(); VLog.d("onCallConnected() dialed number:" + str); removeMessages(120000); removeMessages(120001);
ãã¹ãŠãæ£åžžã§ããã¹ãŠãæ©èœããŸãããå¯äžã®åé¡ã¯ãäŒè©±ãå®äºããåŸãé話é²é³ãç¡æéã«ç¶ç¶ããããšã§ãã
ãããè¡ãã«ã¯ã颿°ïŒã¡ãœããïŒonDisconnectã®å
é ã«åæ§ã®ã³ãŒããç»é²ããå¿
èŠããããŸãããã ãããªããŒã¹ããžãã¯ã®ã¿ã§ãã
VoiceRecorderHelper localVoiceRecorderHelper = VoiceRecorderHelper.getInstance(); if (localVoiceRecorderHelper.isRecording()) { localVoiceRecorderHelper.stop(); }
é²é³ã®éå§ãšåæ§ã«ãã¬ãžã¹ã¿çªå·ã眮ãæããå°ããªæé ãäœæããŸã
.method private onDisconnect(Landroid/os/AsyncResult;)V .registers 41 .parameter "r" .prologue invoke-static {}, Lcom/android/phone/util/VoiceRecorderHelper;->getInstance()Lcom/android/phone/util/VoiceRecorderHelper; move-result-object v34 invoke-virtual/range {v34 .. v34}, Lcom/android/phone/util/VoiceRecorderHelper;->isRecording()Z move-result v4 if-eqz v4, :cond_33 invoke-virtual/range {v34 .. v34}, Lcom/android/phone/util/VoiceRecorderHelper;->stop()Z .line 2487 :cond_33
倿Žãåéããé»è©±ãšåºæ¥äžããã§çœ®ãæããŸã-ãã¹ãŠãæ£åžžã«æ©èœããŸãã
ãšãããŒã°
ãã®è³æã¯ãåã®èšäºãšæ¯èŒããŠãæ°åè€éã§æ··ä¹±ããŠããããšãããã£ããšæããŸãã ããã€ãã®ã¬ãžã¹ã¿ãæŒç®åã修食å...ããã¯ãã³ã»ã³ã¹ã®ããã§ãã Dalvikãèªåã§åããŠèŠããšããç§ã¯ãã£ãšããããŒãžãéããŠãå幎ãéããŸããã§ããã å£ã«æŒãä»ãããããšãã2é±é以å
ã«ãäœãèµ·ãã£ãŠããã®ãããããã©ã®ããã«å®è¡ããã®ããããã«èŠã€ããŸããã åã°ããããšã«ãç§ã¯ã¬ã³ã¬ãåãåã£ãããšã¯ãããŸããã
åºåã§ã¯ãªããå€ãã®æ
å ±ãåŸãããšãã§ãã2ã€ã®ãªãœãŒã¹ããäŒãããŸãã
ãã·ã¢èªãšè±èª
äž¡æ¹ã®ãªãœãŒã¹ã§ãåãããã¯ããŒã ã§åºåžããŸãã
ãããŸã§ã®éãæ¬¡ã®èšäºãŸã§ãäžé±é以å
ã«ãé¡ãããŸãã