編輯:關於Android編程
.method protected getLoginPassword()Ljava/lang/String;
.registers 2
.prologue
.line 809
iget-object v0, p0, Lcom/ali/user/mobile/login/ui/AliUserLoginActivity;->mPasswordInput:Lcom/alipay/mobile/commonui/widget/keyboard/APSafeEditText;
invoke-virtual {v0}, Lcom/alipay/mobile/commonui/widget/keyboard/APSafeEditText;->getSafeText()Landroid/text/Editable;
move-result-object v0
invoke-interface {v0}, Landroid/text/Editable;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
.end method
const-string v0, "InjectLog"
const-string v1, "com.ali.user.mobile.login.ui.AliUserLoginActivity.getLoginPassword()"
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
android.util.Log.d("InjectLog", "com.ali.user.mobile.login.ui.AliUserLoginActivity.getLoginPassword()");
invoke-static {}, Lcom/hook/testsmali/InjectLog;->PrintFunc()V
package com.hook.testsmali;
import android.util.Log;
public class InjectLog
{
public static void PrintFunc()
{
Thread cur_thread = Thread.currentThread();
StackTraceElement stack[] = cur_thread.getStackTrace();
Log.d("InjectLog", stack[3].toString() + "[" + cur_thread.getId() + "]");
}
}
我們也可以不輸出線程ID,因為LogCat已經標示出TID來了,但是導出日志後這個TID就不見了,所以還是輸出一下。日志的輸出時間順序就是函數的調用順序,順著這個調用順序看dex2jar和JD-GUI反編譯出的JAVA代碼,定位超快、效率超高,分分種種搞出些事情來。什麼?你問我搞什麼事情?它都一絲不掛在你面前了,你還問我搞什麼事情!
最後貼上用於批量插smali代碼的Python腳本,雖然丑陋但是簡單粗暴、野蠻有效:
import os
class ParserError(Exception):
pass
# 注入代碼到一個函數塊中
def inject_code_to_method_section(method_section):
# 靜態構造函數,無需處理
if method_section[0].find("static constructor") != -1:
return method_section
# synthetic函數,無需處理
if method_section[0].find("synthetic") != -1:
return method_section
# 抽象方法,無需處理
if method_section[0].find("abstract") != -1:
return method_section
# 生成待插入代碼行
inject_code = [
'\n',
' invoke-static {}, Lcom/hook/testsmali/InjectLog;->PrintFunc()V\n',
'\n'
]
#插入到.prologue的下一行
is_inject = False
for i in range(0, len(method_section)):
if method_section[i].find(".prologue") != -1:
is_inject = True
method_section[i + 1: i + 1] = inject_code
break
if not is_inject:
raise ParserError("找不到.prologue")
return method_section
def inject_log_code(content):
new_content = []
method_section = []
is_method_begin = False
for line in content:
if line[:7] == ".method":
is_method_begin = True
method_section.append(line)
continue
if is_method_begin:
method_section.append(line)
else:
new_content.append(line)
if line[:11] == ".end method":
if not is_method_begin:
raise ParserError(".method不對稱")
is_method_begin = False
new_method_section = inject_code_to_method_section(method_section)
new_content.extend(new_method_section)
method_section.clear()
return new_content
def main():
walker = os.walk("./")
for root, directory, files in walker:
for file_name in files:
if file_name[-6:] != ".smali":
continue
file_path = root + "/" + file_name
print(file_path)
file = open(file_path)
lines = file.readlines()
file.close()
new_code = inject_log_code(lines)
file = open(file_path, "w")
file.writelines(new_code)
file.close()
if __name__ == '__main__':
main()
使用eclipse打包app以及AndroidStudio和Eclipse中app簽名修改等問題(SH1和MD5)
一,使用eclipse打包app內容新建keystore:1、先在eclipse中創建一個新的keystore看詳細圖2、接下來設置一些打包必要參數:3.設置好內容後點擊
Android屬性動畫--補充說明&進階
轉載請注明出處,謝謝~~目錄本文概述 動畫補充說明 屬性動畫的View加載方式 TypeEvaluator的使用 TimeInterpolator LayoutTrans
Android仿IOS的AssistiveTouch的控件EasyTouch實現
概述:之前我聽到過一則新聞,就是說Ipone中的AssistiveTouch的設計初衷是給殘疾人使用的。而這一功能在亞洲(中國)的使用最為頻繁。雖不知道這新聞的可靠性,但
android 線性布局LinearLayout實例代碼
布局文件:res/layout/activity_my.xml復制代碼 代碼如下:[html] <LinearLayout xmlns:android=