导航:首页 > 源码编译 > mir编译技术

mir编译技术

发布时间:2025-01-29 06:23:19

A. 一起来找茬:记一起 clang 开启 -Oz 选项引发的血案

在字节跳动终端技术团队的日常维护和定制工作中,我们关注并推动了开源 LLVM 及 Swift 工具链的优化在业务场景中的应用。然而,即使面对复杂而精细的编译器,我们也遇到了挑战。本文将分享一次在使用 clang 开启-Oz 优化选项时发现的编译器缺陷事件。

公司的视频组件为了减小包体大小,在编译时选择使用-Oz级别,以追求代码体积上的极致优化。然而,在实现过程中,我们发现视频组件在导出视频时会出现内存暴涨现象,最终导致 OOM(Out of Memory)闪退,并且这一问题能够稳定重现。

通过使用 Instruments 和 Xcode 的 Memory Graph 功能,我们观察到了大量的 GLFramebuffer 对象被创建,每个对象持有 2MB 的 CVPixelBuffer,从而导致内存占用大量增加。预期中这些 GLFramebuffer 应该通过复用机制避免重复创建,但日志分析显示,每次获取时都没有可用的 buffer,导致不断创建新的 buffer。

我们发现 buffer 的复用依赖于 -[GLFramebuffer unlock] 方法的调用,但观察到这些 buffer 会在导出任务结束后才被解锁。于是,我们着手寻找导致解锁延迟的原因。通过代码阅读,我们发现 GLFramebuffer 由一个 SampleData 对象持有,并在 -[SampleData dealloc] 方法中进行解锁。然而,在使用 autoreleasepool 时,SampleData 对象被推入堆栈并堆积起来,导致内存暴涨,符合我们观察到的 buffer 批量解锁的现象。

在 ARC(Automatic Reference Counting)环境下,对象的生命周期管理依赖于特定的 C 函数,如 objc_autoreleaseReturnValue 和 objc_autorelease。然而,当编译器开启-Oz 优化级别时,该缺陷导致了 SampleData 对象在不应该进入 autoreleasepool 的情况下被推入,从而触发内存管理相关的优化失效。

为了解决这一问题,我们首先需要关闭 ARC,并在工程中添加一个类以触发 autorelease 的断点。通过执行特定操作并结合上下文分析,我们发现内存暴涨现象是由于 -[CompileReaderUnit processSampleData:] 方法中的优化失效导致的。

经过对比,开启-Os 优化级别时,LLVM 的 MIR outliner 功能能够有效减少代码体积。然而,在-Oz 优化级别下,由于 Machine Outliner 的默认启用,导致了编译器在代码复用和优化之间的权衡不当,进而影响了 ARC 优化的执行。

通过对视频组件代码逻辑的深入分析,我们发现开启-Oz 后,特定的汇编代码生成逻辑未能正确处理 ARC 的生命周期管理,导致原本应该被快速释放的对象被推入了 autoreleasepool,从而引发了内存管理问题。

为了修复这一缺陷,我们需要关注优化级别的选择以及编译器与 ARC 之间的交互。字节跳动终端技术团队在处理类似问题时,不仅需要对编译器优化有深入理解,还需对 ARC 的工作原理有清晰认知,以确保代码在不同优化级别下的正确行为。

综上所述,这一事件揭示了开发者在使用编译器优化时的疏忽,以及编译器在处理特定优化场景时的潜在缺陷。通过深入分析和优化策略的调整,我们能够有效解决此类问题,提高代码质量和系统的稳定性。

B. 如何用java语言对即时通讯软件进行加密

一、Java软件加密基本思路
对于应用软件的保护笔者从两个方面进行考虑,第一是阻止盗版使用软件,第二是阻止竞争对手对软件反编译,即阻止对软件的逆向工程。
1、阻止盗版
在软件运行时对自身存在的合法性进行判断,如果认为自身的存在和运行是被授权的、合法的,就运行;否则终止运行。这样即使软件可以被随意复制,只要盗版用户没有相应的授权信息就无法使用软件。
2、阻止反编译
对编译产生的Class文件加密处理,并在运行时进行解密,解密者无法对软件进行反编译。
二、Java软件加密的总体流程
为了保护用Java语言开发的软件,我们设计并实现了一个实用、高强度的加密算法。以下称需要保护的Java软件为“受保护程序”,称对“受保护程序”进行加密保护的软件为“加密程序”。对软件加密保护的流程如图1所示。

