2015-01-21 1 views
0

에 후킹을 통해 컨텍스트를 얻을 방법 배경은 다음과 같습니다 내가 타사 응용 프로그램 후크 xposed 프레임 워크를 사용하고안드로이드

  1. .
  2. 메소드 XXX를 후크하면 "ClassNotFound"오류가 발생합니다. XXX가 dex 파일에 있고 메소드가 DexClassLoader에 의해로드 될 것이라고 확인하고 발견했습니다.
  3. 메소드 XXX을 연결하려면 xposed의 기본 ClassLoader를 DexClassLoader으로 변경해야합니다. DexClassLoader 인스턴스를 얻으려면 타사 앱의 Context 인스턴스가 필요합니다.
  4. 여기에 질문이옵니다. 컨텍스트 인스턴스를 얻는 방법은 무엇입니까?

나는 stackoverflow를 검색하여 Activity 또는 Receiver에서 메소드를 연결하여 컨텍스트를 검색 할 수 있다고 말한 사람이 있습니다. 하지만 Activity.class를 확인하고 컨텍스트 유형 값을 반환하는 메소드가없고 오직 하나의 메소드에만 컨텍스트 유형 매개 변수 인 onCreateView(String name, Context context, AttributeSet attrs)이 있습니다.

컨텍스트를 가져올 방법이 있습니까?

답변

1

아래 포스터의 대답은 간결하다 :

Context context = (Context) AndroidAppHelper.currentApplication(); 

또 다른 해킹 (문맥에 캐스트 할 수 있습니다) 현재의 활동을 검색하는 것입니다 이렇게 :

Class<?> instrumentation = XposedHelpers.findClass(
       "android.app.Instrumentation", lpparam.classLoader); 

XposedBridge.hookAllMethods(instrumentation, "newActivity", new XC_MethodHook() { 

       @Override 
       protected void afterHookedMethod(MethodHookParam param) throws Throwable { 

        mCurrentActivity = (Activity) param.getResult(); 

        Log.v(TAG, "Current Activity : " + mCurrentActivity.getClass().getName()); 
       } 
}); 

클래스 로더와 관련하여 메인 앱 클래스 로더로 구성되어 있다면 handleLoadPackage 메소드로 전달 된 LoadPackageParam에서 검색 할 수 있습니다.

앱 자체가 새로운 DexClassLoader을 생성하는 경우 DexClassLoader 생성자를 연결하여 참조를 유지할 수 있습니다. 그런 식으로 클래스와 메서드가 포함 된 실제 ClassLoader을 가질 수 있습니다. 컨텍스트를 얻을 필요가 없습니다.

+0

정말 고마워요! 당신 말이 맞아요, 제 경우에는 DexClassLoader를 연결하는 것만으로도 충분합니다. –

+0

이 질문은 묻는 것보다 다른 질문에 대한 답입니다. 원저자는 행복합니다. "문맥을 얻는 방법"에 대한 답을 찾는 사람들에게는 유용하지 않습니다. – baordog

+0

게시 한 코드가 문맥을 검색하고 그것을 클래스의 정적 필드에 보관할 수 있습니다. 즉, Activity가 미리 시작되었다고 가정하지만, 대부분의 Xposed 모듈에서는 괜찮습니다. – 4knahs

6

Xposed는 현재 현재 연결된 응용 프로그램 클래스 로더를 제공합니다.

public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { 
     if (!lpparam.packageName.equals("com.android.systemui")) 
      return; 

     findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() { 
      @Override 
      protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
       // this will be called before the clock was updated by the original method 
      } 
      @Override 
      protected void afterHookedMethod(MethodHookParam param) throws Throwable { 
       // this will be called after the clock was updated by the original method 
      } 
    }); 
    } 

"lpparam.classLoader"는 현재 응용 프로그램 클래스 로더입니다. 내가 잘못 입력 한 것 같습니다. 코드를 게시 할 수 있습니까? 하지만 당신은 현혹 된 마녀가 컨텍스트에 캐스팅 될 수있는 현재의 훅 응용 프로그램 응용 프로그램을 얻을 수 있습니다. Context context = (Context) AndroidAppHelper.currentApplication();

출처 : https://github.com/rovo89/XposedBridge/blob/master/src/android/app/AndroidAppHelper.java#L131 출처 : https://github.com/rovo89/XposedBridge/wiki/Development-tutorial