异步方法混淆跳过配置失效,如何实现异步方法免混淆?
解决异步方法SkipStringHiding规则不生效的问题
问题出在C#异步方法的编译特性上:异步方法会被编译器自动转换成带状态机的结构,原MethodA的实际逻辑会被移到自动生成的类似<MethodA>d__X类的MoveNext方法中,直接配置原方法名根本匹配不到编译后的实际执行方法,所以规则没生效。
下面是几种可行的解决办法:
用通配符覆盖状态机方法
在配置文件里给异步方法名加上通配符,让规则能匹配到编译后生成的状态机相关方法:<SkipStringHiding> <Method>BasicExampleLibrary.Base1::MethodA*</Method> <Method>BasicExampleLibrary.Base1::MethodB</Method> </SkipStringHiding>这里的
*会匹配所有以MethodA开头的相关方法,包括状态机类里的MoveNext,就能覆盖异步方法的实际逻辑部分。直接给方法加特性标记
如果你的混淆器支持特性控制,直接在异步方法上标注跳过特性更靠谱,不需要依赖名称匹配:[SkipStringHiding] public async Task MethodA() { // 方法逻辑 }这种方式会直接告诉混淆器跳过该方法(包括编译后的状态机逻辑)的字符串隐藏处理。
精确匹配状态机方法(不推荐,维护成本高)
先编译项目,查看IL代码找到MethodA对应的状态机类和方法名(比如BasicExampleLibrary.Base1+<MethodA>d__1::MoveNext),然后在配置里精确添加这个方法:<SkipStringHiding> <Method>BasicExampleLibrary.Base1+<MethodA>d__1::MoveNext</Method> <Method>BasicExampleLibrary.Base1::MethodB</Method> </SkipStringHiding>注意:如果方法的参数、内部逻辑有变化,编译后生成的状态机类编号(比如
d__1)可能会变,需要重新调整配置,所以这种方式适合临时测试用。
内容的提问来源于stack exchange,提问作者Deakin
相关产品推荐
相关产品推荐

