关于代码混淆的学习经验求助
本帖最后由 Scan 于 2024-5-14 19:05 编辑
代码地址链接:https://pan.baidu.com/s/1MQcH655USKY0HDT37fp6PA?pwd=52pj
提取码:52pj
--来自百度网盘超级会员V3的分享
请问这个 x1f\x8b\x08\x00\xe4k 这种是怎么弄出来的我知道是进制但是弄不出人家这个效果,我解密就解不出来,自动写出来的一下就解密出来了,他的加密过程有例子吗,给个思路和例子结贴!~~~想学习的一天!~~~
而且他有的JS代码也是经过混淆的!!!
学到他的加密过程就行!!!!需要给出完整的例子,可以加币(需要提前说明)
大家好,在此收集代码混淆学习文件
有效期截止到2024年5月29日19:03,麻烦在此之前点击以下链接将文件发送给我,支持发送任意格式的文件,感谢~
链接:https://pan.baidu.com/disk/main#/transfer/send?surl=ADMAAAAAABIwYA
来自:拯救Safe的轩轩
本帖最后由 Arcticlyc 于 2024-5-14 21:12 编辑
### 首先,你只是对代码进行 encode 操作,而他的代码实际上是 code object,这一点我已经跟你讲过
了解 code object 之前,可以先看一张图
上图是 python 中 pyc 文件的结构,如果你不知道 pyc 可以百度搜索
从上图可以看出,一个 pyc 文件中,从第 16 字节开始(python 3.7+),就是 code object (经过 marshal 序列化后)的二进制数据。
**代码对象 code object 是一段可执行的 Python 代码在 CPython 中的内部表示。**
我们知道,pyc 反编译一般有 uncompyle6(最高支持 py 3.9) 和 pycdc 两个工具。
由于我的环境为 3.11,现在我将演示从 py 到 pyc,并从 pyc 中获取 code object 的过程,然后再通过 code object 重新生成 pyc 文件,最后再通过 pyc 反编译工具将 pyc 文件反编译为源代码的过程。
#### 1. 从 py 到 pyc,获取 code object
```python
# test.py
# 斐波那契数列
def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
fib(1000)
```
#### 2. 通过 code object 生成 pyc 文件
```python
# 通过 code object 生成 pyc
HEADER = magic + b"\x00" * 4
# 时间随便写
HEADER += struct.pack("<I", int(time.time()))
# 大小随便写
HEADER += struct.pack("<I", 30)
code = HEADER + marshal.dumps(pyobj)
Path('test.pyc').write_bytes(code)
```
#### 3. 通过 pyc 反编译工具反编译 pyc 文件
**可以看出,这种方法是可以反编译 pyc 的**
**但是受到代码或是反编译工具本身的影响,反编译的结果可能不完全**
深入了解请参考:
一文带你搞懂Python中的pyc文件
基于web的Crackme
https://www.52pojie.cn/thread-1919650-1-1.html
(出处: 吾爱破解论坛)
基于web版的crackme(20240504_New)
https://www.52pojie.cn/thread-1920287-1-1.html
(出处: 吾爱破解论坛)
(20240505-New)基于web的crackme
https://www.52pojie.cn/thread-1920541-1-1.html
(出处: 吾爱破解论坛)
这些都是我干的,js那块最常见的有escape法解压代码,我另外用https://www.h5pack.com/js-obfuscator,https://www.jsjiami.com/,
引用一个白皮书
JS 代码混淆加密后,能被逆向破解、还原为原始代码吗?
从技术角度而言,JS 代码混淆加密,有多种手段,大体上可分为:编码、加密算法、代码变形、逻辑顺
序变化。 部分可逆
诚然,其中某些是可进行还原的,例如字符编码:字符串内容进行 Unicode 编码、16 进制编码、Base64
编码后,是可逆的。
例程:
console.log("hi");
使用 JS对上面一句代码中的字符进行编码,编码后得到的新代码:
console['\x6c\x6f\x67']("\u0068\u0069");
其中 log 三个字母变成了\x6c\x6f\x67,这是十六进制化了,hi 变成了\u0068\u0069,这是进行了 unicode
化编码。还原方法如下:
\x6c\x6f\x67 的解码方式:
"\x6c\x6f\x67".replace(/\\x(\w{2})/g,function(x){ return String.fromCharCode(parseInt(x,16)) });
\u0068\u0069 的解码方式:
"\u0068\u0069".replace(/\\/g,"%");
此时的阶段性观点:某些是可以还原的。但是如前面所述,混淆加密手段有多种,现实中,正常对 JS 代
码加密时,不可能只使用简单的编码,而还会启用众多其它混淆加密选项。
而更多混淆加密方法,是绝不可能破解或逆向的,比如:
var name = "Tom";
var age = "18";
这两行代码中,定义了两个变量,从名称即可知道,一个是名字,另一个是年龄。
同样用 JS加密后,可能得到:
var _ = "Tom";
var _2 = "18";两个有含义的变量名,变成了无意义的下划线。
试想:如果拿到加密后的代码,如何能知道原来是变量名是什么?绝无可能。
又如下面 3 行代码:
var num1 = 3;
var num2 = 1+2;
var num3=function(s,h){return s^h;}(738158,738157);
加密后得到:
var num1=function(s,h){return s^h;}(874506,874505);
var num2=function(s,h){return s+h;}(722724^722725,768350^768348);
var num3=function(s,h){return s^h;}(738158,738157);
这是对数值进行了变形,加密后的代码逻辑很简单,似乎最终都可以认为赋值是 3,例如:
var num1 = 3;
var num2 = 3;
var num3 = 3;
但,这仅仅是推测,暴力的还原,已然破坏了原始代码逻辑。
而且,这是用简单的代码举例,现实中的代码不能这么简单,且不论代码量级,仅用力过度的还原,已经
破坏了原有的代码含义。
再比如:
同样是上例中的 3 行代码,在加密时使用“僵尸代码植入”后,可以成为:
var _0x;
var num1 = function (s, h) { return s ^ h;}(467688, 467691); _0x = 972677 ^ 972685;
var _0x2;
var num2 = function (s, h) { return s + h;}(754013 ^ 754012, 887759 ^ 887757); _0x2 = "cpde";
var _0x3 = function (s, h) { return s + h;}(807363 ^ 807370, 383146 ^ 383147);
var num3 = function (s, h) { return s ^ h;}(738158, 738157); _0x3 = 738774 ^ 738774;
注:为分辨原始 3 个变量,未对变量名变形。
即:代码中随机插入了无用的“僵尸代码”,而且这些代码可能包含变量、函数、逻辑,还可能有赋值、有
引用。
如实而论:无法区别哪个是原来的变量、哪个是新增的僵尸变量。暂不多缀述,以上多例不可逆操作,已经说明:使用某些技术方案后,混淆加密得到的 JS 代码是不可能
还原为原始代码的,更何况希望逆向到得“100%原始代码”。
此外,JS 代码保护还有很多加密选项,例如 AST 化、虚拟机保护、控制流收缩等等,综合使用起来,会
进一步提升加密保护强度。
补充:代码量因素
还有一个在现实使用中较为重要的因素,影响代码逆向的可能性,那就是:代码量。
如果仅用少量甚至几行简单的代码来测试可逆性,比如:
var a=1;
进行加密后可能得到:
var _a= 0x5db85 ^ 0x5db84;
简单的分析便可知是定义了一个变量,结论似乎是可以逆向。
导致这个误判的原因是:越少量、简单的语句,越缺乏加密的可操作性。因为混淆加密会综合处理众多语
法逻辑,如变量赋值、条件判断、函数调用、成员、方法、属性、字符串、数值等等。越多的逻辑关系,
越有利于组合出复杂的加密算法。而代码量不足的情况下,缺乏足够的可操作逻辑,而仅能生成强度不够
高的加密结果。
因此,少量代码技术测试,无法得出正确的“是否可逆向”结论。 大写的赞给楼主,让我很清楚了,感谢感谢! Arcticlyc 发表于 2024-5-14 20:48
### 首先,你只是对代码进行 encode 操作,而他的代码实际上是 code object,这一点我已经跟你讲过
...
我解了四五次,这个是不是有见不得人的秘密,有后门?加这么多层密,pyc再生成pyc吗,这样操作吗? Scan 发表于 2024-5-15 12:04
我解了四五次,这个是不是有见不得人的秘密,有后门?加这么多层密,pyc再生成pyc吗,这样操作吗?
不清楚为什么这样做 Arcticlyc 发表于 2024-5-15 12:20
不清楚为什么这样做
我大概反序列化了8-10次 出现了 可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生成pyc吗?我也不理解这个作者为什么要这样做 Scan 发表于 2024-5-15 12:23
我大概反序列化了8-10次 出现了 可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生 ...
最终可以看到一点样子了,可能这就是尽头吧,啊哈哈{:301_977:} Scan 发表于 2024-5-15 12:23
我大概反序列化了8-10次 出现了 可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生 ...
要防止反编译可以参考之前给的文章链接,或者参考这篇文章:如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证) collinchen1218 发表于 2024-5-14 21:53
基于web的Crackme
https://www.52pojie.cn/thread-1919650-1-1.html
(出处: 吾爱破解论坛)
大佬,我反序列化别人的代码最后这样
这该如何是好 但是用vscode打开可以隐约看到部分
页:
[1]