首页> 中国专利> 在目标进程中安全创建线程的方法、装置、介质及设备

在目标进程中安全创建线程的方法、装置、介质及设备

摘要

本发明提供了一种在目标进程中安全创建线程的方法、装置、介质及电子设备,包括:编写导入模块;修改系统函数,以加载所述导入模块;查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程,本发明通过修改创建地址的线程创建个数及执行函数地址,实现线程的新建,即通过修改数据实现创建,无需修改或增加代码,能够安全绕过系统监测。

著录项

  • 公开/公告号CN114840847A

    专利类型发明专利

  • 公开/公告日2022-08-02

    原文格式PDF

  • 申请/专利权人 武汉斗鱼鱼乐网络科技有限公司;

    申请/专利号CN202110144068.7

  • 发明设计人 周志刚;

    申请日2021-02-02

  • 分类号G06F21/54(2013.01);G06F9/445(2018.01);

  • 代理机构北京众达德权知识产权代理有限公司 11570;

  • 代理人彭博

  • 地址 430000 湖北省武汉市东湖新技术开发区软件园东路1号软件产业4.1期B1栋三层A301室007号(自贸区武汉片区)

  • 入库时间 2023-06-19 16:12:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-19

    实质审查的生效 IPC(主分类):G06F21/54 专利申请号:2021101440687 申请日:20210202

    实质审查的生效

  • 2022-08-02

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及计算机软件控制技术领域,尤其涉及一种在目标进程中安全创建线程的方法、装置、介质及设备。

背景技术

对于一些场景需要在目标进程中创建一个新的线程从而方便在线程中完成部分功能。例如直播软件需要在目标优先软件中创建一个线程来获取游戏的画面数据,或者是来在游戏进程中绘制弹幕内容等等。

然而目前游戏厂商会对创建的进程进行检测,以阻止外部“外挂”进程的创建,目标进程通常会对系统函数CreateThread的调用来监管,从而不管使用何种方法来调用都会被目标进程检测到。

因此亟需一种更为安全的方法能够在目标进程中创建线程。

发明内容

本发明提供了一种在目标进程中安全创建线程的方法,通过修改创建地址的线程创建个数及执行函数地址,实现线程的新建,即通过修改数据实现创建,无需修改或增加代码,能够安全绕过系统监测。

本发明提供的技术方案为:

一种在目标进程中安全创建线程的方法,包括:

编写导入模块;

修改系统函数,以加载所述导入模块;

查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;

修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程。

优选的是,所述导入模块的加载设置,包括如下步骤:

获取加载程序库;

查找所述加载数据库,获得加载目标程序的所有加载模块,并按照加载顺序排序;

将排在首位的加载模块作为目标模块;

Hook所述加载数据库,获得所述目标模块的导入表,在所述导入表中增加导入项;

其中,所述导入项包括所述导入模块的名称和所述导入模块的导出函数的名称。

优选的是,所述线程创建地址的查找,包括如下步骤:

遍历主程序和模块程序;

查找并记录所有引入系统函数的模块和引入系统函数的位置;

筛选所述引入系统函数的位置获得真实调用位置;

在所述真实调用位置中查找具有循环特征的创建线程的调用代码,并将所述调用代码的创建指令的起始位置作为线程创建地址;

其中,所述引入系统函数为CreateThread函数。

优选的是,筛选所述引入系统函数的位置获得真实调用位置,其包括如下步骤:

通过hook系统函数记录的所有引入系统函数的位置,并记录下所有的调用位置;

比较所述调用位置与所述引入系统函数的位置,并将重合的位置作为真实调用位置。

优选的是,所述具有循环特征的创建线程的调用代码,需至少满足循环条件中的一种或几种;所述循环条件包括:具有标记创建位置的循环标记代码、具有线程个数存储到寄存器的存储指令、具有线程创建的参数创建指令、具有调用线程的创建函数、具有线程创建的计数递增指令和具有比较线程创建个数的指令;其中,所述寄存器为EAX、EBX和ECX寄存器中的一种或几种。

优选的是,所述新建线程,其包括如下步骤:

通过使用内存访问断点记录创建线程个数的变量;

修改所述创建线程个数的变量;

并修改系统线程函数的执行参数。

优选的是,所述修改系统线程函数的执行参数包括:

获取导入模块的重定位表格,并解析所述的重定位表格得到重定位数据;

修改所述执行参数在所述重定位表格中的内存地址,以使新建线程生效。

一种在目标进程中安全创建线程的装置,包括:

导入模块;

修改模块,其用于修改系统函数,以加载所述导入模块;

