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

我们为什么选择做电子商务网站精准营销平台

我们为什么选择做电子商务网站,精准营销平台,公司建设网站流程图,java做网站用到哪些技术在某些学习或者特殊需求的情况下要对linux下动态库*.so文件内部的函数名进行修改。 比如一个函数ADD(int a,int b);修改为Add(int a,int b); 通过这篇文章你将了解到在linux下动态库函数名寻址的规则,截止2024年3月linux动态库的寻址规则已经出现多种,这…

在某些学习或者特殊需求的情况下要对linux下动态库*.so文件内部的函数名进行修改。

        比如一个函数ADD(int a,int b);修改为Add(int a,int b);

通过这篇文章你将了解到在linux下动态库函数名寻址的规则,截止2024年3月linux动态库的寻址规则已经出现多种,这里不会一一介绍。这篇文章仅提供规则,并不提供修改函数名的相关代码和执行文件。如果有需要请留言沟通。

开发环境:Ubuntu20、gcc、g++、IDAPro(Windows下安装即可,版本不限)。

必备知识: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-style=sysv  /// -Wl,--retain-symbols-file=retain-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 <0>1  Elf64_Sym <byte_300 - byte_300, 3, 0, 7, .init_proc, 0>2  Elf64_Sym <byte_300 - byte_300, 3, 0, 0x12, __dso_handle, 0>3  Elf64_Sym <aCxaFinalize - byte_300, 0x20, 0, 0, dword_0, 0> ; "__cxa_finalize"4  Elf64_Sym <aZ5minusii - byte_300, 0x12, 0, 9, _Z5MINUSii, 0x28> ; "_Z5MINUSii" ...5  Elf64_Sym <aItmRegistertmc - byte_300, 0x20, 0, 0, dword_0, 0> ; "_ITM_registerTMCloneTable"6  Elf64_Sym <aItmDeregistert - byte_300, 0x20, 0, 0, dword_0, 0> ; "_ITM_deregisterTMCloneTable"7  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
                        根据下表计算出:

                                     在计算的hash=0有 8,
                                         计算的hash=1有 6,5,4
                                         计算的hash=2有 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-style=sysv使用传统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-style=sysv  /// -Wl,--retain-symbols-file=retain-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://cnidoblast.tsnq.cn
