Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android專項-針對Xposed hook密碼框的防護

Android專項-針對Xposed hook密碼框的防護

編輯:關於Android編程

原理

TextWatcher接口為EditText控件的響應字符輸入事件提供了3個方法,這三個方法分別為:

public void beforeTextChanged(CharSequence s, int start, int count, int after) public void onTextChanged(CharSequence s, int start, int before, int count) public void afterTextChanged(Editable s)

我們通過自定義一個類,實現該接口,然後重寫這三個方法,將輸入的字符保存到StringBuilder中,而在EditText實際顯示的是*號。這樣當你hook住EditText.getText()的時候,獲取的密碼肯定是多個*,而實際的密碼保存在StringBuilder中。

步驟

自定義TextWatcher類

public class EditChangedListener implements TextWatcher {

    private static final String TAG = "EditChangedListener";
    private CharSequence temp;
    private EditText editText;
    private boolean add = false;
    private StringBuilder password = new StringBuilder();
    private int mStart;

    public EditChangedListener(EditText editText) {
        this.editText = editText;
    }

    //after表示這次新加了幾個字符,count表示舊的內容中被修改了幾個字符,start表示修改的開始位置
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//        Log.i(TAG, "beforeTextChanged : " + s + ",start = " + start + ",count = " + count + ",after = " + after);


    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //before 原有內容被修改的數量,count為新增的數量,start為操作位置
        if (s.length() == 0) return;
//        Log.i(TAG, "onTextChanged : " + s + ",start = " + start + ",count = " + count + ",before = " + before);

        if (count == 0 && password.length() > start) {
            password.deleteCharAt(start);
            Log.i(TAG, "刪除了第" + start + "個字符 : " + s.charAt(start - 1));
            inputStarForEdit(password.length());
            add = false;
            return;
        }

        if (count > 0) {
            add = true;
        }
    }


    @Override
    public void afterTextChanged(Editable s) {

        if (!add || s.length() == 0) return;
        int length = s.length();
        char c = s.charAt(length - 1);

        if (c == '*') return;
        password.append(c);
        inputStarForEdit(length);
    }

    private void inputStarForEdit(int length) {

        editText.getText().clear();

        for (int i = 0; i < length; ++i) {
            editText.getText().append("*");
        }
        Log.i(TAG, "真實的為密碼: " + password.toString() + ",偽裝的密碼為 : " + editText.getText());
    }
}

這裡面的代碼邏輯,一定要理解,核心在這

設置密碼框的響應器為上面的類


 mPasswordView = (EditText) findViewById(R.id.password);

 mPasswordView.addTextChangedListener(new EditChangedListener(mPasswordView));

總結

具體應用到你項目中,可能要考慮的問題比上面的demo要多,但是原理基本差不多,招行銀行的策略與上面類似。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved