圣天诺的虚拟机保护方式:关于那个巨大的二叉树

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情
 

标 题:圣天诺的虚拟机保护方式:关于那个巨大的二叉树。。。。。 (5千字)
发信人:ljtt
时 间:2002-7-7 16:14:19
详细信息:

圣天诺的虚拟机保护方式:关于那个巨大的二叉树。。。。。

先说明一个结构:
CallStruct
{    WORD    key1;
    WORD    key2;
    DWORD    code;
};
这个结构共 8 个字节长,程序开始部分即取自该结构中的数据进行分析,从而进入不同的模块部分。
代码如下:

:004119A6 A194754000              mov eax, dword ptr [00407594]        <---注:地址 00407594 中保存的就是 CallStruct 结构的指针
:004119AB 8B0D94754000            mov ecx, dword ptr [00407594]
:004119B1 668B00                  mov ax, word ptr [eax]            <---取 key1
:004119B4 66A3A0754000            mov word ptr [004075A0], ax
:004119BA 668B5102                mov dx, word ptr [ecx+02]            <---取 key2
:004119BE 668915A4754000          mov word ptr [004075A4], dx
:004119C5 8B4104                  mov eax, dword ptr [ecx+04]        <---取 code
:004119C8 A398754000              mov dword ptr [00407598], eax
:004119CD 011D94754000            add dword ptr [00407594], ebx
:004119D3 33C0                    xor eax, eax
:004119D5 66A1A0754000            mov ax, word ptr [004075A0]
:004119DB 3D42030000              cmp eax, 00000342                    <---判断 key1 从而进入不同的模块部分
:004119E0 7F13                    jg 004119F5
:004119E2 0F84C6010000            je 00411BAE
:004119E8 3DE4000000              cmp eax, 000000E4
:004119ED 0F8481010000            je 00411B74
:004119F3 EBB1                    jmp 004119A6

从以上可以看到 key1 用作代表不同的模块。进一步分析程序,可以分析得出其使用 00407590 、00407594 、00407598 这三个地址来用作数据传递的地址。以后我将其简称为 A 、B 、C 。

key1 的作用知道了,那么来了解一下 key2 的作用。分析可以发现 key2 是在某些模块内部(也就是说并非所有模块)用作取值方式的。
下面以分析 004116D0 处的模块为例:

其调用形式为:    CALL_004116D0(var1,var2)
当 key2 = 68 时,程序实现功能为: 返回 [var1] 的 Byte 字节。(注: [var1] 表示取 var1 地址中的值,以下类同)
当 key2 = D4 时,程序实现功能为: 返回 [[407590] + 4*var1] 的 DWORD 字节。
                (注:即 取407590地址中的值,然后加上4乘以var1的和,再取以"和"为地址的值,返回)

下面列举几个模块和 key2 的组合及相应实现的功能:

key2    模块名1                            模块名2                                模块名3
        4116D0                            411670                                411E1D
        功能:返回 eax                    功能:赋值                            功能:判断某些位是否不为0
68         byte [var1]                    [var1] <=  byte var3                if( [[407590]] & 0x000000FF <> 0 ) ok!
D4        dword [var1 * 4 + [407590]]        [var1 * 4 + [407590]] <= var3        if( [[407590]]              <> 0 ) ok!
234        dword [var1]                    [var1] <= dword var3                if( [[407590]]              <> 0 ) ok!
28E         word [var1]                    [var1] <=  word var3                if( [[407590]] & 0x0000FFFF <> 0 ) ok!
3D5            var1                        直接返回                            if( [[407590]]              <> 0 ) ok!