查找模块,其用于查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;

创建模块,修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程。

一种电子设备,包括应用处理器和存储器,所述处理器用于实现所述存储器中存储的计算机管理程序式时实现在目标进程中安全创建线程的方法的步骤。

一种计算机可读存储介质,其上存储有计算机管理类程序,所述计算机管理类程序被处理器执行时实现所述的在目标进程中安全创建线程的方法的步骤。

有益效果

本发明提供了一种在目标进程中安全创建线程的方法,通过修改创建地址的线程创建个数,实现线程的新建,即通过修改数据实现创建,无需修改或增加代码,能够安全绕过系统监测。

本发明将目标程序加载过程中循环创建多个线程的位置作为线程创建地址,只需要通过修改线程创建个参量,多创建一个线程,有效规避掉通过验证代码完整性的监测手段。

附图说明

图1为本发明所述的在目标进程中安全创建线程的流程图。

图2为本发明所述的修改系统函数使在主程序运行时必然加载导入模块的流程图。

图3为本发明所述的查找线程创建地址的流程图。

图4为本发明所述的在目标进程中安全创建线程的的装置的结构示意图。

图5为本发明所述的目标进程中安全创建线程的的硬件装置示意图。

图6为本发明所述的电子设备的结构示意图。

图7为本发明所述的计算机可读存储介质的结构示意图。

具体实施方式

以下由特定的具体实施例说明本发明的实施方式,熟悉此技术的人士可由本说明书所揭露的内容轻易地了解本发明的其他优点及功效,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,在本发明的描述中,术语“中”、“上”、“下”、“横”、“内”等指示的方向或位置关系的术语是基于附图所示的方向或位置关系,这仅仅是为了便于描述,而不是指示或暗示所述装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。

此外,还需要说明的是,在本发明的描述中,除非另有明确的规定和限定,术语“设置”、“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域技术人员而言,可根据具体情况理解上述术语在本发明中的具体含义。

如图1所示,基于背景技术提出的技术问题,本发明提供了一种在目标进程中安全创建线程的方法,包括:

步骤S110、编写导入模块;

具体的说,包括如下内容:编写的一个模块,并提供一个编写模块的导出函数,在本实施例中,将编写的模块命名为xx.dll,,模块的导出函数命名为export函数名称。

需要说明的是,在本步骤中通过编写导入模块以与线程创建关联,实现将新建线程与模块相关联的有益效果。

步骤S120、修改系统函数,以加载步骤S110中编写的导入模块;

在本实施例中,模块的动态载入方式是指在编译之前并不知道将会调用哪些函数,完在运行过程中根据需要决定应调用哪些函数。方法是用LoadLibrary函数加载动态链接库到内存,当一个模块xx.dll用LoadLibrary显式加载后,在任何时刻均可以通过调用FreeLibrary(释放动态数据库)函数显式地从内存中将其卸载。即主程序加载其他模块均通过调用系统函数loadlibrary(加载数据库)来加载。

因此通过修改系统函数loadlibrary,使在主程序运行时必然加载步骤S110编写的导入模块xx.dll。

如图2所示,在一个具体实施例中,修改系统函数loadlibrary的具体过程为:

步骤S121、获取并查找加载程序库,获得加载目标程序的所有加载模块;

具体的说,程序启动后,主程序加载其他模块会调用系统函数loadlibrary来加载,因此,通过查找加载数据库loadlibrary,可以获得加载目标程序的所有加载模块。

步骤S122、获取加载数据库的优先加载模块;

具体的说,可以通过如下步骤实现:将获得的所有加载模块按照加载顺序排序;并将排在首位的加载模块作为目标模块;将排在首位的加载模块作为目标模块;

需要特别说明的是,通过对主程序的加载模块进行排序,可以识别出主程序运行时的优先加载的模块,挑选优选加载的模块作为目标模块,即实现主程序执行时,必然加载挑选的目标模块的有益效果。

步骤S123、Hook加载数据库,获得所述目标模块的导入表,在导入表中增加导入项;

具体的说,实现主程序执行时,必然加载挑选的目标模块,具体包括:

Hook(钩子函数)加载数据库loadlibrary,获得目标模块的导入表,在导入表中增加导入项;导入项包括导入模块的名称xx.dll,和模块的导出函数export。其中,Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递,在本实施例中通过钩子函数改变加载数据库loadlibrary中导入表的导入项,即hook函数在运行时动态的将额外增加导入项依附现进程,从而实现插入额外导入模块的目的。

