问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

代码反平庸吗?

发布网友 发布时间:2022-04-29 11:54

我来回答

2个回答

懂视网 时间:2022-05-15 20:51

这篇文章主要介绍了js 概率计算(简单版),需要的朋友可以参考下

核心代码:


通过随机数大小来判断,最好访问哪个网址。大家可以根据自己的需求修改即可。

热心网友 时间:2022-05-15 17:59

代码反混淆(deobfuscation)和代码混淆(obfuscation)对应,是其逆过程。维基百科将代码混淆定义为故意生*类难以理解的源代码或机器码的过程("In software development, obfuscation is the deliberate act of creating source or machine code that is difficult for humans to understand.")。代码反混淆可以理解为将原本人类难以理解的代码转化为简单的、可理解的、直观的代码的过程。

这篇文章主要介绍一下
"Big Code" 在代码反混淆领域的应用。更具体一点就是介绍一下提出 "JSNice" 和 "Deguard"
的两篇文章,这两篇文章虽然已经发表快五年了,但至今没有文章Follow这两份工作,因为文章已经将使用 "Big Code"
做代码命名反混淆做到了极致。后来的人无法在这个问题上推陈出新,脱颖而出。

"Big Code": 代码托管网站如GitHub上的大量免费可用的高质量代码被称为 "Big Code" ,这些数据结合统计推理或深度学习为新兴的开发工具的出现提供了契机。

概率图模型:概率图模型是用图来表示变量概率依赖关系的理论,结合概率论与图论的知识,利用图来表示与模型有关的变量的联合概率分布。

问题

为了项目的安全,开发者在打包发布项目时会对代码进行混淆加密,包括但不限于用无意义的短变量去重命名类、变量、方法,以免代码被轻易破解泄露。另外由于JS脚本主要用于Web开发,对其进行混淆还能压缩脚本的大小,使得浏览器下载、加载更加快速,提升用户的浏览体验。

这一类通过对类、变量、方法重命名的混淆方案确实能加大其他开发者对代码的理解难度。其他开发者不干了,为了能方便理解他人混淆后的代码,学习(抄袭)他人的经验,针对这一类混淆方法的反混淆方法也应运而生。

下面先展示一下安卓APP的代码混淆技术:

图1. Java程序的代码混淆过程

经过混淆的代码在功能上是没有变化的,但是去掉了部分名称中的语义信息。因为种种*,这类混淆也不可能对所有的名称都进行替换。上图中的SQLiteHelper、SQLiteDatabase和Cursor就是一个证明,这些名称都是安卓API,如果将这些类名混淆会影响代码的功能。

理论上一个有经验的安卓开发者可以在这些有限的提示下为所有的名称找到富含语义的表示,所以反混淆只需要一个有经验的开发者(有经验的开发者:???我做错了什么)。退一步,找不到有经验的开发者怎么办,没关系,GitHub有高质量的各种项目,现训练一个有经验的开发者也行。不过为了人道主义,消灭996剥削,程序员表示可以用程序代替人,正好可以用GitHub数据训练一个程序做这个反混淆嘛!理论存在,实践开始。

JSNice[1]

用程序代替人其实并不简单,针对上图中的反混淆问题,程序需要具有“联想”和“推理”能力,比如从a
extends
SQLiteHelper这一句中,a应该很可能也是Helper类,结合类中有SQLiteDatabase实例推理出比较符合a的语义的类名是DBHelper。

针对以上两点,程序需要先有关系的概念,能从一个词“联想”到另一个词,然后还要有推理的能力,能通过约束从几个候选词中找到最符合的那个词。怎么做这个事呢?虽然有很多的未混淆的JS脚本供程序学习,但在反混淆JS脚本时,程序无法理解复杂的JS脚本,所以需要将JS脚本表示成一种可以利用已知属性推理未知属性的结构,JSNice采用了概率图模型。

概率图模型相比其他学习算法的优势在于可以利用图结构将已知信息带入知识网络,在使用概率图模型之前,往往要求图结构是已知的。现实中我们没有这些先验知识,但是有大量的样本(未混淆代码)。通过样本学习出未混淆JS脚本的概率图就是JSNice的核心。

具体到JSNice,这个工具想要做的是为JS脚本推测名称(name)和类型(type)。先通过一张图看看JSNice的推理过程。

图2. 一段推理出名称和类型的JavaScript程序及推理名称的推理过程