下面再来具体分析一下各个模块的功能及作用,列举如下:
为简化表达,把 4116D0 、411670  、411E1D 分别命名为 f1( )  、f2( ) 、f3( )
key1    模块起始地址    模块功能
0611    411BCA            类似 411E1D 模块,也会根据key2的值实现判断功能。只是 <> 变为 == 判断即可。
0704    411C1B            f2([407598],key2,f1([407598],key2))
1092    411C4F            [[407590]] += f1([407598],key2)
1109    411C72            [[407590]+4] = call_407598([[407590]+4],[[407590]]) , [407590] += 4
1992    411C9B            f2([407598],key2,[[407590]]) , [407590] += 4
1A44    411CC4            [407590] -= 4, [[407590]] = call_407598()
22B7    411D00            [[407590]] -= f1([407598],key2)
3345    411D23            [[407590]] &= f1([407598],key2)
5910    411FBA            [407594] <= [407598]
654D    411D9D            [[407590]] |= f1([407598],key2)
698A    411E00            f2([407598],key2,0)
7123    411E1D            判断
74BB    411E6E            [[407590]] ^= f1([407598],key2)    
9104    411ED1            [[407590]] *= f1([407598],key2)
AA61    411F2D            [[407590]+C] = call_407598([[407590]+C],[[407590]+8],[[407590]+4],[[407590]]), [407590] += 0xC
B323    411F5F            [[407590]+8] = call_407598([[407590]+8],[[407590]+4],[[407590]]), [407590] += 8    还原算法
BA51    411F8C            [[407590]] = call_407598([407590])
CDD3    411FC9            [[407590]+edi] = [407598] = f1([407598],key2)

归纳可以发现如下:

1、判断模块,分别实现不等跳转和相等跳转。
0611    411BCA            类似 411E1D 模块,也会根据key2的值实现判断功能。只是 <> 变为 == 判断即可。
7123    411E1D            判断

2、四则运算模块,分别实现加、减、乘、等运算。
74BB    411E6E            [[407590]] ^= f1([407598],key2)    
9104    411ED1            [[407590]] *= f1([407598],key2)
1092    411C4F            [[407590]] += f1([407598],key2)
22B7    411D00            [[407590]] -= f1([407598],key2)
3345    411D23            [[407590]] &= f1([407598],key2)
654D    411D9D            [[407590]] |= f1([407598],key2)

3、赋值模块,分别实现不同方式的赋值。
698A    411E00            f2([407598],key2,0)
0704    411C1B            f2([407598],key2,f1([407598],key2))
1992    411C9B            f2([407598],key2,[[407590]]) , [407590] += esi

4、调用函数模块,分别实现不同参数方式函数调用。
1A44    411CC4            [407590] += edi, [[407590]] = call_407598()
BA51    411F8C            [[407590]] = call_407598([407590])
1109    411C72            [[407590]+4] = call_407598([[407590]+4],[[407590]]) , [407590] += esi
AA61    411F2D            [[407590]+C] = call_407598([[407590]+C],[[407590]+8],[[407590]+4],[[407590]]), [407590] += 0xC
B323    411F5F            [[407590]+8] = call_407598([[407590]+8],[[407590]+4],[[407590]]), [407590] += ebx    还原算法

5、其他,实现数据的传递和控制程序流程。
CDD3    411FC9            [[407590]+edi] = [407598] = f1([407598],key2)
5910    411FBA            [407594] <= [407598]

最后说明一下:
这是以前自己分析圣天诺外壳时整理的一些记录。那个二叉树的各个分支就是用于识别各个伪机器码的。上面分析的就是各个伪机器码的作用,以及伪机器码的格式的。这个伪处理机只使用在圣天诺的最外层结构上,而进入核心部分还是和我们常见的程序没有什么区别。

如果你不了解圣天诺的这个伪处理机,那么从某些方面来说防止了暴破,因为我们常常会从弹出的对话框入手来找到程序的关键暴破点,但是这个壳中使用的伪处理机的判断部分是在伪处理机的一个用于进行"判断"的模块(实际上就是一条伪机器码)中,如果你不明白这其中的道理,把这个"判断"模块中的"JZ"语句修改了,就相当于把整个伪处理机中的"判断"模块修改了一样,想象一下如果我们把程序中所有的"JZ"指令改成"JNZ"的后果,这有些类似这个道理。

当然,也有有趣的地方,在其中一个早期版本的圣天诺外壳中,倒是程序中只使用了"JZ"判断模块,如果你把这个"判断"模块修改一下,会出现什么后果?这样伪处理机反而使暴破省事了。


  ©2000-2004 www.PEdiy.com  All rights reserved.
By
KanXue Studio

 