需要特别说明的是,在本实施例中,通过在导入表中增加导入项,导入项为步骤S110编写的导入模块,即主程序执行时,实现了通过修改加载数据库,必然加载步骤S110中编写模块的有益效果,为新建线程提供了加载模块。

需要说明的是,步骤S110和步骤S120不存在执行步骤上的先后区分,在实际应用中,可以更改创建执行顺序。

步骤S130、查找线程创建地址;

如图3所示,其中,线程创建地址为目标程序运行时,同时循环创建多个线程的位置;具体的说,在一个具体实施例中,步骤S130中同时循环创建多个线程的位置德查找,具体包括如下步骤:

步骤S131、遍历主程序和模块程序,并解析其中的导入表;

步骤S132、查找并记录所有引入系统函数的模块和引入系统函数的位置;其中,引入系统函数为CreateThread函数。

具体的说,依据查找导入表中是否存在导入项引用了系统函数CreateThread(建立新的线程的函数),记录下所有存在引入系统函数的模块和该模块中所有引入系统函数CreateThread的位置。

步骤S133,由于有引入不一定代表其有调用,因此需要对引用系统函数的位置进行筛选确认;

其中,对引用系统函数的位置进行筛选确认具体包括:

通过hook系统函数记录的所有引入系统函数的位置,并记录下所有的调用位置;

比较所述调用位置与引入系统函数CreateThread的位置,并将重合的位置作为真实调用位置;

进一步的,在一个具体实施例中,通过hook则打印调用日志则可以确保一定被调用了,从而获取的所有调用系统函数CreateThread的调用点和引入系统函数CreateThread的位置的交集,得到最终的所有实际有调用系统函数的位置。

需要特别说明的是,在本实施例中,线程创建地址的查找通过hook系统函数记录的所有引入系统函数的位置,并通过筛选获得真实调用位置,实现了提高了查找创建地址准确度的有益效果。

步骤S134、真实调用位置中查找具有循环特征的创建线程的调用代码,并将调用代码的创建指令的起始位置作为线程创建地址;

在一个具体实施例中,具有循环特征的创建线程的调用代码,需至少满足循环条件中的一种或几种;其中,循环条件包括:第一个循环条件、具有标记创建位置的循环标记代码;第二个循环条件、具有线程个数存储到寄存器的存储指令;第三个循环条件、具有线程创建的参数创建指令;第四个循环条件、具有调用线程的创建函数;第五个循环条件、具有线程创建的计数递增操作;第六个循环条件、具有比较指令操作。

具体的说,可通过查找如下代码实现,找出循环代码的特征以x86汇编代码(windows平台)为例,可通过查找如下代码实现:得到具有循环操作的汇编代码特征:

其中,第一个循环条件、具有标记创建位置的循环标记代码,即为找出具有循环特征的创建线程的调用代码,循环标记开始的地址为线程循环创建的地址;具体的汇编代码举例为:Loc_402008;其中,Loc_402008:循环起始标号。

第二个循环条件、.具有线程个数存储到寄存器的存储指令,即为将线程个数存储到该寄存器中的指令,指令是将当前的线程个数传入到寄存器中,其中寄存器则必须是同用寄存器,作为一种优选,寄存器为EAX、EBX和ECX寄存器中的一种或几种。具体的汇编代码举例为:Mov ebx,count;表示将循环的计数count标记赋值给ebx寄存器。

第三个循环条件、具有线程创建的参数创建指令,在本实施例中通过调用系统函数CreateThread来创建线程,且系统函数CreateThread包含6个参数,因此在线程创建时必须压入堆栈6个参数,因此通过寻找一处有存储6个数据到栈中的操作,即为线程创建调用系统函数的6个参数。

其中,系统函数CreateThread包含6个参数具体包括:lpThreadAttributes为线程函数CreateThread的第一个参数,表示线程对象的安全属性,dwStackSize为线程函数CreateThread的第二个参数,表示线程空间大小,lpStartAddress为线程函数CreateThread的第三个参数,表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址,lpParameter为线程函数CreateThread的第四个参数,表示传给线程函数的参数,dwCreationFlags为线程函数CreateThread的第五个参数,表示定额外的标志来控制线程的创建,lpThreadID为线程函数CreateThread的第六个参数,表示返回线程的ID号。

具体的说,利用汇编代码举例说明,包含如下代码:

Push arg1;

Push arg2;

Push arg3;

Push arg4;

Push arg5;

Push arg6;

其中,Push arg1表示堆栈中压入参数1;Push arg2表示堆栈中压入参数2;Pusharg3表示堆栈中压入参数3;Push arg4表示堆栈中压入参数4;Push arg5表示堆栈中压入参数5;Push arg6表示堆栈中压入参数6;

