代码解混淆
A. js混淆后的代码如何解密
混淆的作用就是用无意义的关键字符替代原来有意义的关键字符,让浏览者“看不懂”代码,不了解代码的运行逻辑,也就无法复用。
混淆不同于加密解密,因为原来有意义的字符已经被替换了,不存在算法上的反推,任何的技术不可能再得出原来的那些有意义的字符。
所以理论上,混淆后的代码无法解密。但因为它的整个运算逻辑关系链是完整的,与混淆前的代码关系链是完全一致的,所以非要“破解”,只能说摸清它的逻辑关系链,人为去做的话,烧脑又复杂。技术上需要一定的运算能力来做这个工作,比如云计算甚至超级计算机,但即便“破解”,它也是只能分析出一个函数大致是干什么用的,原来的关键字符名称还是不可能得出。
B. 解密php混淆代码,求解码(过程)完整方法。。
不知道你给的代码全不全,解密后只有这一段
<?php
$v000000=;
if(preg_match(O0O0000O0('.'),$v000002[1],$v000003))
{
$v000000=str_replace(O0O0000O0(',,$y[0]);
$content=str_replace('),,$v000000);
$v000000=base64_decode($v000000);
}
?>
C. JS代码混淆了,怎么反混淆回去
js反混淆需要借助第三方工具:
1、在网络搜索js混淆还原
D. 混淆过的代码有办法还原吗
工具:
apktool,作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
dex2jar,作用:将apk反编译成java源码(classes.dex转化成jar文件)
jd-gui,作用:查看APK中classes.dex转化成出的jar文件,即源码文件
反编译流程:
一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到该目录下,
打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktool.bat d -f [apk文件 ] [输出文件夹])
获取成功之后,发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。
如果你想将反编译完的文件重新打包成apk,那你可以:输入apktool.bat b test(你编译出来文件夹)便可
之后在之前的test文件下便可以发现多了2个文件夹:
build
dist(里面存放着打包出来的APK文件)
二、Apk反编译得到Java源代码
下载上述工具中的dex2jar和jd-gui ,解压
将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,
在命令行下定位到dex2jar.bat所在目录,输入dex2jar.bat classes.dex,
在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了
E. 混淆过的js代码如何还原
1:利用IE开发人员工具(IE8开始已经自带,IE7以前需要下载安装IEDeveloperToolbar)进行反混淆,
2:代码实现
混淆后的测试代码
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c]);return p;}('1("0-6");2 4(){1("0-5")}8 3=2(){1("0-7")};4();3()',9,9,'忧郁的匹格|alert|function|b|a|反混淆测试2|反混淆测试1|反混淆测试3|var'.split('|'),0,{}))
开始实施:
2.加入一个div容器 id="divTest"
3.最关键的一步--赋值执行:(在上面混淆的代码中,将eval()中的内容提取出来赋值(或直接打印)给document.getElementById('divTest').innerText)
document.getElementById('divTest').innerText=function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c]);return p;}('1("0-6");2 4(){1("0-5")}8 3=2(){1("0-7")};4();3()',9,9,'忧郁的匹格|alert|function|b|a|反混淆测试2|反混淆测试1|反混淆测试3|var'.split('|'),0,{})
打开xxx.html 显示结果:(反混淆后的代码已经被压缩了,去掉了换行等字符)
alert("忧郁的匹格-反混淆测试1");
function a(){alert("忧郁的匹格-反混淆测试2")}
var b=function(){alert("忧郁的匹格-反混淆测试3")};
a();
b();
PS:使用packed这个混淆过的js都可以使用这个方法还原,找了几个项目里面混淆过的js都可以还原,只是去掉了换行符,
F. 混淆字符串后能破解吗
基础知识
物极必反。我们已经研究了阅读Windows内核的方法,现在开始讨论在 我们自己的驱动编码中采用特殊的编码方法,来简单地防止反汇编阅读。这是有趣的一种事态:一方面我们研究如何阅读别人的(尤其是MS的)代码;另一方面, 我们不得不采取措施保护自己的技术不被他人简单地窃取。
我这里要用到的这种方法不同于加壳或者加密。加壳和加密的方法比较单一,从而容易被人以同样单一的方法整体解密,同时内核驱动中进行加密稍显复杂,难以做 得稳定,而且我手头没有成熟的整体加密的代码。实际上代码如果在运行,则一定必须被解密,因此从内存中得到解密的代码并不困难。所以我并不太倾向于使用加 壳或者加密的方案。
刘涛涛的“扭曲变换”是根本的防止逆向解决方案,但是需要付出巨大的努力才得以实现。
下面的一些方法是比较简单的。这样的做法显然不能完全防止逆向,但是能起到一定的“遮掩”作用。好处是随时可以做,而且可以个人根据代码的重要程度,决定哪些部位做,哪些部位不做。无论有多简陋,有胜于无。
刘涛涛的扭曲变换
由于破解技术的发展,实际上大部分商业软件的合法性验证机制都变成了仅具有装饰性,而且一些难以开发的底层软件的技术细节,往往在发行不久就被人理解并发表在网上。这成为许多开发者厌恶的事(当然另一些开发者则乐于此道)。
于是如何让编译后的机器代码更难以理解就成为一个切实有用的研究方向。编译器有效地优化了代码,但这仅仅是将代码变得更简单。一般地说,简单的东西总是比复杂的要容易理解,虽然和源代码的关系变得模糊了。
国内著名技术牛人刘涛涛在网上发表“扭曲变换”的思想。这个思想和“优化”完全相反,主旨不是让代码更简单、效率更高,而是让代码更加复杂——毫无疑问效率也更低。但是相比技术秘密的泄露,效率的损失其实并不那么重要了。
这种复杂性有着无限的潜力。比如,读者计划一次从北京到上海的旅行,最近的直线航行路线当然只有一条。但是如果想要路线更长更复杂的话,则完全有无限种可 能:你可以先从北京抵达纽约,在纽约休息后前往南极,然后北上到达撒哈拉沙漠,最后再前往上海。复杂的代码使破解者无法找到验证相关代码的所在,也使试图 窃取技术的读者一无所获。
刘涛涛的工具可以将编译后的obj文件进行扭曲,链接后生成的可执行文件变得极难阅读,而且可以反复地执行下去:一段代码可以无限地变大变长——功能却是和原来等价的。这真是不可思议的技术。
技术细节
在代码中,出现了直接字符串是非常不妥的一件事。往往这些常数字符串在反汇编的时候会直接被人看见,对反工程者是最好的引导。
以下的代码都会暴露我们的字符串:
char *str = "mystr";
wchar_t buffer[2] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
隐藏这些常数字符串并不能完全防止逆向工程,但是毫无疑问的是,会给逆向工程增加很多麻烦。
隐藏这些字符串的手法是:在写代码的时候并不写字符串的明文,而是书写密文,总是在使用之前解密。这样的手法的后果是,在静态反汇编的时候,反工程者是看不见字符串的。但是,反汇编者显然会在调试的时候看见字符串。
在调试的时候才看见合法的字符串比静态反汇编的时候看见字符串要麻烦许多,因为一般只有对一段代码有兴趣才去调试它。而之所以对那段代码有兴趣,有些时候是因为看见了感兴趣的字符串。全部跟踪调试所有的代码,是艰巨的任务,只有具有重大价值的目标才值得那样去做。
想保护代码,请首先保密常数字符串。
不过有点要注意的是,你不能把所有的字符串都用同样的一招进行加密,至少不能用相同的密钥;否则,也许一个简单的解密程序就把你所有的字符串恢复为明文了。
考虑:
char *str = "mystr";
改为:
char str[] = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12}
如果认为异或是最简单的加密方法,那么0x12就是这里的密钥。现在编译出来的字符串已经面目全非了,当然,要解密这个字符串需要一个函数。
char *dazeEstr(char *str, char key)
{
char *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
你可以试试静态反汇编下面的代码:
char *str = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12};
dazeEstr(str,0x12);
printf(str);
当然你通过分析一定会知道printf的结果。调试也可以知道结论,但是比直接用眼睛可以看见可是麻烦多了。当然这样写代码也有些让人抓狂,但是,你总是可以先按自己的本来的习惯写完代码,然后把关键的字符串这样处理。
下面是一个宽字符的处理方法。
wchar_t *dazeEstrW(wchar_t *str, wchar_t key)
{
wchar_t *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
下面的代码:
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
其实总是可以改为:
wchar_t buffer[] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,buffer);
那么加密的写法是:
wchar_t buffer[] = {
L'h' ^ 0x3a,L'e' ^ 0x3a,L'l' ^ 0x3a,L'l' ^ 0x3a,
L'o' ^ 0x3a,L' ^ 0x3a,'L'w' ^ 0x3a,L'o' ^ 0x3a,
L'r' ^ 0x3a,L'l' ^ 0x3a,L'd' ^ 0x3a,L'.' ^ 0x3a,
L'/0' ^ 0x3a};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,dazeEstrW(buffer,0x3a));
比 较明显的缺陷是书写常数字符串的时候变得麻烦。我一直在追寻更简单的写法,但是遗憾的是,我还没有找到。怎么说呢?如果你觉得隐蔽是值得的,那就这样做。 你甚至可以用更复杂的加密算法,只要你能算出密文,然后填写在代码常数中,不过那样修改代码变得太困难了。如果你能写一个预编译工具自动修改代码,确实是 一个好办法,不过对于一种仅仅防止肉眼直观看到字符串的方式,更复杂的加密方法往往没必要,因为无论多复杂的算法,解密算法都很容易在你自己的代码里找到
G. 怎样破解被混淆的Java代码
如果连变量名都混淆了,就是说所有有具体意义的英文变量名都用a,b,c,x,y等等来表示,那这是不可能还原的,因为电脑也不可能知道你这个a实际上代表了你的年龄而那个c代表了你老婆的胸围!但如果只是个事混淆,那网上倒有不少工具可以格式化源代码!自己搜一搜吧!推荐一款编辑器,IntelliJ,很不错,值得一提的是,我用过的众多编辑器中,这款编辑器的代码格式化功能最强大!
H. 如何破解混淆的js代码
js反混淆需要借助第三方工具:
1、在网络搜索js混淆还原
2、把要还原的代码放在第一个文本框,点击js解混淆就可以了。
结果在下面显示