DNA pull-down技术避坑指南:从探针设计到质谱验证的完整实验方案 本文提供了一份详尽的DNA pull-down技术实战避坑指南,涵盖从探针设计、生物素标记、磁珠选择与预处理,到结合洗脱优化及下游质谱验证或Western Blot验证的全流程。重点解析了如何通过精细操作降低非特异性结合、提高实验特异性与重复性,并对比了质谱与WB两种验证路径的适用场景,旨在帮助研究者构建稳健可靠的DNA-蛋白质互作研究体系。 阅读详情

相关推荐

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 225

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 192

SpringCloud 2025王炸更新!GraalVM原生镜像启动速度提升90%实战

在当今云原生和Serverless架构盛行的时代,应用的启动速度已成为衡量技术栈竞争力的关键指标。传统SpringCloud应用由于依赖JVM的动态类加载、反射等机制,启动时间通常超过30秒,在Kubernetes滚动更新和函数计算场景下成为显著性能瓶颈。2025年,SpringCloud迎来里程碑式更新,通过深度集成GraalVM原生镜像技术,实现了启动速度提升90%的惊人突破,让SpringCloud应用正式进入"秒级启动"时代。

小筱在线博客 1099

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 298

conda install出现CondaValueError: Malformed version string invalid character(s)解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二 2.3 步骤三

weixin_43178406的博客 6万+

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 130

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 561

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 782

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

Openclaw第5章 知识库管理

💡:学会使用 OpenClaw构建个人知识库系统,实现网页文章存档、GitHub项目管理、论文笔记整理和跨设备同步。

Maynor的博客 775

Camunda 7.x 系列【22】全局监听器

Camunda支持义一个全局ExecutionListener和一个全局TaskListener,会捕获流程中发生的所有事件的通知,这样可以定义一个全局的审批人检查监听器,作用于所有用户任务。

记录知识、锤炼自我 2942

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 745

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

前程算法屋的博客 1377

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 81

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 207

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 177

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 321

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 150

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 39

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 398

贪心题目:可以到达的最远建筑

为了到达尽可能远的建筑物,在将砖块替换成梯子时,应将高度差最大位置的砖块替换成梯子,此时剩余的砖块数量最多,如果将高度差较小位置的砖块替换成梯子,则剩余的砖块数量较少,能到达的最远建筑物下标不可能更大。开始向后面的建筑物移动,移动过程中维护优先队列存储正高度差,优先队列的队首元素是最大元素,每次遇到正高度差时优先考虑使用砖块,如果砖块数量不够则使用梯子替换最大高度差位置的砖块,直到砖块和梯子都使用完毕时,到达的建筑物即为最远建筑物。如果以最佳方式使用给定的梯子和砖块,返回可以到达的最远建筑物的下标。

stormsunshine的博客 170

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 179

【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析

本工程基于Deep-OC-SORT核心模块,重构并适配了EmbeddingComputer(外观特征提取)、CMCComputer(相机运动补偿)与OCSort(主跟踪器)三类。前者实现整框/网格模式的特征提取与L2归一化;后者通过稀疏光流或SIFT匹配估计仿射变换,补偿相机运动;主跟踪器融合IoU、外观相似度与方向一致性,支持模块开关与自定义组件,实现高效多目标跟踪。

Jayson 博客 331

【Deep-OC-SORT 05】多轨迹算法Deep-OC-SORT-IoU代价与VDC方向一致性融合过程

本工程在DeepOcSort中实现三路融合关联:IoU(位置重叠)、VDC(速度方向一致性)与外观相似度,通过加权求和生成总相似度,取负作为匈牙利算法的代价。其中,VDC利用轨迹惯性方向与检测方向的点积判断运动一致性,抑制反向误匹配;外观分采用网格化余弦距离并结合动态权重AW,提升遮挡场景下的鲁棒性。支持关闭外观分支(--emb_off),且通过快路径优化加速多数帧处理。最终配对经IoU复核,确保位置合理性,有效减少密集场景下的ID切换。

Jayson 博客 334
上一篇: Regards Matt Pietrek
下一篇: P2P原理介绍
CryButNoTear
博客等级 码龄20年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值