需要特别说明的是在本实施例中,通过调用系统函数CreateThread函数创建线程,而CreateThread函数必然包含上述6个函数,因此,通过查找存储6个数据到栈中的操作,即可查找到线程创建指令。

第四个循环条件、具有调用线程的创建函数,即为寻找一处函数调用指令callcreateThread,此函数是调用线程创建函数。

具体的说查找调用线程创建函数即为查找代码Call CreateThread;

其中,call指令是调用线程函数CreateThread创建线程,因此可以通过这个地方的call指令和CreateThread的函数内存地址知道当前是调用系统函数CreateThread来创建线程。

第五个循环条件、具有线程创建的计数递增指令,具体的说,查找已经线程创建计数的递增操作,该指令是inc寄存器用于数据计数线程创建个数的统计操作。

第六个循环条件、具有线程创建个数的比较指令,具体的说,查找有一个指令用于比较线程总个数和当前已经创建的线程个数的比较操作,如果比他小则循环到创建指令的起始位置继续创建线程。即函数调用完成后,需要查看调用完成是否有对计数标记的判断代码。

具体的说,利用汇编代码举例说明,包含如下代码:inc ebx;Cmp ebx,Num;jleshort Loc_402008和Cmp ebx,Num;

其中,ebx寄存器存储了当前已经创建的次数,num表示总的线程创建个数,对计数标记增加1,表明当前已经调用了一次线程函数。如果不满足则会继续调用此循环来创建线程,否则退出线程创建逻辑。jle short Loc_402008是一个判断功能代码,如果不满足跳转到线程创建的起始位置.。

在一个具体实施例中,具有循环特征的创建线程的调用代码的查询过程,可通过查找如下代码特征实现:Doc_xxx、Mov寄存器、必须压入堆栈6个参数、Call CreateThread、inc寄存器和Cmp寄存器。

Doc_xxx表示循环开始标记,此标记标识当前开始循环创建线程。

Mov寄存器;其用于记录线程当前个数;必须寻找一条指令是将当前的线程个数传入到寄存器中,其中作为一种优选,寄存器是同用寄存器,可以是EAX、EBX和ECX通用寄存器中的一个。

然后,必须压入堆栈6个参数、其中,压入堆栈的指令采用push通用寄存器,push指令出现6条表示压入6个参数。

Call CreateThread;表示采用调用线程函数来创建线程。

inc寄存器;用于增加一个线程计数,使用通用寄存器。

Cmp寄存器;用于记录总线程个数;此指令是比较当前已经创建的线程和我们需要创建的总线程个数的比较。

Inc寄存器;此指令是用于增加一个线程计数,使用通用寄存器。Cmp寄存器;总线程个数;此指令是比较当前已经创建的线程和需要创建的总线程个数的比较。在本实施例中的模板代码是创建循环线程的整个过程,只需要匹配上这段代码说明在循环创建一个线程。实际中不同的模块编译会在不同的代码位置,其中使用的寄存器也会存在不一样,因此本实施例把这段代码的特征提取出来,使用抽象的数据,从而保障能够匹配到所有循环创建线程的代码。

需要特别说明的是,在本实施例中,通过查找具有循环特征的创建线程的调用代码,并给出循环条件,且在循环条件中设置比较指令操作,实现了保障能够匹配到所有循环创建线程的代码的有益效果。步骤S140、修改创建地址的线程创建个数和线程执行函数地址,以新建线程。具体的说通过修改执行函数的核心参数lpStartAddress(参数子程序参数),可以使新增线程的执行相应的功能。

在目标程序的线程创建中寻找可以创建线程的位置,修改目标进程的线程创建个数,从而增加一个额外的线程创建。

需要特别说明的是,在本实施例中,创建多个线程的位置只需要修改一个参数则可以让程序多创建一个线程,而修改参数属于数据段不属于代码段,实现隐藏创建的有益效果,不会被系统检测到。

在一个具体实施例中,步骤S140修改创建地址的线程创建个数和线程执行函数地址,以新建线程。包括如下步骤:

通过使用内存访问断点记录创建线程个数的变量,即通过使用内存访问断点来查找到的记录创建线程个数的变量,实现当线程创建时,通过修改访问段点数据增加新的线程。

修改创建线程个数的变量。

修改系统线程函数的执行参数,修改线程函数地址有很多方法,但是必须选择没有修改代码的方法。

具体的说,在本实施例中,通过使用系统的线程函数CreateThread来创建线程,具体的实现方式为:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadID

其中,lpThreadAttributes为线程函数CreateThread的第一个参数,表示线程对象的安全属性,dwStackSize为线程函数CreateThread的第二个参数,表示线程空间大小,lpStartAddress为线程函数CreateThread的第三个参数,表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址,lpParameter为线程函数CreateThread的第四个参数,表示传给线程函数的参数,dwCreationFlags为线程函数CreateThread的第五个参数,表示定额外的标志来控制线程的创建,lpThreadID为线程函数CreateThread的第六个参数,表示返回线程的ID号。

需要特别说明的是,在本实施例中,此线程的创建新增创建的,而是使用目标进程自身的代码来创建,因此目标进程检测该线程时不会认为线程的创建存在问题,而会认为该线程的创建是目标进程自身创建的,实现了隐藏创建的有益效果。

其中,核心参数是lpStartAddress表示线程会执行函数的功能。

在另一实施例中,具体的说,修改系统线程函数的执行参数lpStartAddress具体包括:

获取导入模块的重定位表格,并解析所述的重定位表格得到重定位数据;

修改执行参数在所述重定位表格中的内存地址,以使新建线程生效;

由于线程的执行函数lpStartAddress是一个内存地址,其是内存中的一个相对地址,因此其会随着模块加载的内存而变化,会存储在重定位表格中。那么解析重定位表格,能够获取到此函数的内存地址。

需要特别说明的是,通过修改重定位表格中lpStartAddress函数的内存地址,可以实现线程函数创建的时候,创建的线程执行的函数地址是由填入重定位数据来计算得到的,因此不需要修改重新的代码而只需要修改重定位中的数据可以实现线程函数执行的lpStartAddress函数地址的改变,实现了目标进程帮助创建了线程,并同时线程执行的函数是需要执行的函数的功能的有益效果。

如图4所示,本发明实施例中还提供了一种在目标进程中安全创建线程的的装置的一个实施例,该装置包括:导入模块210、修改模块220、查找模块230和创建模块240。其中,修改模块220用于修改系统函数,以加载导入模块;查找模块230用于查找线程创建地址,线程创建地址为目标程序运行时,同时循环创建多个线程的位置;创建模块240修改创建地址的线程创建个数和线程执行函数地址,以新建线程。

上面图4从模块化功能实体的角度对本申请实施例中的在目标进程中安全创建线程的的装置进行了描述,下面从硬件处理的角度对本申请实施例中的在目标进程中安全创建线程的的装置,进行详细描述。

请参阅图5,本申请实施例中的推荐在目标进程中安全创建线程的装置为一个实施例,包括:

输入装置301、输出装置302、处理器303和存储器304(其中处理器303的数量可以一个或多个,图3中以一个处理器303为例)。在本申请的一些实施例中,输入装置301、输出装置302、处理器303和存储器304可通过总线或其它方式连接.

其中,通过调用存储器304存储的操作指令,处理器303,用于执行如下步骤:

编写导入模块;

修改系统函数,以加载所述导入模块;

查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;

修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程。

通过调用存储器304存储的操作指令,处理器303,还用于执行图1对应的实施例中的任一方式。

如图6所示,为本申请实施例提供的电子设备的实施例示意图。

在另一实施例中,本发明还提供了一种电子设备,包括存储器410、处理器420及存储在存储器420上并可在处理器420上运行的计算机程序411,处理器420执行计算机程序411时实现以下步骤:

编写导入模块;

修改系统函数,以加载所述导入模块;

查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;

修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程。

在具体实施过程中,处理器420执行计算机程序411时,可以实现图1-3对应的实施例中任一实施方式。

由于本实施例所介绍的电子设备为实施本申请实施例中在目标进程中安全创建线程的电子设备,故而基于本申请实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法不再详细介绍,只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。

请参阅图7,图7为本申请实施例提供的一种计算机可读存储介质的实施例示意图。

如图7所示,本实施例提供了一种计算机可读存储介质500,其上存储有计算机程序511,该计算机程序511被处理器执行时实现如下步骤:

编写导入模块;

修改系统函数,以加载所述导入模块;

查找线程创建地址,所述线程创建地址为目标程序运行时,同时循环创建多个线程的位置;

修改所述创建地址的线程创建个数和线程执行函数地址,以新建线程

在具体实施过程中,该计算机程序511被处理器执行时可以实现图1对应的实施例中任一实施方式。

需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

本申请实施例还提供了一种计算机程序产品,该计算机程序产品包括计算机软件指令,当计算机软件指令在处理设备上运行时,使得处理设备执行如图1-4对应实施例中的风电场数字化平台设计的方法中的流程。

所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号