吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 433|回复: 9
收起左侧

[求助] 关于代码混淆的学习经验求助

[复制链接]
Scan 发表于 2024-5-14 20:13
本帖最后由 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 20:48
本帖最后由 Arcticlyc 于 2024-5-14 21:12 编辑

首先,你只是对代码进行 encode 操作,而他的代码实际上是 code object,这一点我已经跟你讲过

了解 code object 之前,可以先看一张图

1.png

上图是 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

# test.py
# 斐波那契数列
def fib(n):
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

fib(1000)

freecompress-2.png

2. 通过 code object 生成 pyc 文件

# 通过 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 文件

3.png

可以看出,这种方法是可以反编译 pyc 的
但是受到代码或是反编译工具本身的影响,反编译的结果可能不完全

深入了解请参考:
https://www.jb51.net/article/271203.htm


免费评分

参与人数 4吾爱币 +3 热心值 +3 收起 理由
爱飞的猫 + 1 + 1 热心回复!
Scan + 1 + 1 用心讨论,共获提升!
SVIP9大会员 + 1 热心回复!
芽衣 + 1 我很赞同!

查看全部评分

collinchen1218 发表于 2024-5-14 21:53
基于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-obfuscatorhttps://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;
简单的分析便可知是定义了一个变量,结论似乎是可以逆向。
导致这个误判的原因是:越少量、简单的语句,越缺乏加密的可操作性。因为混淆加密会综合处理众多语
法逻辑,如变量赋值、条件判断、函数调用、成员、方法、属性、字符串、数值等等。越多的逻辑关系,
越有利于组合出复杂的加密算法。而代码量不足的情况下,缺乏足够的可操作逻辑,而仅能生成强度不够
高的加密结果。
因此,少量代码技术测试,无法得出正确的“是否可逆向”结论。
 楼主| Scan 发表于 2024-5-14 22:06
大写的赞给楼主,让我很清楚了,感谢感谢!
 楼主| Scan 发表于 2024-5-15 12:04
Arcticlyc 发表于 2024-5-14 20:48
[md]### 首先,你只是对代码进行 encode 操作,而他的代码实际上是 code object,这一点我已经跟你讲过

...

我解了四五次,这个是不是有见不得人的秘密,有后门?加这么多层密,pyc再生成pyc吗,这样操作吗? 2372d8def363d201800abec3b3339bc.png
Arcticlyc 发表于 2024-5-15 12:20
Scan 发表于 2024-5-15 12:04
我解了四五次,这个是不是有见不得人的秘密,有后门?加这么多层密,pyc再生成pyc吗,这样操作吗?

不清楚为什么这样做
 楼主| Scan 发表于 2024-5-15 12:23
Arcticlyc 发表于 2024-5-15 12:20
不清楚为什么这样做

我大概反序列化了8-10次 出现了 bbc350068d17df22944ae971f5e5501.png    可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生成pyc吗?我也不理解这个作者为什么要这样做
 楼主| Scan 发表于 2024-5-15 12:25
Scan 发表于 2024-5-15 12:23
我大概反序列化了8-10次 出现了   可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生 ...

061e69cecbeb36e09d532fba2b8423b.png   
最终可以看到一点样子了,可能这就是尽头吧,啊哈哈
Arcticlyc 发表于 2024-5-15 12:58
Scan 发表于 2024-5-15 12:23
我大概反序列化了8-10次 出现了   可以在左下角ly上面看到vx字样,假如咱们也要多次加密的话 是通过pyc生 ...

要防止反编译可以参考之前给的文章链接,或者参考这篇文章:如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)
 楼主| Scan 发表于 2024-5-15 17:14
collinchen1218 发表于 2024-5-14 21:53
基于web的Crackme
https://www.52pojie.cn/thread-1919650-1-1.html
(出处: 吾爱破解论坛)

大佬,我反序列化别人的代码最后这样
image.png


这该如何是好 但是用vscode打开可以隐约看到部分
image.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-29 10:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表