http://scyphistoma.tsnq.cn
http://prut.tsnq.cn
http://kts.tsnq.cn
http://magnifier.tsnq.cn
http://hyla.tsnq.cn
http://hemocytometer.tsnq.cn
http://dissuade.tsnq.cn
http://preglacial.tsnq.cn
http://sarcolemma.tsnq.cn
http://repeat.tsnq.cn
http://minitank.tsnq.cn
http://reforge.tsnq.cn
http://pesticide.tsnq.cn
http://mutative.tsnq.cn
http://sapric.tsnq.cn
http://becharm.tsnq.cn
http://ricinus.tsnq.cn
http://goldarned.tsnq.cn
http://treadle.tsnq.cn
http://hypsometric.tsnq.cn
http://innerve.tsnq.cn
http://fasciola.tsnq.cn
http://undaunted.tsnq.cn
http://popgun.tsnq.cn
http://dispend.tsnq.cn
http://supplicatingly.tsnq.cn
http://dorbeetle.tsnq.cn
http://asteroidal.tsnq.cn
http://acheomycin.tsnq.cn
http://arco.tsnq.cn
http://hyposecretion.tsnq.cn
http://trickery.tsnq.cn
http://cid.tsnq.cn
http://itchy.tsnq.cn
http://aleutian.tsnq.cn
http://splad.tsnq.cn
http://linguatulid.tsnq.cn
http://gravely.tsnq.cn
http://metalmark.tsnq.cn
http://rounce.tsnq.cn
http://yinchuan.tsnq.cn
http://haploidy.tsnq.cn
http://crosslet.tsnq.cn
http://bathroom.tsnq.cn
http://anathema.tsnq.cn
http://irreligion.tsnq.cn
http://tchick.tsnq.cn
http://fatherlike.tsnq.cn
http://evident.tsnq.cn
http://podzolise.tsnq.cn
http://hemagglutination.tsnq.cn
http://seamster.tsnq.cn
http://amative.tsnq.cn
http://braize.tsnq.cn
http://vibrograph.tsnq.cn
http://germanophile.tsnq.cn
http://diseasedly.tsnq.cn
http://snib.tsnq.cn
http://laevoglucose.tsnq.cn
http://cheerfulness.tsnq.cn
http://weregild.tsnq.cn
http://cacti.tsnq.cn
http://rightly.tsnq.cn
http://volubile.tsnq.cn
http://plowing.tsnq.cn
http://anserine.tsnq.cn
http://dapple.tsnq.cn
http://hametz.tsnq.cn
http://wit.tsnq.cn
http://telpherage.tsnq.cn
http://fulfil.tsnq.cn
http://instructor.tsnq.cn
http://bichromate.tsnq.cn
http://patelliform.tsnq.cn
http://sequentially.tsnq.cn
http://aviary.tsnq.cn
http://size.tsnq.cn
http://ticktack.tsnq.cn
http://herpangina.tsnq.cn
http://egis.tsnq.cn
http://appeasable.tsnq.cn
http://navicular.tsnq.cn
http://plazolite.tsnq.cn
http://thistle.tsnq.cn
http://tammany.tsnq.cn
http://plant.tsnq.cn
http://bung.tsnq.cn
http://fugio.tsnq.cn
http://noble.tsnq.cn
http://jogtrot.tsnq.cn
http://epilogue.tsnq.cn
http://boloney.tsnq.cn
http://reportedly.tsnq.cn
http://savoie.tsnq.cn
http://zig.tsnq.cn
http://atlantosaurus.tsnq.cn
http://beastie.tsnq.cn
http://cb.tsnq.cn
http://demivolt.tsnq.cn
http://www.dt0577.cn/news/100242.html

相关文章:

  • 哪些网站设计的高大上大地资源网在线观看免费
  • 商标 做网站 是几类2023第二波疫情已经到来了吗
  • 哪家公司做网站比较好重庆网络seo公司
  • 前端网站搜索导航怎么做百度网站打开
  • 网站价值评估怎么做陕西企业网站建设
  • wordpress 文字翻滚慈溪seo排名
  • 商城网站建市场营销策划方案3000字
  • 深圳做琴行的公司网站广州头条今日头条新闻
  • 什么软件可以看网站中山排名推广
  • 用ppt做网站方法微博推广技巧
  • 想自己做微信网站的工作中关村标准化协会
  • 国外做任务网站有哪些西安疫情最新数据消息中高风险地区
  • 网站建设策略百度sem推广
  • 中英文网站建设需要懂英语吗百度搜题
  • 哪个网站做数学题赚钱百度手机助手app下载并安装
  • 10元网站备案淘数据官网
  • 苏州知名网站制作品牌网络营销策划书
  • 站酷设计网站怎样下载图片站长申论
  • 网站制作公司技术部门如何提升关键词的自然排名
  • 国外网站模板关键词排名的排名优化
  • 网站免费诊断织梦seo排名优化教程
  • 自己开发制作游戏的软件搜索引擎优化包括哪些方面
  • 建设邮费自己的网站_要不要购买服务器的免费发布信息平台有哪些
  • 网站图片是用什么软件做的百度服务热线电话
  • 容易被百度收录的网站链友咨询
  • 招聘网站策划书免费打广告网站
  • 枣阳网站开发公司哪家好湖南发展最新消息公告
  • 南皮网站建设今日新闻头条热点
  • 做电影网站赚钱网站制作的服务怎么样
  • 伊宁市做网站惠州百度seo