淘口令效果及貼上板攻擊防護實現

羅紅超發表於2020-11-19

淘口令效果與貼上板攻擊防護

寫在前面的話 – 關於剪下板安全性的思考不感興趣的可以跳過這段廢話

  1. 早在18年360網際網路中心首次監聽到一類木馬病毒,該類病毒不斷的監聽剪下板,判斷是否為比特幣等數字貨幣地址,如果是數字貨幣地址則將其替換成自己的地址從而實施盜竊,其實這種漏洞早在16年Telegram就暴露出應用將剪下板文字寫到本地的情況,而剪下板的安全一直不為大家所關注,因此應用本身如果需要較高的防護等級的話剪下板的安全就容易變成一個薄弱環節.

如何防護

筆者從兩方面考慮防護

  1. 如何防止寫入到剪貼簿的資料被其他應用讀取並篡改
  2. 如何簡單快速的進行防護而不對現有專案做過多改動

直接上程式碼

  1. 下面的程式碼主要是對剪貼簿的hook,在應用中如果一旦使用了剪貼簿會自動的走到我們hook的地方,在此我們可以將剪貼的資料進行加密處理,或者實現淘口令的功能.具體的各位可以根據自身的業務需求實現.完整程式碼各位可以下載github程式碼,如果有用請給個star支援一下.

     package com.lhc.hook.myapplication.hook;
     import android.content.ClipData;
     import android.content.Context;
     import android.os.IBinder;
     import android.text.TextUtils;
     import android.util.Log;
     
     import com.lhc.hook.myapplication.hookutil.ServiceHook;
     import com.lhc.hook.myapplication.hookutil.ServiceManager;
     
     import java.lang.reflect.InvocationHandler;
     import java.lang.reflect.Method;
     import java.lang.reflect.Proxy;
     
     public class ClipboardHook {
    
     private static final String TAG = ClipboardHook.class.getSimpleName();
     private static Context mContext;
    
     public static void hookService(Context context) {
         mContext = context;
         IBinder clipboardService = ServiceManager.getService(Context.CLIPBOARD_SERVICE);
         String IClipboard = "android.content.IClipboard";
    
         if (clipboardService != null) {
             try {
                 IBinder hookClipboardService =
                         (IBinder) Proxy.newProxyInstance(IBinder.class.getClassLoader(),
                                 new Class[]{IBinder.class},
                                 new ServiceHook(clipboardService, IClipboard, true, new ClipboardHookHandler()));
                 ServiceManager.setService(Context.CLIPBOARD_SERVICE, hookClipboardService);
             } catch (Exception e) {
                 e.printStackTrace();
             }
         } else {
             Log.e(TAG, "ClipboardService hook failed!");
         }
     }
    
     /**
      * 其實在android的貼上板中有一個ClipData.getDescription()方法,
      * 各位甚至可以根據自己的需要對貼上的內容進行描述,在此處就不贅述.
      */
    
     public static class ClipboardHookHandler implements InvocationHandler {
         @Override
         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
             String name = method.getName();
             if ("setPrimaryClip".equals(name)) {//複製
                 hookSetPrimaryClip(args);
                 return method.invoke(proxy, args);
             } else if ("getPrimaryClip".equals(name)) {//貼上
                 Object call = method.invoke(proxy, args);
                 call = hookGetPrimaryClip(call);
                 return call;
             }
             return method.invoke(proxy, args);
         }
    
         /**
          * hook貼上,可對資料加密,或實現淘口令效果
          */
         private void hookSetPrimaryClip(Object[] args) {
             for (int i = 0; i < args.length; i++) {
                 if (args[i] instanceof ClipData) {
                     ClipData clipData = (ClipData) args[i];
                     if (clipData != null && clipData.getItemAt(0) != null
                             && !TextUtils.isEmpty(clipData.getItemAt(0).getText())) {
                         // TODO: 2020/11/19 0019 對資料進行解密,實現淘口令功能
                         ClipData data = new ClipData(clipData.getDescription(),
                                 new ClipData.Item("資料已經加密"));
                         args[i] = data;
                     }
                 }
             }
         }
    
         /**
          * hook 貼上 對資料進行解密或實淘口令解密功能
          */
         private Object hookGetPrimaryClip(Object call) {
             if (call instanceof ClipData) {
                 ClipData encodeData = (ClipData) call;
                 if (encodeData != null && encodeData.getItemAt(0) != null
                         && !TextUtils.isEmpty(encodeData.getItemAt(0).getText())) {
                     // TODO: 2020/11/19 0019 對資料進行解密對淘口令解密
                     ClipData decodeData = new ClipData(encodeData.getDescription(),
                             new ClipData.Item("資料已經解密"));
                     call = decodeData;
                 }
             }
             return call;
         }
     }
     }
    

相關文章