本文是看了德国佬的文章后做了实验后作出的一个副产品。
确定函数的调用依赖关系和数据引用的依赖关系,据说可以很简单的——如果用gcc编译器——只要改一个编译开关,不过对于diab编译器来说就有点麻烦,没有这么直接的办法。
我做了两个方案,若f调用或引用g,g是函数或变量
1、已知f求g;
2、已知g求f;
从两个方向解决这个问题。
1、已知f求g
a)打开-x129开关,为每个函数生成一个.txt分割段;
b)查符号表中Name=f的st_shndx,let it be x;
c)查段头表Inf=x的名字,let it be z;
d)在名字为z的重定位表中查Sym.Num,let it be M;
e)在符号表中查M的所有元素,则f依赖M中所有元素。
f)若M中元素有函数,则根据Num,在段头表的Inf中找到offset或者名字,就找到了函数的偏移;
若M中元素有变量,则根据Value值大小关系把变量排序,根据size就可以在.data段中找到他们的值。
2、已知g求f
a)打开-x129开关,为每个函数生成一个.txt分割段;
b)查重定位表Sym.Name=g的重定位分割段.rela.split.*的偏移x;
c)查段头表偏移=x的Inf(sh_info),let it be y;
d)查符号表中st_shndx符号所在段为y的st_name,let it be f;
则知f调用了g。
ps,
l.s.跟我说了怎么处理prolog和epilog,简直醍醐灌顶,我都有点纳闷自己怎么就没想到根本就不用处理NOP的,我只要找到函数入口向前数几个字节,jmp到我的代码处理完后再jmp回来就OK了;相似的,退出函数前的处理可以用点99年的技巧。