一种补丁执行方法及装置与流程
- 国知局
- 2024-10-15 09:22:03
本技术涉及计算机,尤其涉及一种补丁执行方法及装置。
背景技术:
1、进程在运行中,可能存在缺陷,为了使得进程可以正常运行,需要修正进程中存在的缺陷。若暂停进程去修复缺陷,则会影响进程的性能和进程的运行速度。如何在进程不暂停的情况下,修复进程中存在的缺陷,有待进一步研究。
技术实现思路
1、本技术提供了一种补丁执行方法及装置,实现了补丁文件即可以调用进程中的线程变量,又可以调用动态库中的线程变量。
2、第一方面,本技术提供了一种补丁执行方法,其特征在于,方法包括:获取到补丁文件,补丁文件用于修复第一进程中存在的缺陷,补丁文件中引用有第一线程变量,第一线程变量为第一进程或者第一动态库中定义的线程变量;在补丁文件中新增got表,got表包括第一表项和第二表项,第一表项为第一线程变量的偏移量,第二表项为第一线程变量所在模块的模块id;获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id;将第一偏移量和第一id更新至got表中,得到更新补丁文件;运行更新补丁文件,通过第一函数获取到第一线程变量的地址,第一函数是通过got表中第一偏移量和第一id获取到第一线程变量的地址的;通过第一线程变量的地址调用第一线程变量。
3、这里,第一线程变量所在模块的模块id,可以指第一线程变量所在进程的进程id或者第一线程变量所在动态库的动态库id。
4、通过该方法,实现了补丁文件即可以调用进程中的线程变量,又可以调用动态库中的线程变量。
5、结合第一方面,在一种可能的实现方式中,在通过第一函数获取到第一线程变量的地址之前,方法还包括:获取到补丁文件中引用第一线程变量的第一指令;在第一指令为非通过函数获取第一线程变量的地址的情况下,将第一指令修改为第二指令,第二指令为通过第一函数获取到第一线程变量的地址;运行更新补丁文件,通过第一函数获取到第一线程变量的地址,具体包括:运行更新补丁文件并执行更新补丁文件中的第二指令,通过第一函数获取到第一线程变量的地址。
6、这样,在第一线程变量为第一进程和/或第一动态库中的线程变量的情况下,若第一指令不是通过函数获取第一线程变量的地址,将第一指令修改为第二指令,第二指令是通过系统函数获取到第一线程变量的地址的,保证补丁文件可以正常调用第一进程中的第一线程变量,也可以调用第一动态库中的第一线程变量。
7、结合第一方面,在一种可能的实现方式中,在第一指令为非通过函数获取第一线程变量的地址的情况下,将第一指令修改为第二指令,具体包括:在第一指令为非通过函数获取第一线程变量的地址且第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令。
8、这样,仅在第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令,保证补丁文件可以正常调用第一动态库中的第一线程变量。
9、结合第一方面,在一种可能的实现方式中,方法还包括:在第一线程变量为第一进程中定义的线程变量的情况下,运行更新补丁文件并执行更新补丁文件中的第一指令,获取到第一线程变量的地址。
10、第一指令为通过第一进程获取到第一线程变量的地址。这样,在第一线程变量为第一进程中定义的线程变量的情况下,第一进程可以直接获取到第一线程变量的地址,从而无需将第一指令修改为第二指令。
11、结合第一方面,在一种可能的实现方式中,将第一偏移量和第一id更新至got表中,得到更新补丁文件,具体包括:在加载补丁文件之前,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中;在加载补丁文件之后,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
12、这样,不区分第一线程变量为进程中的线程变量还是动态库中的线程变量,均在加载补丁文件之后,再获取到第一线程变量所在模块的模块id。
13、结合第一方面,在一种可能的实现方式中,将第一偏移量和第一id更新至got表中,得到更新补丁文件,具体包括:在加载补丁文件之前,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中;在加载补丁文件之后,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
14、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一动态库中的线程变量的情况下,在加载补丁文件之后,再获取到第一线程变量所在第一动态库的动态库id。
15、结合第一方面,在一种可能的实现方式中,方法还包括:在加载补丁文件之前,在第一线程变量为第一进程中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id,并将第一偏移量和第一id更新至got表中,得到更新补丁文件。
16、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一进程中的线程变量的情况下,在加载补丁文件之前,就可以获取到第一线程变量所在第一进程的进程id。
17、结合第一方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中或者第一进程中包括第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id或者第一进程的进程id;通过第一函数获取到第一线程变量的地址,具体包括:通过第一函数基于第一id获取到多个线程控制块的地址;基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址;通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址。之后,再通过第一函数将第一线程变量的地址传递至第一线程。
18、这样,对于第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,均通过第一函数获取到第一线程变量的地址。
19、结合第一方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id;通过第一函数获取到第一线程变量的地址,具体包括:通过第一函数基于第一id获取到多个线程控制块的地址;通过第一函数基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址;通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址;通过第一函数将第一线程变量的地址传递至第一线程。
20、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量是第一动态库中的线程变量的情况下,通过第一函数获取到第一线程变量的地址。
21、结合第一方面,在一种可能的实现方式中,第一线程控制块中存储有第一进程中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一进程的进程id;
22、运行所述更新补丁文件并执行所述更新补丁文件中的所述第一指令,获取到所述第一线程变量的地址,具体包括:运行所述更新补丁文件并执行所述更新补丁文件中的所述第一指令;响应于所述第一指令,通过所述第一进程获取到所述第一进程的首地址;通过所述第一进程基于所述第一进程的首地址、第二偏移量和第三偏移量确定出多个线程控制块的地址,所述第二偏移量为所述第一进程中定义的所述第一线程变量距离所述第一进程中所述第一指令之间的偏移量,所述第三偏移量为预设值;通过所述第一进程基于第一线程id从所述多个线程控制块的地址中获取到所述第一线程控制块的地址;通过所述第一进程基于所述第一线程控制块的地址和所述第一偏移量获取到所述第一线程变量的地址;通过所述第一进程将所述第一线程变量的地址传递至所述第一线程。
23、其中,第三偏移量可以是一个线程控制块的大小。
24、这样,在第一线程变量是第一动态库中的线程变量的情况下,可以直接通过第一进程获取到第一线程变量的地址。
25、第二方面,本技术提供了一种补丁执行装置,装置包括获取模块、执行模块和调用模块;其中,获取模块,用于获取到补丁文件,补丁文件用于修复第一进程中存在的缺陷,补丁文件中引用有第一线程变量,第一线程变量为第一进程或者第一动态库中定义的线程变量。
26、执行模块,用于:
27、在补丁文件中新增got表,got表包括第一表项和第二表项,第一表项为第一线程变量的偏移量,第二表项为第一线程变量所在模块的模块id。
28、获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id。
29、将第一偏移量和第一id更新至got表中,得到更新补丁文件。
30、运行更新补丁文件,通过第一函数获取到第一线程变量的地址,第一函数是通过got表中第一偏移量和第一id获取到第一线程变量的地址的。
31、调用模块,用于通过第一线程变量的地址调用第一线程变量。
32、通过该方法,实现了补丁文件即可以调用进程中的线程变量,又可以调用动态库中的线程变量。
33、结合第二方面,在一种可能的实现方式中,执行模块,还用于:
34、获取到补丁文件中引用第一线程变量的第一指令。
35、在第一指令为非通过函数获取第一线程变量的地址的情况下,将第一指令修改为第二指令,第二指令为通过第一函数获取到第一线程变量的地址。
36、执行模块,具体用于运行更新补丁文件并执行更新补丁文件中的第二指令,通过第一函数获取到第一线程变量的地址。
37、这样,在第一线程变量为第一进程和/或第一动态库中的线程变量的情况下,若第一指令不是通过函数获取第一线程变量的地址,将第一指令修改为第二指令,第二指令是通过系统函数获取到第一线程变量的地址的,保证补丁文件可以正常调用第一进程中的第一线程变量,也可以调用第一动态库中的第一线程变量。
38、结合第二方面,在一种可能的实现方式中,执行模块,具体用于在第一指令为非通过函数获取第一线程变量的地址且第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令。
39、这样,仅在第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令,保证补丁文件可以正常调用第一动态库中的第一线程变量。
40、结合第二方面,在一种可能的实现方式中,执行模块,还用于在第一线程变量为第一进程中定义的线程变量的情况下,运行更新补丁文件并执行更新补丁文件中的第一指令,获取到第一线程变量的地址。
41、第一指令为通过第一进程获取到第一线程变量的地址。这样,在第一线程变量为第一进程中定义的线程变量的情况下,第一进程可以直接获取到第一线程变量的地址,从而无需将第一指令修改为第二指令。
42、结合第二方面,在一种可能的实现方式中,执行模块,具体用于:
43、在加载补丁文件之前,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中。
44、在加载补丁文件之后,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
45、这样,不区分第一线程变量为进程中的线程变量还是动态库中的线程变量,均在加载补丁文件之后,再获取到第一线程变量所在模块的模块id。
46、结合第二方面,在一种可能的实现方式中,执行模块,具体用于:
47、在加载补丁文件之前,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中。
48、在加载补丁文件之后,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
49、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一动态库中的线程变量的情况下,在加载补丁文件之后,再获取到第一线程变量所在第一动态库的动态库id。
50、结合第二方面,在一种可能的实现方式中,执行模块,还用于在加载补丁文件之前,在第一线程变量为第一进程中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id,并将第一偏移量和第一id更新至got表中,得到更新补丁文件。
51、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一进程中的线程变量的情况下,在加载补丁文件之前,就可以获取到第一线程变量所在第一进程的进程id。
52、结合第二方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中或者第一进程中包括第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id或者第一进程的进程id。
53、获取模块,具体用于:
54、通过第一函数基于第一id获取到多个线程控制块的地址。
55、基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址。
56、通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址。之后,再通过第一函数将第一线程变量的地址传递至第一线程。
57、这样,对于第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,均通过第一函数获取到第一线程变量的地址。
58、结合第二方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id。
59、获取模块,具体用于:
60、通过第一函数基于第一id获取到多个线程控制块的地址。
61、通过第一函数基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址。
62、通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址。通过第一函数将第一线程变量的地址传递至第一线程。
63、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量是第一动态库中的线程变量的情况下,通过第一函数获取到第一线程变量的地址。
64、结合第二方面,在一种可能的实现方式中,第一线程控制块中存储有第一进程中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一进程的进程id。
65、获取模块,具体用于:
66、运行所述更新补丁文件并执行所述更新补丁文件中的所述第一指令。
67、响应于所述第一指令,通过所述第一进程获取到所述第一进程的首地址。
68、通过所述第一进程基于所述第一进程的首地址、第二偏移量和第三偏移量确定出多个线程控制块的地址,所述第二偏移量为所述第一进程中定义的所述第一线程变量距离所述第一进程中所述第一指令之间的偏移量,所述第三偏移量为预设值。
69、通过所述第一进程基于第一线程id从所述多个线程控制块的地址中获取到所述第一线程控制块的地址。
70、通过所述第一进程基于所述第一线程控制块的地址和所述第一偏移量获取到所述第一线程变量的地址。
71、通过所述第一进程将所述第一线程变量的地址传递至所述第一线程。
72、其中,第三偏移量可以是一个线程控制块的大小。
73、这样,在第一线程变量是第一动态库中的线程变量的情况下,可以直接通过第一进程获取到第一线程变量的地址。
74、第三方面,本技术提供了另一种补丁执行装置,该装置包括存储器与处理器。存储器用于存储计算机程序代码,计算机程序代码包括计算机指令,处理器调用计算机指令以使得补丁执行装置执行:
75、获取到补丁文件,补丁文件用于修复第一进程中存在的缺陷,补丁文件中引用有第一线程变量,第一线程变量为第一进程或者第一动态库中定义的线程变量。
76、在补丁文件中新增got表,got表包括第一表项和第二表项,第一表项为第一线程变量的偏移量,第二表项为第一线程变量所在模块的模块id。
77、获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id;将第一偏移量和第一id更新至got表中,得到更新补丁文件。
78、运行更新补丁文件,通过第一函数获取到第一线程变量的地址,第一函数是通过got表中第一偏移量和第一id获取到第一线程变量的地址的。
79、通过第一线程变量的地址调用第一线程变量。
80、实现了补丁文件即可以调用进程中的线程变量,又可以调用动态库中的线程变量。
81、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:
82、获取到补丁文件中引用第一线程变量的第一指令。
83、在第一指令为非通过函数获取第一线程变量的地址的情况下,将第一指令修改为第二指令,第二指令为通过第一函数获取到第一线程变量的地址。
84、运行更新补丁文件并执行更新补丁文件中的第二指令,通过第一函数获取到第一线程变量的地址。
85、这样,在第一线程变量为第一进程和/或第一动态库中的线程变量的情况下,若第一指令不是通过函数获取第一线程变量的地址,将第一指令修改为第二指令,第二指令是通过系统函数获取到第一线程变量的地址的,保证补丁文件可以正常调用第一进程中的第一线程变量,也可以调用第一动态库中的第一线程变量。
86、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:
87、在第一指令为非通过函数获取第一线程变量的地址且第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令。
88、这样,仅在第一线程变量为第一动态库中定义的线程变量的情况下,将第一指令修改为第二指令,保证补丁文件可以正常调用第一动态库中的第一线程变量。
89、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:
90、在第一线程变量为第一进程中定义的线程变量的情况下,运行更新补丁文件并执行更新补丁文件中的第一指令,获取到第一线程变量的地址。
91、第一指令为通过第一进程获取到第一线程变量的地址。这样,在第一线程变量为第一进程中定义的线程变量的情况下,第一进程可以直接获取到第一线程变量的地址,从而无需将第一指令修改为第二指令。
92、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:
93、在加载补丁文件之前,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中。
94、在加载补丁文件之后,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
95、这样,不区分第一线程变量为进程中的线程变量还是动态库中的线程变量,均在加载补丁文件之后,再获取到第一线程变量所在模块的模块id。
96、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:
97、在加载补丁文件之前,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量,将第一线程变量所在模块的模块id置为第二值,将第一偏移量和第二值更新至got表中。
98、在加载补丁文件之后,在第一线程变量为第一动态库中定义的线程变量的情况下,获取到第一线程变量所在模块的模块id为第一值,将got表中第一线程变量所在模块的模块id由第二值修改为第一值,得到更新补丁文件。
99、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一动态库中的线程变量的情况下,在加载补丁文件之后,再获取到第一线程变量所在第一动态库的动态库id。
100、结合第三方面,在一种可能的实现方式中,处理器调用计算机指令以使得补丁执行装置执行:在加载补丁文件之前,在第一线程变量为第一进程中定义的线程变量的情况下,获取到第一线程变量的偏移量为第一偏移量和第一线程变量所在模块的模块id为第一id,并将第一偏移量和第一id更新至got表中,得到更新补丁文件。
101、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量为第一进程中的线程变量的情况下,在加载补丁文件之前,就可以获取到第一线程变量所在第一进程的进程id。
102、结合第三方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中或者第一进程中包括第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id或者第一进程的进程id。
103、处理器调用计算机指令以使得补丁执行装置执行:
104、通过第一函数基于第一id获取到多个线程控制块的地址。
105、基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址。
106、通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址。之后,再通过第一函数将第一线程变量的地址传递至第一线程。
107、这样,对于第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,均通过第一函数获取到第一线程变量的地址。
108、结合第三方面,在一种可能的实现方式中,第一线程控制块中存储有第一动态库中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一动态库的动态库id。
109、处理器调用计算机指令以使得补丁执行装置执行:
110、通过第一函数基于第一id获取到多个线程控制块的地址。
111、通过第一函数基于第一线程id从多个线程控制块的地址中获取到第一线程控制块的地址。
112、通过第一函数基于第一线程控制块的地址和中第一偏移量获取到第一线程变量的地址。通过第一函数将第一线程变量的地址传递至第一线程。
113、这样,需要区分第一线程变量是第一进程中的线程变量还是第一动态库中的线程变量,在第一线程变量是第一动态库中的线程变量的情况下,通过第一函数获取到第一线程变量的地址。
114、结合第三方面,在一种可能的实现方式中,第一线程控制块中存储有第一进程中第一线程变量所在的段的内容,第一线程控制块用于存储第一线程调用第一线程变量的数据,第一id为第一进程的进程id。
115、处理器调用计算机指令以使得补丁执行装置执行:
116、运行所述更新补丁文件并执行所述更新补丁文件中的所述第一指令。
117、响应于所述第一指令,通过所述第一进程获取到所述第一进程的首地址。
118、通过所述第一进程基于所述第一进程的首地址、第二偏移量和第三偏移量确定出多个线程控制块的地址,所述第二偏移量为所述第一进程中定义的所述第一线程变量距离所述第一进程中所述第一指令之间的偏移量,所述第三偏移量为预设值。
119、通过所述第一进程基于第一线程id从所述多个线程控制块的地址中获取到所述第一线程控制块的地址。
120、通过所述第一进程基于所述第一线程控制块的地址和所述第一偏移量获取到所述第一线程变量的地址。
121、通过所述第一进程将所述第一线程变量的地址传递至所述第一线程。
122、其中,第三偏移量可以是一个线程控制块的大小。
123、这样,在第一线程变量是第一动态库中的线程变量的情况下,可以直接通过第一进程获取到第一线程变量的地址。
124、第四方面,本技术提供了一种计算机可读存储介质,用于存储计算机指令,当计算机指令在补丁执行装置上运行时,使得补丁执行装置执行上述第一方面任一可能的实现方式中提供的一种补丁执行方法。
125、第五方面,本技术提供了一种计算机程序产品,当计算机程序产品在补丁执行装置上运行时,使得补丁执行装置执行上述第一方面任一可能的实现方式中提供的一种补丁执行方法。
126、对于第二方面至第五方面的有益效果,可以参考第一方面中有益效果的描述,本技术在此不做赘述。
本文地址:https://www.jishuxx.com/zhuanli/20241015/313918.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。