由于JSNice推理名称和推理类型的过程类似,本文就只阐述推理名称的过程。

1. 确定已知和未知属性

JS脚本中包含了各类代码元素(elements)比如变量,常量,类,方法名,域等。对推理名称问题,元素的属性即带有语义的名称,一个需要推理名称的元素,称其属性未知。不需要推理名称的元素其属性已知。首先需要确定JS脚本中的元素属性是否已知。很容易看出图2(a)代码中属性已知的元素包括:常量0和[]、feild名称length和方法名称push,其他的局部变量如e,t,n,r和i的属性都是未知的。

将问题泛化,如何判断任意的JS脚本中的任意元素的属性是否已知是需要解决的第一个问题。JSNice采用程序分析和人工指定的方式确定元素属性是否已知,简单来说,JSNice认为JS脚本中的常量(constants)、对象属性名(objects
properties)、方法名(methods)和全局变量名(global
variables)都是属性已知的元素,而所有的局部变量的属性都是未知的。值得注意的是JSNice将对象属性名称和API名称直接看做是常量。这个划分是否合理暂不去讨论,但是其确实适用与大部分的JS脚本。有兴趣的读者可以自行研究。

2. 建立依赖网络

第一步获取了JS脚本中的所有元素(属性已知或未知),接下来需要建立元素之间的关系,好方便后续的推理;图2(c)中简单的给出了一些关系,比如"var r = e.length"中可以得到(r, length, L=_.R)的关系。

JSNice实际考虑的元素关系十分复杂,主要有三类,这里简单的进行描述:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哥们,我是黑龙江齐齐哈尔现在高一的,想报考中国刑警学院,什么分数线啊... 没有驾驶证车辆查到有违章怎么办 广州岭南印象园景区介绍 ...从新选像我这样的人不知道读什么又懒又不想背书。 哎呀哎呀好烦阿要期末考试了,我不想背书 高考我是文科的光不想背书怎么办呢 我不想背书啊啊啊啊,考第一真难,现在的初中生涯好难熬,哪位大神教我... 现在初二了 不想背书 感觉好无聊 只想玩 但是成绩还是不错的 我该... ...时候学习还中等。现在基本一窍不通。也不想背书,身边也没人背,上课... [精选]菊花茶的副作用 双卡手机怎么用两个? 如何下载联通营业厅 appuim启动报错 华为手机两个如何同时登录 手机上QQ的文件面对面传的原文件失效了,怎样才可以恢复呢?就是这个base.apk。谢谢_百度问一问 您好,安卓的安装包发给苹果手机变成了base1.apk 请问怎么样才可以接受下载到手机里呀。 一个手机如何同时登录两个? 一台电脑,一台华三交换机,在华三交换机上如何配置ip,才能在电脑测通 华三模拟器交换机怎么给以太口加IP 网购的学生票没取,又从网上退票了,这样会消一次磁吗 H3C的交换机能直接给物理端口设置IP地址么 学生证买票次数只是购票次数吗?买了票,没取,然后退票,算不算用了一次优惠的机会呢? 我从网上买的学生票然后退了这算半价的次数吗 H3C 三层交换机,怎么在物理端口下配置IP 如果使用学生证买火车票后又退了它,这算作是刷一次吗? 用学生证买火车票退票了还算次数吗 华三交换机配置IP 学生票买了没进行资质认证没坐车,也没有刷磁条没有取票算一次吗? 火车学生票退票后计次数吗 我够买了学生票然后退票再买一次会扣几次次数? 如何在手机上同时登录两个 oppo手机2个如何同时上 如何同时使用两个 华为手机如何同时登录两个? 怎么同时使用两个 一个手机同时用两个怎么弄 怎样在同一部手机上用两个微信!怎么才能下载另一个! 一个手机,我有两个手机号码,可以同时用两个吗?怎么弄 奔腾b50水箱放水嘴在哪个位置图片 老款奔腾b50防冻液加到哪个位置 紧急求助,奔腾B50有副水箱吗?如果有的话,在哪个位置? 奔腾B50底槛有没有排水口 奔腾b50防冻液放水阀位置 自动挡奔腾的变速箱加油孔在哪里 奔腾b50自动变速箱加油口在哪 奔腾b50进水管跟回水管是哪根!谢谢 奔腾B50水箱放水阀在那 一汽奔腾b50水温过高开锅喷水怎么解决 一气奔腾B50手自一体变速箱的加油孔在哪 老人机老有骚扰电话怎么办