Frida의 본질을 이해하는 데 도움이 되는 기사에서 put의 오버로드를 처리하는 방법을 배웠습니다. 먼저 코드를 검토해 보겠습니다.
my_class.fun.overload("int" , "int").implementation = function(x,y){ my_class.fun.overload("java.lang.String").implementation = function(x){
즉, 오버로드된 배열을 구성하고 각 오버로드를 인쇄해야 합니다. 코드로 직접 가보겠습니다:
//目标类 var hook = Java.use(targetClass); //重载次数 var overloadCount = hook[targetMethod].overloads.length; //打印日志:追踪的方法有多少个重载 console.log("Tracing " + targetClassMethod + " [" + overloadCount + " overload(s)]"); //每个重载都进入一次 for (var i = 0; i <p> 이런 식으로 모든 메소드 오버로딩을 처리한 후 모든 메소드를 열거했습니다. </p><h4>0x02.hook 클래스의 모든 메서드</h4><p>또는 코드로 직접 이동: </p><pre class="brush:php;toolbar:false">function traceClass(targetClass) { //Java.use是新建一个对象哈,大家还记得么? var hook = Java.use(targetClass); //利用反射的方式,拿到当前类的所有方法 var methods = hook.class.getDeclaredMethods(); //建完对象之后记得将对象释放掉哈 hook.$dispose; //将方法名保存到数组中 var parsedMethods = []; methods.forEach(function(method) { parsedMethods.push(method.toString().replace(targetClass + ".", "TOKEN").match(/\sTOKEN(.*)\(/)[1]); }); //去掉一些重复的值 var targets = uniqBy(parsedMethods, JSON.stringify); //对数组中所有的方法进行hook,traceMethod也就是第一小节的内容 targets.forEach(function(targetMethod) { traceMethod(targetClass + "." + targetMethod); }); }
또는 코드의 핵심 부분으로 이동:
//枚举所有已经加载的类 Java.enumerateLoadedClasses({ onMatch: function(aClass) { //迭代和判断 if (aClass.match(pattern)) { //做一些更多的判断,适配更多的pattern var className = aClass.match(/[L]?(.*);?/)[1].replace(/\//g, "."); //进入到traceClass里去 traceClass(className); } }, onComplete: function() {} });
// 追踪本地库函数 function traceModule(impl, name) { console.log("Tracing " + name); //frida的Interceptor Interceptor.attach(impl, { onEnter: function(args) { console.warn("\n*** entered " + name); //打印调用栈 console.log("\nBacktrace:\n" + Thread.backtrace(this.context, Backtracer.ACCURATE) .map(DebugSymbol.fromAddress).join("\n")); }, onLeave: function(retval) { //打印返回值 console.log("\nretval: " + retval); console.warn("\n*** exiting " + name); } }); }
드디어 실제 전투 시간입니다. frida. 코드는 여기에 있지만 Huluwa에 의해 수정된 후 마침내 사용 가능해졌습니다.
주요 기능 중 일부를 사용해 보겠습니다. 첫 번째는 로컬 라이브러리의 내보내기 기능입니다.
setTimeout(function() { Java.perform(function() { trace("exports:*!open*"); //trace("exports:*!write*"); //trace("exports:*!malloc*"); //trace("exports:*!free*"); }); }, 0);
우리가 후크
하는 것은 open()
함수입니다. 이를 실행하고 효과를 확인하세요: hook
的是open()
函数,跑起来看下效果:
$ frida -U -f com.whatsapp -l raptor_frida_android_trace_fixed.js --no-pause
如图所示*!open*
根据正则匹配到了openlog
、open64
等导出函数,并hook了所有这些函数,打印出了其参数以及返回值。
接下来想要看哪个部分,只要扔到jadx
里,静态“分析”一番,自己随便翻翻,或者根据字符串搜一搜。
比如说我们想要看上图中的com.whatsapp.app.protocol
包里的内容,就可以设置trace("com.whatsapp.app.protocol")
。
可以看到包内的函数、方法、包括重载、参数以及返回值全都打印了出来。这就是frida
脚本的魅力。
当然,脚本终归只是一个工具,你对Java
、安卓App的理解,和你的创意才是至关重要的。
接下来可以搭配Xposed module看看别人都给whatsapp
做了哪些模块,hook
rrreee
그림과 같이*!open*
는 일반 규칙openlog
, open64
및 기타 내보낸 함수에 따라 일치하고 이러한 모든 함수를 연결하고 해당 매개변수와 반환 값을 인쇄합니다.
다음에 보고 싶은 부분이 무엇이든 jadx
에 넣고, 정적으로 "분석"하거나, 직접 찾아보거나, 문자열을 기반으로 검색하세요.
com.whatsapp.app.protocol
패키지의 내용을 보려면 trace("com.whatsapp.app.protocol"). 🎜🎜🎜🎜🎜🎜에서 기능을 볼 수 있습니다. 오버로드를 포함한 패키지, 메소드, 매개변수 및 반환 값이 모두 인쇄됩니다. 이것이 frida
스크립트의 매력입니다. 🎜🎜물론 스크립트는 결국 도구일 뿐입니다. Java
, Android 앱에 대한 이해와 창의력이 중요합니다. 🎜🎜 다음으로 Xposed 모듈을 사용하여 다른 사람들이 whatsapp
용으로 만든 모듈이 무엇인지, hook
의 어떤 기능이 구현되어 있는지 확인하고 직접 작성하는 방법을 배울 수 있습니다. 🎜🎜🎜🎜🎜 물론, 치트를 만드는 것은 불법이라는 점을 다시 한 번 강조하고 싶습니다. 앱에 대한 치트를 만들고 배포하지 마세요. 그렇지 않으면 법의 처벌을 받게 됩니다. 🎜
위 내용은 Java에서 동적 및 정적 방법의 조합을 사용하여 WhatsApp을 반전시키는 단계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!