当前位置: 首页 > news >正文

做网站的流程视频网站被黑了多久恢复

做网站的流程视频,网站被黑了多久恢复,做一个网站怎么做的,第三方人力资源外包公司1 简介 现代操作系统都是通过库来进行代码复用#xff0c;降低开发成本提升系统整体效率。而库主要分为两种#xff0c;一种是静态库#xff0c;比如windows的.lib文件#xff0c;macos的.a#xff0c;linux的.a#xff0c;另一种是动态库#xff0c;比如windows的dll文…1 简介 现代操作系统都是通过库来进行代码复用降低开发成本提升系统整体效率。而库主要分为两种一种是静态库比如windows的.lib文件macos的.alinux的.a另一种是动态库比如windows的dll文件macos的.dyliblinux的so。静态库本身就是中间产物的ar打包link阶段会参与直接的产物生成而动态库本身已经是完整的二进制文件link阶段只会进行符号定位。   传统意义上认为静态链接的函数加载和执行效率要高于动态链接这是由于静态链接在编译-链接阶段就能够确定函数的库入口地址。而动态链接并不是所有场景下都能够提前知道入口地址可能只有需要加载的时候才需要确定。为了实现这一点和提升加载效率便诞生了PLT和GOT表。 2 PLT表和GOT表 2.1 GOT表 GOTGlobal Offset Table全局偏移表是为了实现地址无关代码而引入的一个偏移表格。函数调用或者数据访问时先访问GOT表再通过该表中对应表项的偏移在动态库映射内存中找到具体的函数地址和数据地址。 为什么需要使用GOT表进行重定位 动态库需要生成地址无关代码方便动态库加载时定位函数地址或者数据地址否则动态库的动态共享的优势不再存在因此需要生成地址无关代码GOT表格存储在数据区而不属于代码段这样可以保证各个进程各自持有一份各自的GOT表根据自己的内存映射地址进行调整。 GOT表需要考虑哪些内容 模块间数据和函数地址访问。模块内不需要考虑模块内使用模块内相对偏移即可。全局数据比如extern表示的数据。 2.2 PLT表 PLT(Procedure Link Table过程绑定表)是为了实现延迟绑定的地址表格。由于动态链接是在运行期链接并且进行重定位本来直接访问的内存可能变成间接访问会导致性能降低。ELF采用延迟绑定来缓解性能问题其假设就是动态库中并不是所有的函数与数据都会用到类似copy-on-write仅仅在第一次符号被使用时才进行相关的重定位工作避免对一些不必要的符号的重定位。   ELF使用PLTProcedure Linkage Table实现延迟绑定。在进行重定位时每个符号需要了解符号在那个模块模块ID以及符号。当调用外部模块中的函数时PLT为每个外部函数符号添加了PLT项然后通过PLT项跳转到GOT表再到最终的函数地址。也就是说第一次调用会间接调用之后可以直接通过PLT确认调用地址调用。 PLT解决了哪些性能问题 符号解析。动态库加载时不需要加载所有符号只需要加载部分能够大幅度降低加载耗时避免重复解析。当外部调用动态库内函数或者访问数据地址时需要搜索符号表访问找到对应的项对于比较大的动态库这个过程比较耗时。通过延迟加载只会在第一次比较耗时之后不会重复解析 3 深入理解GOT和PLT 我们简单做个试验研究下PLT和GOT。下面是一段简单的代码我们将其编译成动态库libadd.so #include cstdio #include cmathstatic int myadd(const int a, const int b){return a b; }int myabs(const int a){return std::abs(a); }void test(const int a, const int b){printf(%d %d, myadd(a, b), myabs(a)); } 下面是生成的动态库的反汇编 0000000000000630 _Z5myabsi:630: 55 push %rbp631: 48 89 e5 mov %rsp,%rbp634: 89 7d fc mov %edi,-0x4(%rbp)637: 8b 45 fc mov -0x4(%rbp),%eax63a: 89 c1 mov %eax,%ecx63c: f7 d9 neg %ecx63e: 0f 49 c1 cmovns %ecx,%eax641: 5d pop %rbp642: c3 retq 643: 66 66 66 66 2e 0f 1f data16 data16 data16 nopw %cs:0x0(%rax,%rax,1)64a: 84 00 00 00 00 00 0000000000000650 _Z4testii:650: 55 push %rbp651: 48 89 e5 mov %rsp,%rbp654: 48 83 ec 10 sub $0x10,%rsp658: 89 7d fc mov %edi,-0x4(%rbp)65b: 89 75 f8 mov %esi,-0x8(%rbp)65e: 8b 7d fc mov -0x4(%rbp),%edi661: 8b 75 f8 mov -0x8(%rbp),%esi664: e8 27 00 00 00 callq 690 _ZL5myaddii669: 89 45 f4 mov %eax,-0xc(%rbp)66c: 8b 7d fc mov -0x4(%rbp),%edi66f: e8 bc fe ff ff callq 530 _Z5myabsiplt674: 8b 75 f4 mov -0xc(%rbp),%esi677: 89 c2 mov %eax,%edx679: 48 8d 3d 2d 00 00 00 lea 0x2d(%rip),%rdi # 6ad _fini0x9680: b0 00 mov $0x0,%al682: e8 99 fe ff ff callq 520 printfplt687: 48 83 c4 10 add $0x10,%rsp68b: 5d pop %rbp68c: c3 retq 68d: 0f 1f 00 nopl (%rax)0000000000000690 _ZL5myaddii:690: 55 push %rbp691: 48 89 e5 mov %rsp,%rbp694: 89 7d fc mov %edi,-0x4(%rbp)697: 89 75 f8 mov %esi,-0x8(%rbp)69a: 8b 45 fc mov -0x4(%rbp),%eax69d: 03 45 f8 add -0x8(%rbp),%eax6a0: 5d pop %rbp6a1: c3 retq 从上面能够看到对于内部函数的调用直接使用的内部偏移比如myadd2中调用myadd就是callq 690 _ZL5myaddii。而调用printf和myabs就是callq 520 printfplt和callq 530 _Z5myabsiplt。   下来我们分析下这个跳转指令。e8表示偏移跳转后面跟的就是跳转地址偏移即0xfffffebc实际跳转地址便是off rip0xfffffebc 6740x530。需要注意的是执行 callq 指令之前RIP 指向 callq 指令的下一条指令因此RIP是674。 66f: e8 bc fe ff ff callq 530 _Z5myabsiplt接下来我们找到0x530的地址能够看到该地址又跳转到了510即plt表项最终跳转到0x200af2(%rip)从注释中能够看到是GOT的表项。 0000000000000510 .plt:510: ff 35 f2 0a 20 00 pushq 0x200af2(%rip) # 201008 _GLOBAL_OFFSET_TABLE_0x8516: ff 25 f4 0a 20 00 jmpq *0x200af4(%rip) # 201010 _GLOBAL_OFFSET_TABLE_0x1051c: 0f 1f 40 00 nopl 0x0(%rax)0000000000000520 printfplt:520: ff 25 f2 0a 20 00 jmpq *0x200af2(%rip) # 201018 printfGLIBC_2.2.5526: 68 00 00 00 00 pushq $0x052b: e9 e0 ff ff ff jmpq 510 .plt0000000000000530 _Z5myabsiplt:530: ff 25 ea 0a 20 00 jmpq *0x200aea(%rip) # 201020 _Z5myabsiBase0x2009f0536: 68 01 00 00 00 pushq $0x153b: e9 d0 ff ff ff jmpq 510 .plt接下来要查看GOT需要运行时查看我们用GDB调试即可。首先在调用myabs的地方断点单步进入可以看到当前的代码 (gdb) x /10i $pc0x7fffff1f0530 _Z5myabsiplt: jmpq *0x200aea(%rip) # 0x7fffff3f10200x7fffff1f0536 _Z5myabsiplt6: pushq $0x10x7fffff1f053b _Z5myabsiplt11: jmpq 0x7fffff1f05100x7fffff1f0540 __cxa_finalizeplt: jmpq *0x200a9a(%rip) # 0x7fffff3f0fe00x7fffff1f0546 __cxa_finalizeplt6: xchg %ax,%ax从上面的代码中能够看到需要跳转的地址是RIPoff0x7fffff1f05360x200aea0x7fffff3f1020。从下面的内容可以看到这个地址存储的是当前指令下一条执行的地址即0x7fffff1f0536也就是说这不是真正的函数地址还没有重定位。而上面的push $0x1就是预期这个符号在plt中的槽位编号。 (gdb) x /gx 0x7fffff3f1020 0x7fffff3f1020: 0x00007fffff1f0536 (gdb) x /gx 0x00007fffff1f0536 0x7fffff1f0536 _Z5myabsiplt6: 0xffd0e90000000168我们再单步几次就能看到基本能够确认这个过程是在进行符号解析 (gdb) si _dl_runtime_resolve_xsavec () at ../sysdeps/x86_64/dl-trampoline.h:71 71 ../sysdeps/x86_64/dl-trampoline.h: No such file or directory. (gdb) x /3i $pc0x7fffff4178f0 _dl_runtime_resolve_xsavec: push %rbx0x7fffff4178f1 _dl_runtime_resolve_xsavec1: mov %rsp,%rbx0x7fffff4178f4 _dl_runtime_resolve_xsavec4: and $0xffffffffffffffc0,%rsp退出当前函数我们再看PLT表中的表项可以看到已经被修改为_Z5myabsi的函数地址了。 (gdb) disass _Z5myabsiplt Dump of assembler code for function _Z5myabsiplt:0x00007fffff1f0530 0: jmpq *0x200aea(%rip) # 0x7fffff3f10200x00007fffff1f0536 6: pushq $0x10x00007fffff1f053b 11: jmpq 0x7fffff1f0510 End of assembler dump. (gdb) x /gx 0x7fffff3f1020 0x7fffff3f1020: 0x00007fffff1f0630 (gdb) x /gx 0x00007fffff1f0630 0x7fffff1f0630 _Z5myabsi: 0x8bfc7d89e58948554 总结 PLT 和 GOT 是现代动态链接的核心机制通过延迟绑定和地址无关性提升了动态库的加载效率和灵活性。这些机制确保了代码复用及共享的优势同时优化了性能。
http://www.w-s-a.com/news/202232/

