如何实现应用程序二进制补丁(冷补丁、热补丁、冷转热补丁,装备补丁)

冷补丁:打上补丁后需重启设备或软件;
热补丁:打上补丁后立即生效;
冷转热补丁:打上后,通过设置,可以补丁立即生效;
装备补丁:实现某些特定功能的补丁;

基出准备:
(1)列出SO中所的的符号;
nm -D XXX.so
objdump -tT XXX.so
http://blog.csdn.net/hujia414/article/details/56274294
(2)获取SO中函数地址
void * GetProcAddress ( DLLHMODULE hLibModule,const CHAR * strProcName )
{
ifdef J_WIN32
return ::GetProcAddress(hLibModule,strProcName);
else
return dlsym(hLibModule, strProcName);
endif
}
(3)网上找的一段话,预读入准备文件这是个什么东西?
很多软件都有自动更新程序,最著名的当属微软的自动更新。软件公司通过更新补丁来完善软件、修补漏洞,提高软件的健壮性,延长软件的生命周期。 补丁的原理:很多软件执行都有一个预读入准备文件,在这个文件中,有执行程序要运行的所有步骤(比如先运行哪个程序,后运行哪个程序或先执行哪条命令,后执行哪条命令),软件更新就是基于这样的原理,通过将更新文件的链接地址,文件名及执行命令写入预读入准备文件中,完成程序更新的前期准备工作,然后开始提示用户,程序可以开始更新了,是关闭程序更新还是稍后再更新,由用户来选择。 不少软件中都有一个LiveUpdate的程序,始终监听服务器的更新文件,并定时下载更新信息,写入预读入准备文件,引导程序进行自动更新的进程。
(4)程序员的自我修养一书中,的编译动态库等对实现补丁有帮助,有时间读一下,

Andrio中实现热补丁
http://blog.csdn.net/xinanheishao/article/details/75255390

Linux hotpatch
https://github.com/vikasnkumar/hotpatch
http://blog.csdn.net/byrantch/article/details/51231957

补丁实现构思:
方案1:
通过构造一个特殊格式的文件(预读入准备文件),预读入准备文件中存放着各模块的名字,和各模块中符号及地址;预读入文件中约束着模块的加载顺序和各函数的路转地址,在系统打了补丁后,程序启动时,修改预读入准备文件中的各链接地址,这样程便实现了补丁;
方案2:
构造一个全局的库,在启动时第一个加载,库中存放补丁修改后的实现,通过符号先加载替换后加载的实现。
方案3:

猜你喜欢

转载自blog.csdn.net/dodonei/article/details/76220607
今日推荐