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

定制相册哪个网站好网页设计与制作教程第二版答案

定制相册哪个网站好,网页设计与制作教程第二版答案,石家庄哪家公司做网络推广好,广州优化网站建设在某些学习或者特殊需求的情况下要对linux下动态库*.so文件内部的函数名进行修改。 比如一个函数ADD(int a,int b);修改为Add(int a,int b); 通过这篇文章你将了解到在linux下动态库函数名寻址的规则#xff0c;截止2024年3月linux动态库的寻址规则已经出现多种#xff0c;这…在某些学习或者特殊需求的情况下要对linux下动态库*.so文件内部的函数名进行修改。 比如一个函数ADD(int a,int b);修改为Add(int a,int b); 通过这篇文章你将了解到在linux下动态库函数名寻址的规则截止2024年3月linux动态库的寻址规则已经出现多种这里不会一一介绍。这篇文章仅提供规则并不提供修改函数名的相关代码和执行文件。如果有需要请留言沟通。 开发环境Ubuntu20、gcc、g、IDAProWindows下安装即可版本不限。 必备知识ELF文件标准linux下执行文件头、IDApro的使用方法。 建议了解linux 动态库加载流程自行寻找资源后续可能给出链接参考文档(P73)https://paper.seebug.org/papers/Archive/refs/elf/Understanding_ELF.pdf 正文开始 编译简单的动态库和调用代码。 以下为测试代码其中仅有两个函数分别是ADD和MINUS的动态库代码使用main.cpp链接api.so对这两个函数进行调用并执行。最终再修改main.cpp对ADD的调用修改为Add同时不编译动态库仅对动态库的二进制文件进行修改的情况下完成调用。 注下列代码仅为参考并未规范处理。编译命令见main.cpp。 //myAPI.h //int ADD(int a, int b); //int MINUS(int a, int b);#ifdef __cplusplus extern C { #endif// int Add(int a, int b); int ADD(int a, int b); int MINUS(int a, int b);#ifdef __cplusplus } #endif //myAPI.cpp #include api.h// int aaa(int a, int b){ int ADD(int a, int b){return a b; } // int aaa(int a, int b){ // return a b; // } int MINUS(int a, int b){// int c ADD(a,b);int c b;return a - c; } //main.cpp #include api.h #include iostream // #include hash.h // 使用hash表做编译不写使用ELF GUN hash 或者两者兼顾// g -shared -fPIC -o libapi.so api.cpp -Wl,--hash-stylesysv /// -Wl,--retain-symbols-fileretain-symbols.txt // 链接动态库生成执行文件// g -o main main.cpp api.h -L. -lapi // 添加动态库路径到环境变量中// export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/. int main(){std::cout 1 1 ADD(1, 1) std::endl;std::cout 1 - 1 MINUS(1, 1) std::endl;return 0; } 通过上述步骤你将获得libapi.so和main两个可执行文件。并且执行main时运行正常。 打开IDAPro将libapi.so使用IAD进行逆向能够查看二进制文件即可。 idx name hash_val3 __cxa_finalize 0BEA6495 000000024 _Z5MINUSii 01E5E459 000000015 _ITM_registerTMCloneTable 0B7268A5 000000016 _ITM_deregisterTMCloneTable 012F7225 000000017 _Z3ADDii 0D758CB9 000000028 __gmon_start__ 0F4D007F 00000000ida pro 提供数据如下; ELF Hash Tableelf_hash_nbucket DCD 3elf_hash_nchain DCD 9elf_hash_bucket DCD 8, 6, 7elf_hash_chain DCD 0, 0, 0, 0, 0, 4, 5, 3, 0; ELF Symbol Table0 Elf64_Sym 01 Elf64_Sym byte_300 - byte_300, 3, 0, 7, .init_proc, 02 Elf64_Sym byte_300 - byte_300, 3, 0, 0x12, __dso_handle, 03 Elf64_Sym aCxaFinalize - byte_300, 0x20, 0, 0, dword_0, 0 ; __cxa_finalize4 Elf64_Sym aZ5minusii - byte_300, 0x12, 0, 9, _Z5MINUSii, 0x28 ; _Z5MINUSii ...5 Elf64_Sym aItmRegistertmc - byte_300, 0x20, 0, 0, dword_0, 0 ; _ITM_registerTMCloneTable6 Elf64_Sym aItmDeregistert - byte_300, 0x20, 0, 0, dword_0, 0 ; _ITM_deregisterTMCloneTable7 Elf64_Sym aZ3addii - byte_300, 0x12, 0, 9, _Z3ADDii, 0x20 ; _Z3ADDii ...8 Elf64_Sym aGmonStart - byte_300, 0x20, 0, 0, dword_0, 0 ; __gmon_start__; ELF String Tablebyte_300 DCB 0 ; DATA XREF: LOAD:0000000000000240↑o; LOAD:0000000000000258↑o ...aGmonStart DCB __gmon_start__,0 ; DATA XREF: LOAD:00000000000002E8↑oaItmDeregistert DCB _ITM_deregisterTMCloneTable,0; DATA XREF: LOAD:00000000000002B8↑oaItmRegistertmc DCB _ITM_registerTMCloneTable,0; DATA XREF: LOAD:00000000000002A0↑oaCxaFinalize DCB __cxa_finalize,0 ; DATA XREF: LOAD:0000000000000270↑oaZ3addii DCB _Z3ADDii,0 ; DATA XREF: LOAD:00000000000002D0↑oaZ5minusii DCB _Z5MINUSii,0 ; DATA XREF: LOAD:0000000000000288↑oDCB 0, 0, 0, 0, 0, 0, 0 规则 规则idx是直接读取 ELF Symbol Table 里面的 内容顺序和 ELF String Table 里面的不同                     hash_val 通过特定的方法计算得出。                     elf_hash_nbucket 这个值编译器根据方 案计算出的一般(总符号数/4 1) 在附近选择一个素数能 够使数据更加离散。                     elf_hash_nchain  这个值是符号的个数 。                     elf_hash_bucket DCD 8, 6, 7                         根据下表计算出的hash_val从最下面开始第8个 0 接着第6个 1 第7个是2。                     elf_hash_chain  DCD 0, 0, 0, 0, 0, 4, 5, 3, 0                         根据下表计算出 在计算的hash0有 8,                                          计算的hash1有 6,5,4                                          计算的hash2有 7,3                             因此elf_hash_bucket[0] 8;elf_hash_bucket[1] 6;elf_hash_bucket[2] 7;                                    elf_hash_chain[8] 0                                     elf_hash_chain[6] 5; elf_hash_chain[5] 4; elf_hash_chain[4] 0                                     elf_hash_chain[7] 3; 对橙色部分的内容进行解释 hash为0的只有8结尾默认0故hash_chain[8]0。 hash为1的有6,5,4 结尾默认0故hash_chain[6]5,hash_chain[5]4,hash_chain[4]0 同理hash为2的如上。 至此你已经了解了--hash-stylesysv使用传统ELF编译动态库hash表的生成规则了其本质是一种快捷的链式结构。 使用十六进制编辑器将hash表对应的函数ADD-Add然后调整ELF hash链表。 3 __cxa_finalize 0BEA6495 000000024 _Z5MINUSii 01E5E459 000000015 _ITM_registerTMCloneTable 0B7268A5 000000016 _ITM_deregisterTMCloneTable 012F7225 000000017 _Z3Addii 0D77ACB9 000000008 __gmon_start__ 0F4D007F 00000000hash_val 0: 8,7hash_val 1: 6,5,4hash_val 2: 3elf_hash_bucket DCD 8, 6, 3elf_hash_chain DCD 0, 0, 0, 0, 0, 4, 5, 0, 7 注使用IDA获取这个表的时候有对应值在二进制文件的偏移可以根据偏移直接修改。这一过程修改了hash table 和 string table两部分上面首为7的行已经和最开始的不一致了是通过elf_hash(string)获得到的。这个函数的实现资源较多。稍后进行链接给出。 调整完毕再将main.cpp和api.h两个文件的ADD-Add。如下 //myAPI.h //int ADD(int a, int b); //int MINUS(int a, int b);#ifdef __cplusplus extern C { #endif// int Add(int a, int b); int ADD(int a, int b); int MINUS(int a, int b);#ifdef __cplusplus } #endif //---------------------------------- //main.cpp #include api.h #include iostream // #include hash.h // 使用hash表做编译不写使用ELF GUN hash 或者两者兼顾// g -shared -fPIC -o libapi.so api.cpp -Wl,--hash-stylesysv /// -Wl,--retain-symbols-fileretain-symbols.txt // 链接动态库生成执行文件// g -o main main.cpp api.h -L. -lapi // 添加动态库路径到环境变量中// export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/. int main(){std::cout 1 1 Add(1, 1) std::endl;std::cout 1 - 1 MINUS(1, 1) std::endl;return 0; } 此时使用修改后的libapi.so和上述两个文件编译发现Add可以被正常调用。 结语此案例中ADD-Add是函数名长度所以可以避免下面执行的代码不做偏移修改如果函数名长度不一致可能导致整个动态库文件出现较大的问题。如果有兴趣可以查找相关的资料并提交到GNU说不定你也是对开源社区做贡献的小可爱了。这个案例对有传统ELF hash表有效其他标准的hash表也是类似的调整方法了解其运作原理就可以很快出结果。 参考文档(P73)https://paper.seebug.org/papers/Archive/refs/elf/Understanding_ELF.pdf
http://www.zqtcl.cn/news/166194/

相关文章:

  • 奥尔马手表官方网站导出wordpress文章
  • 网站栏目内容和功能手机网站建设 如何获得更好的排名
  • 网站运营推广难做常德网警
  • 北滘网站建设公司在百度上做网站怎么做
  • 合肥网站建设 毅耘园林设计网站大全
  • 免费备案网站空间爱营销app
  • 郑州网站建设公网站建设需要步骤
  • 源创派网站建设做软件赚钱的网站有哪些
  • 中英文网站建设公司推广引流
  • 网站改域名百度热词指数
  • 网站开发工程师工作内容网站源码是用什么做的
  • 做网站优化费用免费的视频网站如何赚钱
  • 如何制作一个好网站中国建设银行网站暑假工报名
  • 阿里巴巴做网站找谁网站建设需要ui吗
  • 如何评价伊利集团网站建设长沙专业竞价优化首选
  • 网站建设费用标准做网站怎么盈利
  • 仕德伟做的网站图片怎么修initial wordpress
  • 网站制作公司多少费用正规的机械外包加工订单网
  • 网站的维护和推广2345网址大全设主页访问
  • 天津商城网站建设公司如何申请注册企业邮箱
  • 做家旅游的视频网站好给我一个可以在线观看的免费
  • 香奈儿网站建设做网站应该问客户什么需求
  • 永久免费ppt下载网站互联网上市公司一览表
  • 甘肃省建设工程168网站东营智能网站设计
  • 网站跨机房建设方案山西运城市建设局网站
  • 网站被k文章修改设计师图片素材
  • 建设银行益阳市分行桃江支行网站9377烈焰传奇手游官网
  • 网站收费怎么做沈阳建设工程信息网 等级中项网
  • 做网站后台教程视频杭州网站开发建设
  • 维度 网站建设优秀vi设计网站