相关文章:

  • 成都网站品牌设计策划课堂网站开发
  • 做直播网站赚钱公司网站空间怎么续费
  • 企业网站制作公司有哪些太原网站建设 thinkphp3.2
  • 云集网站哪个公司做的百度竞价排名怎么做
  • 做网站公司赚钱吗网站建设英语翻译
  • 网络公司除了做网站产品设计作品
  • dede网站模板替换湘潭建设路街道网站
  • 东莞网站优化效果如何网络设计工作
  • 网站备案系统验证码出错的解决方案任丘建设银行网站
  • 个人博客建站wordpress叮当app制作
  • 网站式的公司记录怎么做二手书网站策划书
  • 营销型网站的建设重点是什么帝国程序和WordPress
  • 正能量网站推荐不需要下载巴中网站建设开发公司
  • 学生模拟网站开发西安seo平台
  • 免费的app推广平台免费网站seo
  • 建一个个人网站网站建设中小企业广西
  • 优惠券网站做淘客违规吗个人建网站运营.
  • 旅游网站制作建设华大基因 网站建设
  • sem推广竞价托管南京seo网站优化
  • 网站优化网站建站教程网站建设 成都
  • 网站 配色表html代码在线
  • 城乡和建设部建造师网站众筹平台网站建设
  • 外贸网站模板免费下载微网站制作软件
  • 一个新的网站怎么做宣传技术先进的网站建
  • 福建网站建设有限公司需求网站
  • 生物科技企业网站做的比较好的企业培训网站模板
  • 南京 高端网站建设网站备案密码怎么找回
  • 蛋糕店网站模板建设电子商务系统网站
  • 海口网站建设优化公司网站开发要加班吗
  • 建设一个网站需要注意哪些要求群晖的网站开发