
从start开始分析题目的IR规则,因为start是IR函数的注册点 因为没有初始化全局变量,所以从start这里找个函数跟进,找到这里

一直往上翻,找到虚表的开始

不过在虚表里没找到runOnFunction,看样子是把函数名改了

可以看到sub_6780函数出现了DATA XREF,这是代表这函数被交叉引用,但是这个函数包括上面这几个函数功能都很单一 一般来讲,虚表底下的函数一般就是runOnFunction,因为这个函数是最后被修改的,点进sub_6830

这里确是跟.rdata段有交叉引用,而且从function窗口也能看出来length也是相对其他函数较大,所以这里应该是runOnFunction函数,runOnFunction函数一般是在虚表最后满足length足够大且与.rdata段交叉引用

这里只有getName、strlen和memcmp这三个,但是这三函数不会修改内存地址,getName是获取函数名,只要函数名为o0o0o0o0那么v4就不会等于0,就会执行sub_6AC0,也就是这个pass只会对o0o0o0o0这个函数进行处理 只能再看一下sub_6AC0

这里有一个循环 llvm::Function::begin和llvm::Function::end都是Function类的迭代器对象,其迭代的对象是函数中的基本块。因此这个循环的意思就是对每一个基本块执行sub_6B80函数。其中v3 = (llvm::BasicBlock
)llvm::ilist_iteratorllvm::ilist_detail::node_optionsllvm::BasicBlock,false,false,void,false,false::operator
(v5);这条语句中的ilist是LLVM标准库中定义的一个数据结构,与C++标准模板库list类似,但是LLVM中都是使用ilist来存储一个函数的所有基本块或指令,可以将其看成一个列表,针对于LLVM做了一些特殊的优化。那么v3也就是函数中的每一个基本块。 进sub_6B80看进行了什么处理

先从这个循环开始看
llvm::CallBase::getCalledFunction : Returns the function called
先说一下这段循环里出现的这段函数,它会返回调用的函数名
当你有一个 LLVM IR(中间表示)的函数调用指令,你可以使用 llvm::CallBase::getCalledFunction 函数来获取被调用的函数。例如,在下面的 LLVM IR 中: