CN109858204B - 一种基于llvm的程序代码保护方法及装置 - Google Patents

一种基于llvm的程序代码保护方法及装置 Download PDF

Info

Publication number
CN109858204B
CN109858204B CN201910004367.3A CN201910004367A CN109858204B CN 109858204 B CN109858204 B CN 109858204B CN 201910004367 A CN201910004367 A CN 201910004367A CN 109858204 B CN109858204 B CN 109858204B
Authority
CN
China
Prior art keywords
function
callsite
pointed
llvm
complicated processing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910004367.3A
Other languages
English (en)
Other versions
CN109858204A (zh
Inventor
许伟
陈国庆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Jiyi Network Technology Co ltd
Original Assignee
Wuhan Jiyi Network Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Jiyi Network Technology Co ltd filed Critical Wuhan Jiyi Network Technology Co ltd
Priority to CN201910004367.3A priority Critical patent/CN109858204B/zh
Publication of CN109858204A publication Critical patent/CN109858204A/zh
Application granted granted Critical
Publication of CN109858204B publication Critical patent/CN109858204B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明实施例提供一种基于LLVM的程序代码保护方法及装置。其中,方法包括:判定遍历到的中间代码文件中的函数是否需进行复杂化处理,当需进行复杂化处理时,将函数的所有指令保存为调用位CallSite对象;将所有CallSite对象组成第一集合,对第一集合进行清洗以生成第二集合;将第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将新函数替换CallSite对象所指向的函数。本发明实施例提供的方法及装置,通过在编译期改变LLVM中间代码文件,使程序代码中的原始的函数调用复杂化,增加攻击者的分析成本,从而达到程序代码保护目的,并支持针对所有可以原生调用C语言库的语言。

Description

一种基于LLVM的程序代码保护方法及装置
技术领域
本发明实施例涉及计算机安全技术领域,尤其涉及一种基于LLVM的程序代码保护方法及装置。
背景技术
随着科学技术与社会的不断发展,各种应用程序的数量也飞速增长。然而,程序逆向开发人员或程序逆向产品可以通过对应用程序的反编译,轻易获得应用程序中的源代码,从而使得对于应用程序盗版及重打包等现象也层出不穷。
为了增加程序破解者对程序的逆向分析难度,降低程序的破解速度或防止对程序进行破解,需要保护程序内部代码逻辑,而现有技术中,大部分解决方法都针对于java语言,而对于C语言库的语言,目前还没有有效的解决方法。
发明内容
针对现有技术中存在的技术问题,本发明实施例提供一种基于LLVM的程序代码保护方法及装置。
第一方面,本发明实施例提供一种基于LLVM的程序代码保护方法,包括:
判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;
将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;
将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
第二方面,本发明实施例提供一种基于LLVM的程序代码保护装置,包括:
复杂化判定模块,用于判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;
清洗模块,用于将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;
函数替换模块,用于将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
第三方面,本发明实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所提供的方法的步骤。
第四方面,本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所提供的方法的步骤。
本发明实施例提供的一种基于LLVM的程序代码保护方法及装置,通过在编译期改变LLVM中间代码文件,使程序代码中的原始的函数调用复杂化,增加攻击者的分析成本,从而达到程序代码保护目的,并支持针对所有可以原生调用C语言库的语言,包括但不仅限C、C++、C#、Objective-C、Swift、Rust和Kotlin等开发语言。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种基于LLVM的程序代码保护方法流程图;
图2为本发明实施例提供的一种基于LLVM的程序代码保护装置的结构示意图;
图3为本发明实施例提供的一种电子设备的实体结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的一种基于LLVM的程序代码保护方法流程图,如图1所示,该方法包括:
步骤101,判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象。
具体地,LLVM是构架编译器的框架装置,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空闲时间,对开发者保持开放,并兼容已有脚本。
首先,通过LLVM将源代码编译为中间代码文件。
然后,解析中间代码文件,并遍历中间代码文件中的函数,每遍历到一个函数,需要判定该函数是否需要进行复杂化,若判定需进行复杂化,则将该函数的所有指令保存为CallSite对象,需要说明的是,CallSite为C语言库中的一种对象类型,将一个函数的所有指令保存为CallSite对象后,该CallSite对象能够指向该函数。
步骤102,将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合。
具体地,对于一份中间代码文件,将遍历到的每一个函数都进行步骤101中的判定,将最终得到的所有CallSite对象组成第一集合。可以理解的是,由于第一集合中可能并不是每一个CallSite对象所指向的函数都能够进行复杂化,例如,为空指针或依赖上下文的非直接调用指令的函数,需要将此类函数所对应的CallSite对象从第一集合中进行过滤,将第一集合中剩下的CallSite对象组成第二集合。
步骤103,将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
具体地,对第一集合进行清洗后的第二集合中的每一CallSite对象所指向的函数均是可以进行复杂化处理的,对第二集合中的每一CallSite对象所指向的函数进行复杂化处理后,生成对应的新函数,将新函数替换该CallSite对象所指向的函数。
通过上述步骤101、102和103的处理,将最终得到的中间代码文件进行编译,得到目标二进制文件。
本发明实施例提供的方法,通过在编译期改变LLVM中间代码文件,使程序代码中的原始的函数调用复杂化,增加攻击者的分析成本,从而达到程序代码保护目的,并支持针对所有可以原生调用C语言库的语言,包括但不仅限C、C++、C#、Objective-C、Swift、Rust和Kotlin等开发语言。
在上述各实施例的基础上,判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,之前还包括:
基于LLVM,将源代码文件编译为中间代码文件,并遍历所述中间代码文件中的每一函数。
具体地,中间代码文件通常包含多个函数,通过对其进行解析,可以遍历其包含的每个函数,通过对函数的复杂化判定操作和复杂化操作等,完成对函数调用复杂化,从而保证程序代码的安全性。
在上述各实施例的基础上,本发明实施例对上述实施例中是否需进行复杂化处理的判定过程进行说明。即,判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,包括:
若第一判定条件的输出结果为逻辑真,则判定遍历到的LLVM编译生成的中间代码文件中的函数需进行复杂化处理。否则,判定所述函数无需进行复杂化处理。
具体地,第一判定条件可以如下:
生成随机数,并将该随机数作为预设的随机函数的参数,并获取该随机函数的函数值,将该随机数与该函数值进行大小比较,若前者大于后者,则第一判定条件输出逻辑真,否则,输出逻辑假。
需要说明的是,随机函数只要确保能够得到一个随机性的判定结果即可,例如,将随机函数定义为:RandomFunc(arg),其参数为arg(0<arg<1),对于该随机函数,每输入一个arg,该随机函数能够随机输出一个0~1间的浮点数,将输入的arg与输出的浮点数进行大小比较,若前者大于后者,则第一判定条件输出逻辑真,否则,输出逻辑假。
需要说明的是,第一判定条件可根据具体条件进行设定,本发明实施例对其不作具体限定。
本发明实施例提供的方法,通过使用随机数和随机函数作为第一判断条件输出结果的依据,使复杂化操作存在随机性,增加了逆向分析的难度。
在上述各实施例的基础上,本发明实施例对第一集合的清洗过程进行说明。即,根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合,包括:
对于所述第一集合中的每一CallSite对象,判定所述CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令;
将为空指针或依赖上下文的非直接调用指令的函数所对应的CallSite对象从所述第一集合中剔除后,将剩余的CallSite对象组成第二集合。
本发明实施例提供的方法,通过将空指针或依赖上下文的非直接调用指令的函数所对应的CallSite对象从第一集合中剔除,避免了无法从函数外引用指令的问题。
在上述各实施例的基础上,本发明实施例对复杂化处理过程进行说明。即,将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,包括:
对于所述第二集合中每一CallSite对象所指向的函数,根据预设复杂化处理次数,对所述函数进行所述预设复杂化处理次数次封装,将封装后得到的函数作为新函数。
在上述各实施例的基础上,本发明实施例对封装过程进行具体说明。即,对于所述第二集合中每一CallSite对象所指向的函数,根据预设复杂化处理次数,对所述函数进行所述预设复杂化处理次数次封装,将封装后得到的函数作为新函数,包括:
若预设复杂化处理次数为1,则对于所述第二集合中每一CallSite对象所指向的函数,根据所述函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成一次封装,并将封装得到的函数作为新函数;
若预设复杂化处理次数为n,其中,n大于1且为正整数,则对于所述第二集合中每一CallSite对象所指向的函数,根据第n-1次封装得到的函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成第n次封装,并将封装得到的函数作为新函数。
具体地,预设复杂化处理次数可以根据实际场景进行设置,此处对其取值不作限定。举个例子,若预设复杂化处理次数为1,则对于第二集合中每一CallSite对象所指向的函数,进行1次封装。
进一步地,封装的含义为:对于一个CallSite对象所指向的函数,将其称为原函数,根据该原函数的类型、操作符信息等,创建一个用来包装该原函数的函数,该函数用来调用该原函数。需要说明的是,为了保证函数的完整性,需要从原函数中复制一份参数属性、返回值属性和额外属性信息等以补充至该函数中,从而完成一次封装,生成新函数。
图2为本发明实施例提供的一种基于LLVM的程序代码保护装置的结构示意图,如图2所示,该装置包括:
复杂化判定模块201,用于判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;清洗模块202,用于将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;函数替换模块203,用于将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
本发明实施例提供的装置,具体执行上述各方法实施例流程,具体请详见上述各方法实施例的内容,此处不再赘述。本发明实施例提供的装置,通过在编译期改变LLVM中间代码文件,使程序代码中的原始的函数调用复杂化,增加攻击者的分析成本,从而达到程序代码保护目的,并支持针对所有可以原生调用C语言库的语言,包括但不仅限C、C++、C#、Objective-C、Swift、Rust和Kotlin等开发语言。
图3为本发明实施例提供的一种电子设备的实体结构示意图,如图3所示,该电子设备可以包括:处理器(processor)301、通信接口(Communications Interface)302、存储器(memory)303和通信总线304,其中,处理器301,通信接口302,存储器303通过通信总线304完成相互间的通信。处理器301可以调用存储在存储器303上并可在处理器301上运行的计算机程序,以执行上述各实施例提供的方法,例如包括:判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
此外,上述的存储器303中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本发明实施例还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各实施例提供的传输方法,例如包括:判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (5)

1.一种基于LLVM的程序代码保护方法,其特征在于,包括:
判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;
将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;
将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数;
判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,包括:
若第一判定条件的输出结果为逻辑真,则判定遍历到的LLVM编译生成的中间代码文件中的函数需进行复杂化处理;否则,判定所述函数无需进行复杂化处理;
第一判定条件为:生成随机数,并将该随机数作为预设的随机函数的参数,并获取该随机函数的函数值,将该随机数与该函数值进行大小比较,若前者大于后者,则第一判定条件输出逻辑真,否则,输出逻辑假;将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,包括:
对于所述第二集合中每一CallSite对象所指向的函数,根据预设复杂化处理次数,对所述函数进行所述预设复杂化处理次数次封装,将封装后得到的函数作为新函数;
若预设复杂化处理次数为1,则对于所述第二集合中每一CallSite对象所指向的函数,根据所述函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成一次封装,并将封装得到的函数作为新函数;
若预设复杂化处理次数为n,其中,n大于1且为正整数,则对于所述第二集合中每一CallSite对象所指向的函数,根据第n-1次封装得到的函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成第n次封装,并将封装得到的函数作为新函数;
根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合,包括:
对于所述第一集合中的每一CallSite对象,判定所述CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令;
将为空指针或依赖上下文的非直接调用指令的函数所对应的CallSite对象从所述第一集合中剔除后,将剩余的CallSite对象组成第二集合。
2.根据权利要求1所述的方法,其特征在于,判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,之前还包括:
基于LLVM,将源代码文件编译为中间代码文件,并遍历所述中间代码文件中的每一函数。
3.一种基于LLVM的程序代码保护装置,其特征在于,包括:
复杂化判定模块,用于判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,当判定结果为需进行复杂化处理时,将所述函数的所有指令保存为调用位CallSite对象;
清洗模块,用于将所有CallSite对象组成第一集合,并根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合;
函数替换模块,用于将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,并将所述新函数替换所述CallSite对象所指向的函数;
判定遍历到的LLVM编译生成的中间代码文件中的函数是否需进行复杂化处理,包括:
若第一判定条件的输出结果为逻辑真,则判定遍历到的LLVM编译生成的中间代码文件中的函数需进行复杂化处理;否则,判定所述函数无需进行复杂化处理;
第一判定条件为:生成随机数,并将该随机数作为预设的随机函数的参数,并获取该随机函数的函数值,将该随机数与该函数值进行大小比较,若前者大于后者,则第一判定条件输出逻辑真,否则,输出逻辑假;
将所述第二集合中每一CallSite对象所指向的函数进行复杂化处理以生成新函数,包括:
对于所述第二集合中每一CallSite对象所指向的函数,根据预设复杂化处理次数,对所述函数进行所述预设复杂化处理次数次封装,将封装后得到的函数作为新函数;
若预设复杂化处理次数为1,则对于所述第二集合中每一CallSite对象所指向的函数,根据所述函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成一次封装,并将封装得到的函数作为新函数;
若预设复杂化处理次数为n,其中,n大于1且为正整数,则对于所述第二集合中每一CallSite对象所指向的函数,根据第n-1次封装得到的函数的类型、操作符信息,创建一个中间函数,并对所述中间函数补充参数属性、返回值属性和额外属性信息,以完成第n次封装,并将封装得到的函数作为新函数;
根据所述第一集合中每一CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令,对所述第一集合进行清洗以生成第二集合,包括:
对于所述第一集合中的每一CallSite对象,判定所述CallSite对象所指向的函数是否为空指针或依赖上下文的非直接调用指令;
将为空指针或依赖上下文的非直接调用指令的函数所对应的CallSite对象从所述第一集合中剔除后,将剩余的CallSite对象组成第二集合。
4.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至2任一项所述方法的步骤。
5.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1至2任一项所述方法的步骤。
CN201910004367.3A 2019-01-03 2019-01-03 一种基于llvm的程序代码保护方法及装置 Active CN109858204B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910004367.3A CN109858204B (zh) 2019-01-03 2019-01-03 一种基于llvm的程序代码保护方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910004367.3A CN109858204B (zh) 2019-01-03 2019-01-03 一种基于llvm的程序代码保护方法及装置

Publications (2)

Publication Number Publication Date
CN109858204A CN109858204A (zh) 2019-06-07
CN109858204B true CN109858204B (zh) 2021-01-15

Family

ID=66893762

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910004367.3A Active CN109858204B (zh) 2019-01-03 2019-01-03 一种基于llvm的程序代码保护方法及装置

Country Status (1)

Country Link
CN (1) CN109858204B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112445465B (zh) * 2019-08-28 2022-09-13 无锡江南计算技术研究所 基于c代码生成的神经网络模型推理和训练方法
CN112668004B (zh) * 2019-10-16 2022-06-21 武汉斗鱼网络科技有限公司 一种基于llvm的函数校验方法及相关装置

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8893102B2 (en) * 2011-07-27 2014-11-18 Oracle International Corporation Method and system for performing backward-driven path-sensitive dataflow analysis
CN104063635B (zh) * 2014-07-02 2017-09-29 北京深思数盾科技股份有限公司 目标文件的保护方法及保护系统
CN105159828B (zh) * 2015-08-25 2018-02-02 中国人民解放军信息工程大学 源代码级的上下文敏感性检测方法
CN107122169B (zh) * 2017-03-21 2021-02-02 武汉斗鱼网络科技有限公司 一种Flash函数加密的方法及装置
CN107229848A (zh) * 2017-06-12 2017-10-03 北京洋浦伟业科技发展有限公司 一种代码加固方法和装置
CN109101237A (zh) * 2018-08-01 2018-12-28 北京顶象技术有限公司 代码的加密编译方法及装置

Also Published As

Publication number Publication date
CN109858204A (zh) 2019-06-07

Similar Documents

Publication Publication Date Title
US8726255B2 (en) Recompiling with generic to specific replacement
US11106437B2 (en) Lookup table optimization for programming languages that target synchronous digital circuits
CN110149800B (zh) 一种用于处理与源程序的源代码相关联的抽象语法树的装置
US9164744B2 (en) Method and system for program building
CN109784010A (zh) 一种基于llvm的程序控制流混淆方法及装置
CN111723345B (zh) 基于回调函数的控制流混淆方法及系统
US8381199B2 (en) Modular and/or demand-driven string analysis of a computer program
CN109858204B (zh) 一种基于llvm的程序代码保护方法及装置
JP2016525760A (ja) 無関係なコードの特定
EP2700005A1 (en) Method and apparatus for generating resource efficient computer program code
US20170161035A1 (en) Method of Adding Local Variables In Place of Global in JavaScript
Natschläger et al. Deontic BPMN: a powerful extension of BPMN with a trusted model transformation
KR101294708B1 (ko) 행위 오류 분석 장치 및 그 방법
JP2018169693A (ja) 情報処理装置、情報処理方法および情報処理プログラム
US20130152205A1 (en) Interactive analysis of a security specification
US11435989B2 (en) Thread-local return structure for asynchronous state machine
CN114594960A (zh) 一种递归函数解析执行方法、装置及存储介质
US11429358B2 (en) Representing asynchronous state machine in intermediate code
JP5229223B2 (ja) ワークフロー定義変更プログラムおよびワークフロー定義変更方法
Lerch et al. Design your analysis: A case study on implementation reusability of data-flow functions
JP2007122187A (ja) プログラム・コード生成装置
CN109308256B (zh) 一种java程序动态分析方法、设备和存储介质
CN114371852B (zh) 一种编译方法及装置
US11650802B2 (en) Idiomatic source code generation
JP6945434B2 (ja) ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラム

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method and device of program code protection based on llvm

Effective date of registration: 20210622

Granted publication date: 20210115

Pledgee: Bank of China Limited Wuhan Donghu New Technology Development Zone Branch

Pledgor: WUHAN JIYI NETWORK TECHNOLOGY Co.,Ltd.

Registration number: Y2021420000041

PE01 Entry into force of the registration of the contract for pledge of patent right