高研班成果展示、认证、线下班,《安卓高级研修班(网课)》9月班开始招生!
Frida版的FART开源发布,提供了两种不同的实现,无需刷机便可体验函数粒度的脱壳修复。
一种是基于hook技术实现,较容易理解;
另一种是基于反射实现。
>>> 一、基于hook实现的Frida版FART
3305 void ClassLinker::LoadMethod(const DexFile& dex_file,
3306 const ClassDataItemIterator& it,
3307 Handle<mirror::Class> klass,
3308 ArtMethod* dst) {
3309 uint32_t dex_method_idx = it.GetMemberIndex();
3310 const DexFile::MethodId& method_id = dex_file.GetMethodId(dex_method_idx);
3311 const char* method_name = dex_file.StringDataByIdx(method_id.name_idx_);
3312
3313 ScopedAssertNoThreadSuspension ants("LoadMethod");
3314 dst->SetDexMethodIndex(dex_method_idx);
3315 dst->SetDeclaringClass(klass.Get());
3316 dst->SetCodeItemOffset(it.GetMethodCodeItemOffset());
3317
3318 dst->SetDexCacheResolvedMethods(klass->GetDexCache()->GetResolvedMethods(), image_pointer_size_);
3319
3320 uint32_t access_flags = it.GetMethodAccessFlags();
3321
3322 if (UNLIKELY(strcmp("finalize", method_name) == 0)) {
3323 // Set finalizable flag on declaring class.
3324 if (strcmp("V", dex_file.GetShorty(method_id.proto_idx_)) == 0) {
3325 // Void return type.
3326 if (klass->GetClassLoader() != nullptr) { // All non-boot finalizer methods are flagged.
3327 klass->SetFinalizable();
3328 } else {
3329 std::string temp;
3330 const char* klass_descriptor = klass->GetDescriptor(&temp);
3331 // The Enum class declares a "final" finalize() method to prevent subclasses from
3332 // introducing a finalizer. We don't want to set the finalizable flag for Enum or its
3333 // subclasses, so we exclude it here.
3334 // We also want to avoid setting the flag on Object, where we know that finalize() is
3335 // empty.
3336 if (strcmp(klass_descriptor, "Ljava/lang/Object;") != 0 &&
3337 strcmp(klass_descriptor, "Ljava/lang/Enum;") != 0) {
3338 klass->SetFinalizable();
3339 }
3340 }
3341 }
3342 } else if (method_name[0] == '<') {
3343 // Fix broken access flags for initializers. Bug 11157540.
3344 bool is_init = (strcmp("<init>", method_name) == 0);
3345 bool is_clinit = !is_init && (strcmp("<clinit>", method_name) == 0);
3346 if (UNLIKELY(!is_init && !is_clinit)) {
3347 LOG(WARNING) << "Unexpected '<' at start of method name " << method_name;
3348 } else {
3349 if (UNLIKELY((access_flags & kAccConstructor) == 0)) {
3350 LOG(WARNING) << method_name << " didn't have expected constructor access flag in class "
3351 << klass->PrettyDescriptor() << " in dex file " << dex_file.GetLocation();
3352 access_flags |= kAccConstructor;
3353 }
3354 }
3355 }
3356 dst->SetAccessFlags(access_flags);
3357 }
3115 void ClassLinker::LoadMethod(Thread* self,
3116 const DexFile& dex_file,
3117 const ClassDataItemIterator& it,
3118 Handle<mirror::Class> klass,
3119 ArtMethod* dst) {
3120 uint32_t dex_method_idx = it.GetMemberIndex();
3121 const DexFile::MethodId& method_id = dex_file.GetMethodId(dex_method_idx);
3122 const char* method_name = dex_file.StringDataByIdx(method_id.name_idx_);
...
...
>>> 二、基于反射实现的Frida版FART
由于该实现不是基于hook,不会对ART的流程进行任何形式的干扰,因此,也就可以在spawn方式以及attach方式线下都能够成功工作。
这两种方式都需要保证app的代码执行权限已经由壳交付到app的代码中,如已经进入到app的主界面。
好了,就到这里了,感兴趣的可以去Github体验Frida版FART强大的函数粒度的脱壳能力。
优秀学员作品展示(四月):
JNI动态注册函数定位 patch so层过Frida反调试 在art::DexFile::DexFile()函数进行frida dump dex Frida hook LoadMethod Dump被动调用还原方法体 Frida实现主动调用(反射版)
2. 《Frida辅助脱壳》by 新萌
某商业壳
Frida主动调用触发壳修复
Frida registerClass实现Runnable多线程接口
Frida重写defineClassNative实现主动调用
虚函数的处理、函数过滤
阻断函数执行来dump方法体
手工dex2c
MainActivity中的onCreate这个Jave函数的jni等价实现
MainActivity中的replaceClassloader这个java函数的jni等价实现
某商业壳
init.array字符串动态解密
Frida内存型反调试
多层动态注册定位
优秀学员作品展示(三月):
首先优先从优秀学员中产生; 其次考虑到纯线上容易有舞弊的情况,增加线下见面的面试,确保实力真正达到要求水平。
>>> 开班时间
2020年9月开班(202009期)
3W:《ida trace分析非标准算法》
3W:《FART&frida》
2W:《FART中的脱壳点》
2W:《Dalvik下动态注册原理追踪 》
Q1:有优惠么?!有优惠么?!有优惠么?!重要的事情说三遍!!
A:没有任何优惠噢。只送开学大礼包,把我们网课中需要准备的设备和环境直接送给大家。
3W班高研网课开学大礼包:
一部pixel手机(sailfish)(安卓8脱壳镜像)
安卓源码开发编译调试环境SSD移动硬盘500G
2W计划的话大礼包中的手机或移动硬盘二选一。
Q2:网课内容与线下班内容一样么?
A:月薪三万计划的内容与线下班的内容是一样的,我们在线下班沉淀大家的切实的需求和疑问,重新编排和制作内容作为网课与大家分享。月薪两万计划的内容由三万计划的讲师全新制作,充分体现工作场景一线的需求,更加贴近实战、实用,有用、好用。
Q3:非常关心ollvm和vmp,可以详细介绍下还原的方法和细节么?
A:目前针对ollvm和vmp,任何所谓的自动化,都是带很多前提和条件限制的;目前最快的还原ollvm或vmp的方法,还是手动分析,一般快则两三日、慢则一两周,基本上可以还原出来。
ollvm或vmp虽然非常复杂,但是并不代表没有取巧和判断的方法;依托于我们丰富的经验,我们会在课上将我们调试和分析的普适方法和一般性及特殊性技巧教给大家,同时带领大家开发属于自己的ollvm和vmp虚拟机,让学员既能够自己给自己的程序加密,又能够分析别人的经过ollvm或vmp保护的算法,这才是我们看雪高级研修班所传达的授人以渔的精神。
Q4:想报名网课需要什么样的基础?像我这样的初学者可以报名么?
A:月薪两万计划推荐至少有实际安卓安全岗位工作经验一年以上为宜。初学者可以先看我们安卓版主非虫大佬的《Android软件安全权威指南》等安卓安全书籍进行入门,在看雪论坛看帖发帖提升自身水平,本套课程建议有工作经验的老手前来充电学习。
月薪三万计划视大家实际需求而定,一般看得懂目录及想要学习的人自己就懂,大家不用盲目跟风。如果看不懂目录及不理解目录的具体含义及意义,建议先从两万计划学起,多积累技术和经验。
Q5:学习三万计划之前,需要先掌握两万计划的基础吗?
A:不需要,互相独立的。月薪两万计划的定位更加偏向工作岗位一线逆向需求,月薪三万计划则更加偏向于高级调试技巧,二者互为补充,相辅相成。有非常多地大佬两个计划一起报名了,我们也会确保直播时间不会冲突。
Q6:想报三万的班,真的很想学高级技巧;但两万的班中也有很多是我想了解和学习的,大佬给些建议呢?
A:其实推荐两个班一起报,有好几位大佬就是两个班全报的。因为首先价格真心不贵,其实我们会将直播的时间错开,方便大家同时进修三万和两万计划,学习自己想要学习的、心仪的知识。
Q7:直播答疑如果错过了,是否会有直播内容的回放?
A:每一场直播都有回放,在看雪课程中可以观看。
Q8:就业班如何报名呢?流程是怎样的呢?
A:就业班是需要考核的。考核流程是先缴费报名,然后开始。会经过简历、(远程)一面和二面。通过之后补差价,不通过退全款。
Q9:我已经报名了,趁开班前还想再预习一下,可否给个预习指南,让我好好利用开班前这段时间再恶补一下。
A:在月薪三万计划中,我们学习的主要目标是,掌握调试、分析和还原ollvm、vmp的方法,定制art虚拟机进行自动化脱壳的方法,主要涉及的技术栈是C\C++还原、arm(64),C++开发。
因此首先推荐邓凡平先生的《深入理解Android:Java虚拟机ART》,里面的第五章详细讲解了ART虚拟机的实现语言C++11,是阅读ART源代码必备的知识;其余部分也详细讲解了Class文件、dex文件和ELF文件的格式和内容,以及art虚拟机的编译、runtime、解释执行、内存、线程等art的技术细节。
推荐的第二本书是《C++反汇编与逆向分析技术揭秘》,按照书中的方法自己编写实验代码对C++使用ndk编译后arm汇编进行对照,掌握c++数据类型、控制流、函数和类在编译后arm汇编的表现形式;希望大家预先掌握这些知识,即使现在不开始看,开课后也会要求大家必须掌握。
在月薪两万计划中,我们更加注重的是实际工作中遇到的各种场景、实际工作能力的提升,及解决实际问题的能力。因此各种逆向环境的搭建、逆向的综合能力和利用代码的编写是最关键的,这里主要涉及的技术栈也是比较杂的:比如网络、Ubuntu/安卓系统知识、应用安全开发、Frida/JS/Python等等、Java技巧,比较考验学员的计算机综合技术基础水平。
因此我们从工作实践中的需求出发,推荐大家首先强化安卓Java代码的开发、及各种网络和接口的知识,这两大技能被大量应用到应用安全、漏洞检测、渗透测试、黑灰攻防等方向,我们并不推荐具体的书目,只要涉及Java、安卓和网络的图书,都可以。
有句话叫做开发的高度,决定了你逆向的高度,希望大家利用好开班前的时间,强化一下Java和网络开发的能力。
注意:
1. 以上所有宣传稿件内容均不作为服务承诺,最终以实际签订培训合同为准。
2. 课程大纲与细目会根据教学反馈不断优化、调整与更新,实际授课可能与宣传主题略有不同。
就业班11199元 强化班5599元
课程顾问微信:r0ysue
(备注“安卓高研网课”)