三、加密算法分析设计
1、用户信息提取器设计
为了防止用户发布序列号而导致“一次发行,到处都是”的盗版问题,提取用户机器中硬件相关的、具有唯一性的信息——用户计算机的硬盘分区C的序列号,并要求用户将此信息与用户名一起返回,之后用“序列号生成器”根据用户返回信息生成一个唯一合法的软件注册序列号发回用户,用户即可使用此号码注册使用软件。
这个信息提取器使用Winclows 32汇编以一个独立的小程序方式实现,程序代码如图2所示。

2、序列号生成器与序列号合法性判断函数的设计
序列号生成器与序列号合法性判断函数中运用RSA加密算法。在序列号生成器中是使用私钥将用户返回的信息(硬盘序列号,用户名)进行加密得到相应的注册序列号;在序列号合法性判断函数中使用私钥将用户输入的注册序列号解密,再与(硬盘序列号,用户名)进行比较,一致则调用程序装载器将程序其他部分解密装入内存,初始化删环境并运行程序主体;否则退出。
RSA加密算法的实现需要使用大数运算库,我们使用MIRACL大数库来实现RSA计算,序列号生成器的主要代码如下:
char szlnputString[]=”机器码和用户名组成的字符串”;
char szSerial[256]=[0];//用于存放生成的注册码
bign,d,c,m; //MIRACL中的大数类型
mip→IBASE=16; //以16进制模式
n= mlrvar(0); //初始化大数
d= mirvar(0);
c= mirvar(0); //C存放输入的字符串大数
m= mlrva(o);
bytes to big( len, szlnputString,c);
//将输入字符串转换成大数形式并存入变量c中
cinstr(n,”以字符串形成表示的模数”);//初始化模数
cinstr(d,”以字符串形成表示的公钥”)://初始化公钥
powmod(c,d,n,m); //计算m=cdmod n
cotstr(m,szSerial);//m的16进制字符串即为注册码
序列号合法性检测函数的主要代码如下:
char szlnputStringL]=”机器码和用户名组成的字符串”;
char szSerial[ 256]=”用户输入的序列号”
bign,e,c,m; //MIRACL中的大数类型
mip→IBASE=16; //以16进制模式
cinstr(m,szSerial); //将序列号的16进制转成大数形式
cinstr(n,”模数n的字符串形式”);//初始化模数n
cinstr(e,”字符串形式的公钥”);//初始化公钥
if compare(m,n)==-1) //m<n时才进行解密
{
powmod(m,e,n,c);//计算m=me mod n
big_to _bytes(0,c,szSerial,0); //转为字符串
return lstrcmp( szlnputString,szSerial);
}
3、强耦合关系的设计
如果在序列号合法性检测函数中简单地使用图3所示流程:

解密者可以使用以下几种手段进行攻击:
(1)修改“判断合法性子函数”的返回指令,让它永远返回正确值,这样可以使用任意的序列号,安装/使用软件。
(2)修改判断后的跳转指令,使程序永远跳到正确的分支运行,效果和上一种一样。
(3)在“判断合法性子函数”之前执行一条跳转指令,绕过判断,直接跳转到“正常执行”分支运行,这样可以不用输入序列号安装/使用软件。
为阻止以上攻击手段,笔者在程序中增加了“序列号合法性检测函数”与程序其他部分“强耦合”(即增强其与程序其他部分的关联度,成为程序整体密不可分的一部分,一旦被修改程序将无法正常工作)的要求(见图1),并且设置一个“完整性检测函数”用于判断相关的代码是否被修改过。当然,基于同样的原因,“完整性检测函数”也必须与程序其他部分存在“强耦合”关系。
强耦合关系通过以下方式建立:
在程序其他部分的函数(例如函数A)中随机的访问需要强耦合的“序列号合法性检测函数”和“完整性检测函数”,在调用时随机的选择使用一个错误的序列号或是用户输入的序列号,并根据返回结果选择执行A中正常的功能代码还是错误退出的功能代码,流程如图4所示。

经过这种改进,如果破解者通过修改代码的方式破解将因“完整性检测”失败导致程序退出;如果使用SMC等技术绕过“序列号合法性判断函数”而直接跳至序列号正确时的执行入口,在后续的运行中,将因为随机的耦合调用失败导致程序退出。破解者要破解软件将不得不跟踪所有进行了耦合调用的函数,这显然是一个艰巨的任务。
4、完整性检测函数的设计
我们使用CRC算法算出需进行完整性检测的文件的校验码,并用RSA加密算法的公钥(不同于序列号合法性检测中的公钥/私钥对)将其加密存放在特定的文件中,在检测时先用CRC算法重新生成需进行完
整性检测的文件的校验码,并用私钥将保存的校验码解密,两者相比较,相等则正常运行;否则退出。
5、程序加载器的设计
与编译成机器码执行的程序不同,Java程序只能由Java虚拟机解释执行,因此程序加载器的工作包括:初始化Java虚拟机;在内存中解密当前要运行的class文件;使解密后的c:lass文件在虚拟机中运行,在
需要时解密另一个class文件。图5是用于初始化JVM的代码:

以上介绍了我们设计的针对Java软件的加密保护方法,其中综合运用了多种加密技术,抗破解强度高;使用纯软件保护技术,成本低。经笔者在Windows系列平台上进行测试,运行稳定,效果良好。
在研宄开发过程中,我们还总结出加密保护软件的一些经验:
1、对关键代码和数据要静态加密,再动态解密执行;要结合具体的工作平台使用反跟踪/调试技术;
2、要充分利用系统的功能,如在Windows下使用DLL文件或驱动程序形式能得到最大的丰又限,可以充分利用系统具有的各种功能;
3、如果可能应该将关键代码存放在不可禚复制的地方;
4、序列号要与机器码等用户信息相关以阻止盐复布序列号;
5、加密流程的合理性比加密算法本身的强度更重要。

C. explorer.exe病毒!

这个木马杀除比较棘手,。

这个木马进入计算机后,产生主要的三个文件是:interapi32.dll,interapi64.dll,exp1orer.exe特别狡猾的是容易和Explorer.exe混淆。它是数字1不是字母l。这个病毒入驻进程以后,会大量的消耗系统资源,并会跟着资源管理器一同启动。杀除方法如下:

1、关闭Xp系统的还原功能。具体的可以进入组策略查找或是右击我的电脑属性,关闭系统还原功能。

2、然后在运行键入regedit,打开注册表编辑器。删除以下键值

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}]
@="hookmir"

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}\\InprocServer32]
@="C:\\\\WINNT\\\\system32\\\\interapi64.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}\\ProgID]
@="interapi64.classname"

[HKEY_CLASSES_ROOT\\interapi64.classname]
@="hookmir"

[HKEY_CLASSES_ROOT\\interapi64.classname\\Clsid]
@="{081FE200-A103-11D7-A46D-C770E4459F2F}"

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks]
"{081FE200-A103-11D7-A46D-C770E4459F2F}"="hookmir"

3、重新启动系统,进入文件夹选项菜单,单击查看选项卡,显示隐藏的文件和文件夹,显示系统文件,扩展名。然后在Windows/WINNT(2000/NT)/system32下找到interapi32.dll,interapi64.dll,exp1orer.exe三个文件,将其删除就可以了。
(注:exp1orer.exe伪装成了jpg的图片格式图标。小心谨慎。还有文件夹选项卡在杀除病毒后可以自己把它改回到原来的状态)

还有这些情况你也能造成你说的那些后果

进程名称: explorer 或者 explorer.exe

所在路径: (系统安装目录盘)C:\windows\explorer.exe
进程全称: Microsoft Windows Explorer
中文名称: 微软windows资源管理器

描述:
Windows 资源管理器,可以说是 Windows 图形界面外壳程序,它是一个有用的系统进程。 注意它的正常路径是 C:\Windows 目录,否则可能是 W32.Codered 或 W32.mydoom.b@mm 病毒。

explorer.exe出错的几种可能原因:
1.系统资源不足。如果机器配置低的话建议不要同时开启太多应用程序。另外可适当加大虚拟内存,特别是经常玩大型游戏。这种情况下升级机器是最根本的解决办法呵呵。

2.系统文件损坏。检查explorer.exe的文件大小,正常情况下应该显示为237k或者238k,如果大小不一致,可运行sfc/scannow扫描系统文件。若explorer.exe程序本身损坏,可以从别的机器上拷贝一个explorer.exe文件到本机,调用任务管理器,接入explorer.exe进程,然后新建任务拷贝新的文件到系统盘\WINNT(2000)或\WINDOWS(XP)目录下。

3.软件冲突(特别是右键第三方加载项)。譬如输入法,清华紫光输入法3.0版本有的时候会出现explorer.exe出错,取消清华紫光输入法,用其他输入法输入会没有问题。清华紫光输入法4.0版本未发现类似问题。苹果美化版的rar惹的祸,把它卸载了暂时就没有这个错误了,你也可以看是不是安装了苹果美化版的rar,有的话,也可以卸载了来看一下。
装了酒精120%或者酒精52%虚拟光驱,在番茄 的系统中很容易出现explorer.exe错误。卸载有时候会解决问题 。

4.病毒。(wc98pp.dll)
网络协议处理器 - 电子书编译工具Web Compiler相关。
wc98pp.dll文件本身并没有影响,很多计算机上都有此文件,但是当explorer.exe出错的时候,删除此文件可以解决问题,然后从注册表中搜索相关键值删除。
usign.dll,有人提到这个文件与wc98pp.dll两个文件类似,删除这两个文件可以清除IE中不断跳出小广告。在公司的计算机中未发现此文件。

5.windows升级造成的
大家都知道我们用的是盗版xp,既然是盗版的,肯定会出现各种各样的错误.微软也不是sb,肯定会搞一些问题来惩罚我们,所以建议大家不要上网自动更新,并且把自动更新关掉(实际上这个更新没p用)

6.系统内核错误。此类情况暂时无法解决,重新安装系统。

7.内存问题。有人通过更换内存,解决了这个问题,所以这应该是个原因,不过如果这个出问题就比较麻烦了,所以先考虑前面几个原因。

8.其他原因。计算机运行某个程序等待时间过长,比如读取数据,尤其是光盘或者外界设备的数据的时候,也会出现explorer.exe出错。

exeplorer.exe是系统的外壳。这个文件因为开机就被加载到内寸中。所以这个文件通常不会损坏。发生错误是因为注册表的中与exeplorer关联的项发生异常。原因很多,不好查找。所以一般只有重新安装系统。如果嫌麻烦,使用启动盘启动系统,在恢复控制台中修复

阅读全文

与mir编译技术相关的资料

热点内容
xshell连接linux命令 浏览:5
把多个文件夹的内容合并在一起 浏览:479
基于单片机的浇花系统设计ppt 浏览:683
卷积码编译码及纠错性能验证实验 浏览:352
请在删除驱动器之前暂停加密什么意思 浏览:785
光催化pdf 浏览:98
java字符串包含某字符 浏览:526
ssm身份认证源码 浏览:466
预排序遍历树算法 浏览:671
加密装置如何打开ping功能 浏览:478
python下载372 浏览:901
u盘子文件夹隐藏 浏览:296
本地误删svn文件夹 浏览:685
海康威视python通道名 浏览:241
如何用app覆盖全部曲库 浏览:602
变异布林源码 浏览:686
表格加密设置打印区域 浏览:437
卡耐基pdf下载 浏览:924
现在最流行的单片机 浏览:89
机顶盒刷机源码 浏览:986