❝小闫语录:你可以菜,但是就这么菜下去是不是有点过分了 ❞ 每天不是在写 bug,就是在解 bug 的路上~更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』 1.无参数函数作为参数传入调用...} fuc2(fuc1); // 1 2.有参数函数作为参数传入调用 一般的函数都有参数,那么这种情况如何传参呢?...现在要将传入的函数作为点击事件的处理程序,你一定想得是这样: function fuc1(param) { alert(param); } var link = document.getElementsByClassName...("link1"); link.onclick = fuc1("我是小闫同学啊"); 但是不好意思,「不需要点击,一刷新页面,直接调用函数」,弹出窗口!...❝因为在你写 fuc1("我是小闫同学啊") 时,默认就调用了此函数,都不需要点击。 ❞ 如何才能达到在点击时才弹出窗口呢?
类extends 即可以指定类的基类 类implements 匹配实现了某接口的类 类$ 内部类 成员(方法)通配符 * 匹配任意长度字符,但不含包名分隔符(.)...####################### # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -...dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 这句话能够使我们的项目混淆后产生映射文件 #...包含有类名->混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify...java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对于带有回调函数的
三、实验目标 先将样本放到火绒剑里运行一下,了解样本A大概执行流程 dump出的傀儡进程为B程序,修复后的傀儡进程为C程序 傀儡进程带有UPX壳,手工脱UPX壳,并修复导入表为D程序...分析修复后的傀儡有个加载资源的操作,该部分数据是PE格式,dump出来另存为E程序,发现是.net带有混淆的代码,需要反混淆操作 调试反混淆后的程序,分析发现其为远控木马,下载相应服务器端,研究该木马的功能...SetThreadContext设置挂起进程状态; (7) ResumeThread唤醒进程运行 2、傀儡进程dump出来后需要进行修复,我们dump出来是程序拉伸后的状态,需要把文件偏移改为内存偏移...dnSpy调试反混淆后的程序 E-cleaned.exe,先删除之前加载的程序 打开E-cleaned.exe 在IP地址和端口设置的函数地方下断点,大家可以对这个程序进行分析 8.根据程序行为修改服务端程序的...UPX壳 4、对脱壳后程序进行分析,发现具有加载资源的操作,该资源数据是PE格式 5、将这部分数据拷贝出来分析,发现其为远控木马的客户端,C#编写 6、调试该C#程序,先进行反混淆操作,简单分析该程序
返回值的resume执行即可执行挂起函数,那么他是怎么实现的呢?...编译器会给挂起函数创建一个匿名内部类,这个匿名类继承自SuspendCorunting重写了他的invokeSuspend方法这个里面就是函数体,通过api返回的continution的resume函数会调用...我们在调用lauch启动一个协程的时候,编译器只会给我们创建一个匿名内部类,并不会为每一个挂起函数都创建一个匿名内部类耗性能,但是他是怎么做到一个匿名内部类管理所有的挂起函数的呢,答案就是状态机。...协程会检测挂起函数有几个然后设置几个状态,在调用resumeWith的时候会调用invokeSuspend执行协程体,这个时候会检查协程体里面接下来的函数的返回值:如果调用到挂起函数的时候,会开线程(不一定需要根据协程的上下文获取调度器决定...大致流程: (resumewith-》 invokeSuspend)—》【检查状态机该执行哪个挂起函数之后的代码】调用完函数后检查返回值【修改状态机,挂起函数返回标志(线程执行挂起函数之后调用resume
注意,直接build生成的APK是不进行混淆的,必须是signed的apk才会混淆 app下的build.gradle中配置 buildTypes { release {...######## # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames...# 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose...android.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留support下的所有类及其内部类...java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对于带有回调函数的
线程本身已经有的协程也会有,但是协程有的线程不一定有 编译器会为每一个挂起函数生成一个匿名内部类,其继承SuspendLabmba类重写其invokeSuspend方法,这个方法里面即为协程体的代码...【大致内容请先了解】 编译器会对协程体中的挂起函数和普通函数进行切割,切割时进行label的自增来保证之后代码的执行顺序,即协程保证运行顺序的本质。...PC计数器来做的) 协程体中的数据,看过之前那篇文章的人应该大致了解挂起函数其实就是匿名内部类,数据是保存在栈帧中的,(对比线程:也是通过栈帧中的局部变量表和操作数栈来存储数据) 协程体中碰到挂起函数会直接返回...【简而言之,和协程本身有关的数据保存在上下文中,和业务有关的代码会放在匿名内部类中。】...,如果为挂起函数直接返回 // 挂起函数会持有Continuation,挂起函数执行后调用其resumeWith方法,之后就会回到invokeSuspend中
如下代码所示: 不难发现,我们带有suspend的函数最终会被转变为一个带 Continutaion 参数,并且返回值为Object(可null)的函数。...我们知道,在 kotlin 中,lambda 是匿名内部类的一种实例化方式(简化),所以这里只是给 runBlocking() 函数传递了所需要的方法参数。...但是这个 lambda 内部的 invoke() 依然是挂起函数(因为增加过suspend),所以这里的匿名内部类实际上也是实现了 Continuation(默认的只有Funcation1,2,3等等)...相应的,为了延续 invoke() 里的挂起函数流程,编译器在当前匿名类内部又创建了一个 **anonymous constructor(无类型) ** 的内部类(实际上是继承自SuspendLambda...需要注意的,我们 withContext() 范围内,虽然经历了CPS转换,但因为不存在其他挂起函数,所以并不会再返回是否挂起,而是直到我们的逻辑执行结束 ,从而触发 withContext() 内部去调用
混淆过后通过原来的名字去找混淆后的名字,是找不到对应方法和类,就会出异常报错。所以有些情况是不能进行混淆的。...自定义控件不进行混淆 枚举类不被混淆 反射类不进行混淆 实体类不被混淆 JS调用的Java方法 四大组件不进行混淆 JNI中调用类不进行混淆 Layout布局使用的View构造函数、android:onClick...如下例子就避免所有继承Activity的类被混淆 -keep public class * extends android.app.Activity 如果我们要保留一个类中的内部类不被混淆则需要用$符号...,如下例子表示保持ScriptFragment内部类JavaScriptInterface中的所有public内容不被混淆。...class/merging/* # dump.txt文件列出apk包内所有class的内部结构 -dump class_files.txt # seeds.txt文件列出未混淆的类和成员
go(){ x = 42; // 可以使用OuterClass内的所有 } } public void doStuff(){ // 从外部类以“内”的代码初始内部实例....内部类 内部对象 = 外部对象.new 内部类构造函数; } } 注意点: 内部类的实例一定会绑在外部类的实例上。...如果对象在继承树上有个不可序列化的祖先类,则该不可序列化类以及之上的类的构造函数就会执行,一旦构造函数连锁启动后将无法停止。也就是说从第一个不可序列化的父类开始,全部都会重新初始状态。.../classes com/headfirstjava/*.java -d 后参数表示classes的输出目录,会自动建立对应的目录 执行后目录结构: source/com/headfirstjava...Names(String instrument){ // enum的构造函数,传入参数见上面JERRY,BOBBY括号内的。
,则会把状态值从1变为2,也就是设置可重入次数,而当另外一个线程获取锁时发现自己并不是该锁的持有者就会被放入AQS阻塞队列后挂起。...state的值,成功则直接返回,失败则将当前线程封装为类型为Node.EXCLUSIVE的Node节点后插入到AQS阻塞队列的尾部,并调用LockSupport.park(this)方法挂起自己。...,具体是设置状态变量state的值,成功则直接返回,失败则将当前线程封装为类型为Node.SHARED的Node节点后插入到AQS阻塞队列的尾部,并使用LockSupport.park(this)方法挂起自己...(int arg)和void acquireSharedInterruptibly(int arg),这两套函数中都有一个带有Interruptibly关键字的函数,那么带这个关键字和不带有什么区别呢?...需要由AQS的子类来提供newCondition函数。 下面来看当一个线程调用条件变量的await()方法而被阻塞后,如何将其放入条件队列。
为什么反射方法的方法名不是multiple?这里是反射混淆后的代码,自动化补丁支持ProGuard混淆,下文有进一步的描述。 originClass是出现bug class的对象。...实现 上面的介绍只是自动化的冰山一角,实际使用时问题就会变得错综迷离,市场上各大App包括美团点评的产品基本上都是ProGuard混淆优化后的,代码变得晦涩难懂,ProGuard大大地增加了自动化补丁的难度...,那么经过ProGuard后fun函数会被处理为void fun_xxx(String s)(这种情况属于ProGuard优化范围内,当ProGuard力度达到一定的强度后就会出现),如果在生成补丁那次的代码对...体现到代码层面上做的事情就是:混淆类名、方法名、字段名,修改方法、字段访问性,删除方法(上例中内部类的构造方法),方法的内联,甚至是减少方法的参数(这就改变了方法签名)等等。...大体可以总结为三大问题:混淆、优化、内联,其中优化相关操作,比如说改变方法签名和删除方法,我们可以把这类问题划归到内联,因为在优化后的代码里面这些方法和内联的方法一样,都消失了。
public VideoView (Context context, AttributeSet attrs) 创建一个带有attrs属性的VideoView实例。...public VideoView (Context context, AttributeSet attrs, int defStyle) 创建一个带有attrs属性,并且指定其默认样式的VideoView...) (译者注:取得调整后的尺寸。...关于MeasureSpec类的额外说明:MeasureSpec是一个android.view.View的内部类。它封装了从父类传送到子类的布局要求信息。...public void suspend () (译者注:挂起视频文件的播放)
但是在PHP内,由于匿名函数是通过闭包类实现的( Anonymous functions are implemented using the Closure class),因此多数人混淆了闭包技术和匿名函数...匿名函数就只是一个「函数」,一个没有名字的函数而已。在实际应用中,匿名函数通常伴随着使用闭包技术;但闭包并不一定只能用在匿名函数内。...在其他语言内是完全不同的两个概念的(记得区分闭包和匿名函数,匿名函数==闭包)。...不能访问这个外部类(Outer class)的 private(私有)、protected(受保护)方法或者属性。...为了访问外部类(Outer class)protected 属性或方法,匿名类可以 extend(扩展)此外部类。
问题 近期在开发过程中,突然出现混淆后程序出现运行时异常,编译是正常的,不混淆也是正常的, 错误信息如下提示 12-07 14:10:27.056 10603-10603/?...我们继续反编译,看到继承的接口还是有问题的,虽然感觉不是这个引起的但是强迫症,把接口防混淆,加入如下代码: -keep interface com.xzxj.frame.** { *; } 第三步 运行后依然是同样的错误信息...此时对比代码分析,应该是如下问题造成的, 混淆前: public static Context getBaseApplication() { return instance; } 混淆后....**{*;} 第四步: 接下来就是见证奇迹的时刻,果然运行正常,我们看一下混淆后的代码 ?...所以以后遇到混淆的问题就按照提示一步一步排查,一定要反编译文件来分析问题,不然无法定位原因。 还有第一次混淆后建议反编译查看一下包里面的代码,有没有需要混淆的核心代码被keep掉了。
4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。 1.5接口特点 接口可以继承接口 如同类继承类后便拥有了父类的成员,可以使用父类的非私有成员。...我们可以使用static 修饰成员内部类,不用在创建外部类的对象了 我们可以使用abstract,final修饰成员内部类 局部内部类: 在方法内,出了方法之后就无法使用 局部内部类...: 在方法内,出了方法之后就无法使用 匿名内部类: 可以把匿名内部类看成是一个没有名字的局部内部类 定义在方法当中 必须在定义匿名内部类的时候创建他的对象 格式: new...ArrayIndexOutofBoundsException StringIndexOutofBoundsException ClassCastException;//类型转型异常...当一个内部类使用了private修饰后,只能在该类的外部类内部使用。
使用方法的return 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。...静态内部类必需有名称,而普通内部类可以是匿名的 4. 静态内部类没有this引用,只此只能访问外部类的静态成员,而普通内部类可以访问外部类的全部成员 5....静态内部类访问外部类的同名函数时,使用“外部类名.方法名”即可,而普通内部类需要使用“外部类名.this.外部方法” 6....调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。...对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。
AQS有个内部类ConditionObject,用来结合锁实现线程同步。ConditionObject可以直接访问AQS对象内部的变量,比如state状态值和AQS队列。...,则会把状态从1变为2,也就是设置可重入次数,而当另一个线程获取锁时发现不是该锁的持有者就会被放入AQS阻塞队列后挂起。...Node.EXCLUSIVE的Node节点后插入到AQS阻塞队列的尾部,并调用LockSupport.park(this)方法挂起自己。...的值,成功则直接返回,失败则将当前线 程封装为类型为 Node.SHARED 的 Node 节点后插入到 AQS 阻塞 队列的尾部,并使用 LockSupport.park(this)方法挂起自己。...(int arg)和 void acquireSharedlnterruptibly(int arg), 这两套函数中都有一个带有 Interruptibly 关键字的函数,那么带这个关键字和不带有什么
super E> c) { Arrays.sort(a, c); } }此时发现Arrays.asList() 构造函数 是有其内部类 ArrayList...进行实例化的,而其内部类 ArrayList 并没有提供 remove() 方式,而是继承了 AbstractList 抽象类,顾Arrays.asList() 调用的是父类的remove() 方法;...* * @throws UnsupportedOperationException {@inheritDoc} * @throws ClassCastException...* * @throws UnsupportedOperationException {@inheritDoc} * @throws ClassCastException...,在调用 set() ,add() , remove() 会抛出 throw new UnsupportedOperationException(); 自定义的异常。
为了避免我们的劳动成果被窃取,也避免出现安全漏洞和隐患,此篇文章从混淆的原理到代码和资源文件的混淆实践做一下阐述。 混淆前: ? 混淆后: ?...Entry Point经常是带有main methods,applets,midlets的classes,它们在混淆过程中会被保留。...Android Studio 默认的混淆方案及字段解读 开启混淆 参见google官方文档压缩代码和资源 要通过Proguard启动代码压缩,在build.gradle文件内相应的构建类型中添加minifyEnabled....jar test.apk 混淆过程中会输出log,混淆后会出现和apk同名的文件夹,里面包含了混淆后mapping的对应文件,新签名打包的apk和混淆后的资源文件目录。...混淆前资源文件: ? 混淆后资源文件: ? 可以看到资源文件的路径以及文件名都被混淆了。
领取专属 10元无门槛券
手把手带您无忧上云