如何检索python代码的控制流图?
我想倾倒给定的Python代码的控制流程图, 类似于GCC编译器选项的选项:-fdump-tree-cfg for C代码. 我成功获得了Python代码的AST(抽象语法树), 但是它的接缝非常复杂,可以从AST阶段获取控制流程图. 是否有一种更简单的方法可以直接检索Python代码的控制流程图?有什么建议吗? 哦,我使用Python3.5 谢谢大家! P.S 我真的不知道我正在使用哪种口译员, 据我所知,这是cpython(不确定),我不认为这是pypy(rpython). 有什么建议如何验证它? 解决方案 请参阅我的因此,请回答如何使用AST. > 最初的问题询问了有关Java的CFG,但是该方法实际上是相当通用的,并且同样的方法可以用于生产Python的CFG. 我不会称这个"非常复杂";基本想法非常简单.
10 2024-01-09
编程技术问答社区
在跳转目的地是基于动态环境值的情况下,如何构建控制流图?
在研究逆向工程时,我经常发生,因为我可以将任何位置(我有权访问)作为参数,所以使用某些非硬编码或"非确定性"目标的跳跃指令(如它的该计划以前未定义)可以在任何地方瞄准.因此,如果我根据说的值加载EAX EAX,OS版本的字符串和执行jmp eax,那么似乎任何尝试生成控制流程图的工具都不知道目标在哪里(可以将其基于您当前的环境,但这可能会导致该程序中的一些破途径). 我想念什么吗?因为如果我正确理解这一点,似乎我在IDA中打开的每个恶意软件都会做到这一点(基于他们对目标环境的某种条件),但我看不到像这样的控制流程图破裂.再说一次,我是反向工程的新手. 解决方案 您的观察是正确的.有两种主要方法可以用于间接跳跃. 首先,可以使用静态分析.例如,如果发现跳跃目标是从有限长度的跳跃表中选择的,则分解器可以列出跳台的条目作为可能的目标.另一个常见的情况是,跳跃目标是从程序中其他地方的变量集中取的,但始终达到相同的值.分解器也可以分析变量的可能值并推断出可能的跳跃目标.
0 2023-12-15
编程技术问答社区
我可以用JDT来生成控制流图吗?
JDT是否提供了生成控制流程图的任何API? 我用烟灰生成控制流程图,但是我可以使用JDT生成控制流程图吗? 解决方案 JDT肯定提供了所有必要的信息,但是您可能必须自己投资一些代码,以便获得您正在寻找的数据结构. 很大程度上取决于您感兴趣的细节级别:方法之间的调用图?方法中的基本块的详细流程?两者的组合? 如果您的兴趣在精神上与重构有关,则您可能会从JDT/UI中的内部代码中获得一些灵感,该代码用于代表重构进行流程分析.查看以下源代码的以下各节: org.eclipse.jdt.ui/core recactoring/org/org/eclipse/jdt/jdt/nestern/corext/core x/a> 在 之类的课堂中使用上述用法 org/eclipse/jdt/jdt/internal/corext/recactoring/recactoring/code/callinliner.java org/eclipse/eclipse/jd
18 2023-09-29
编程技术问答社区
如何用Soot创建一个控制流图?
有一段时间,我一直在努力创建一个使用 soot 和i Kinda迷失在其教程.我没有将烟灰作为日食插件,而是尝试将烟灰用作库或API. 我想做的是,我有很多Java项目,我想创建/生成这些项目的控制流图.我还看到烟灰中有一个功能,可以在"点"格式中生成控制流图,这对我来说也是很可接受的. 任何显示如何使用烟灰创建/生成控制流图的代码指南或示例都很棒! 解决方案 您可以通过创建一个新的extifunionEnitGraph,传递该方法的烟灰体来创建方法 - 本地CFG. Wiki中的烟灰教程向您展示了如何做. 要获得术间CFG,即ICFG,您可以使用Soot Extension Heros:
4 2023-09-29
编程技术问答社区
从 Radare2 获取完整的二进制控制流程图
我想使用Radare2获得二进制(恶意软件)的完整控制流程. 我跟随 从So的另一个问题中.我想问一下是否有另一个命令给出整个二进制的控制流程图,而不仅仅是一个函数的图. 解决方案 首先,请确保从Git存储库安装Radare2并使用最新版本: $ git clone https://github.com/radare/radare2.git $ cd radare2 $ ./sys/install.sh 您下载并安装了Radare2后,打开二进制文件并使用aaa命令对其进行分析: $ r2 /bin/ls -- We fix bugs while you sleep. [0x004049a0]> aaa [x] Analyze all flags starting with sym. and entry0 (aa) [x] Analyze function calls (aac) [x] Analyze len bytes of instructions fo
8 2023-08-21
编程技术问答社区
如何用antlr生成Java CFG(控制流图)?
我正在尝试分析java代码坚固. 所以,我使用Antlrv3和Java语法代码生成了Java Parser和Lexer ... ,但我不知道如何使用生成的解析器和Lexer生成上下文流图. 我试图通过教程页面学习如何进行此操作,但是教程页面已经消失. 您能给我一个方法吗?或教程页面? 谢谢. 解决方案 afaik,antlr在构建控制流程图方面没有任何特定的帮助. 您可以通过行走AST并收集动作知识(无条件语句)和条件(表达节点控制条件),并从该信息组装图表来建立一个.请注意,开关语句是一种有条件的复合,需要作为一组决策或特殊的n向条件处理. 例外处理可能会改变您认为的"无条件行动";每个方法调用都有可能将控制流重定向到异常处理程序(或函数的出口),并且您需要确定是否将其包含在控制流程图中.如果您想推荐该程序的功能(尤其是数据流),则需要对其进行建模. 您将需要创建控制流节点(只是一种类),该节点可以参考AST的部分("这是动作")
16 2023-05-20
编程技术问答社区
如何从汇编中生成控制流图?
对于上下文,我正在尝试编写一个从AVM2(ActionScript Virtual Machine 2)字节码/汇编到高级ActionScript 3代码的分解编织器.据我所知,这要求我分析组件并从中生成所得的控制流程图,以推导诸如环路和条件分支之类的结构(如果/else). 给定一些组件,例如: 0 getlocal0 1 pushscope 2 findpropstrict {, private, }::trace 4 pushstring "one" 6 callproperty {, private, }::trace (1) 9 pop 10 pushbyte 5 12 pushbyte 3 14 i
44 2023-03-23
编程技术问答社区
我对SSA的构建是否正确?(重新命名)
我一直在学习SSA(静态单分配表格),并给出了以下图形,其中插入了PHI函数,但该图并未重命名: 我必须重命名变量,这就是我得到的: 我非常不确定这是正确的.我是否正确命名了变量?这是最小的SSA吗?我正在从 noreforler">这里(Cytron) ,et.Al的论文)命名变量.请帮忙! :) 解决方案 不,您的图形不正确. x和y的phi函数和重命名是正确的,问题是临时变量t1至t3.当输入块L1并且根本不需要任何phi功能时,这些变量将死亡.如果您坚持使用这些变量的PHI功能,则必须假设变量存在并在输入图时具有不确定的值.令t1_0,t2_0和t3_0为这些值,并相应地更新重命名的图.
在基本区块的中间跳跃
基本块定义为以跳跃(直接或间接)指令结尾的(非跳跃)指令的序列.跳跃目标地址应该是另一个基本块的开始.考虑我有以下组装代码: 106ac: ba00000f blt 106f0 106b0: e3099410 movw r9, #37904 ; 0x9410 106b4: e3409001 movt r9, #1 106b8: e79f9009 ldr r9, [pc, r9] 106bc: e3a06000 mov r6, #0 106c0: e1a0a008 mov sl, r8 106c4: e30993fc movw r9, #37884 ; 0x93fc 106c8: e3409001
18 2023-03-23
编程技术问答社区
使用LLVM为整个源代码生成CFG
LLVM社区的任何人是否知道使用opt -dot-cfg foo.ll(.bc)有一种方法为整个输入源代码生成CFG吗?由于该函数生成CFG,因此函数之间的连接将被忽略. 似乎较旧的分析工具已贬值. 解决方案 我想知道您是否找到了获得分解CFG的任何方法.我发现其他Inliner通行证的呼叫函数可能会有所帮助,但我无法使其工作.我已经发布了这个 通过LLVM
68 2023-03-12
编程技术问答社区
通过LLVM找到c/c++程序中所有可能的路径
我试图通过LLVM找到程序中的任何可能路径.现在,我可以找到从进入我代码中所有功能的退出BB的路径.但是那不是我需要的.我需要的是扩展CFG(也许是通过内置函数调用?!)为整个源代码具有CFG,并在此扩展的CFG中找到路径. 我正在考虑首先使用-inline通行证以直接使用所有功能,然后运行我的探路者通行证,但是正如我观察到的 - inline仅适用于在代码(CPP文件)中明确提及内联提及的函数.我不能遵循数百个功能,并将其添加到所有功能中.我还需要确保所有呼叫都被内衬,并且不会错过任何呼叫.我不确定内部是我唯一的选择,甚至是一个选择.任何对此的想法都将不胜感激. **显然,我的源代码中没有递归调用. 解决方案 不完全确定您在问什么,但是您几乎可以使用任何程序语言来解析source.cpp和source.h查找函数声明/定义,并根据某些规则添加inline. 基本上,您将把源.CPP视为.txt,并使用您的首选中的任何API将文件作为char *进行.让它搜索(,然后
2 2023-03-12
编程技术问答社区
用于C++代码的控制流图生成器
我正在寻找用C ++编写的源代码的控制流程图生成器. 您知道任何开源的静态生成器吗? 我想在我的毕业项目中使用它来生成控制流程图并突出显示在执行分析应用程序期间执行的路径. 我已经写了整个引擎来记录执行行. 谢谢您的所有答案. 解决方案 您可以使用首先将您的程序编译到LLVM IR clang++ -emit-llvm -S prog.cpp -o prog.ll 然后使用 opt 生成控制流程图. opt --dot-cfg prog.ll 此输出一个可以用 graphviz .在Mac上,您可以执行brew install graphviz并运行以下以生成PNG. dot -Tpng cfg.main.dot -o main.png 您应该为程序中的每个函数都有一个点文件,因此编写脚本以自动将其全部转换为PNG 可能会更容易 其他解决方案 COFLO是一种免费的开源源代码分析工具,可生成和分析C和C ++源的控制流程图.
66 2023-02-27
编程技术问答社区
Java控制流图库
我需要在项目中为Java代码操纵控制流程图.在Java中生成控制流程图的好Java库.到目前为止,我已经找到了几个Eclipse插件(严重依赖Eclipse API)和独立工具(无法嵌入我的代码). 解决方案 做这件事的工具是烟灰,这个问题是用于生成Java中控制流的工具 其他解决方案 我将把另一个工具扔进混合物中. 其他解决方案 jsonde 将从您的实际运行代码中创建序列图(可以说,这比从中更有用来源,由于源分析不会显示实现特定功能). javacalltracer 做类似的事情. 大多数工具都集成到Eclipse/类似中,因此它们可以访问AST,这使此类事情变得很琐碎. 自己从字节代码中获取信息(这是一个有趣的练习)实际上并不复杂.或使用FactionsJ进行仪器并自己创建运行时信息. 编辑原始答案,仍然有效. jgraph 是开放式的,很酷. jdiagram 是一种摇摆部分,商业产品.
22 2022-12-28
编程技术问答社区
我怎样才能影响Graphviz/dot,通过消除蛇行和更好的边缘交叉来制作更漂亮的控制流图?
我正在为Python程序绘制控制流图,并希望影响不应越过哪种边缘.有没有办法做到这一点? 考虑这个简单的Python程序: try: a += 1 except: a += 2 else: a = 3 和一个点程序来表示通过digraph G { mclimit=1.5; rankdir=TD; ordering=out; graph[fontsize=10 fontname="Verdana"]; color="#efefef"; node[shape=box style=filled fontsize=8 fontname="Verdana" fillcolor="#efefef"]; edge[fontsize=8 fontname="Verdana"]; node_0 [shape = "oval"][label="Basic Block 0\loffsets: 0..12\lflags=entry, block, unconditiona
16 2022-10-25
编程技术问答社区
在计算循环复杂性时,如果一个控制流图由多个开始和/或停止节点组成,会发生什么情况?
我想知道当控制流程图中有多个开始或停止节点时,它将如何影响圈复杂度.如果您能解释圈复杂度和开始/停止节点之间的关系,那将是一个很大的帮助. 解决方案 • 控制流图可以包含许多开始和停止.但根据McCabe的理论,如果它是由多个开始和停止组成的,则不满足公式.
348 2022-08-10
编程技术问答社区
使用Objdump的结果建立一个控制-流程图
我试图通过调用对objdump -d构建装配结果的控制流程图.目前我提出的最好的方法是将结果的每一行放入链接列表中,并分开每行的内存地址,操作码和操作数.我通过依赖于objdump结果的常规性(存储器地址是表示每行的字符串中的字符2到字符7)分开它们. 完成此操作后,我开始实际的CFG指令. CFG中的每个节点都保存一个启动和结束内存地址,指向前一个基本块的指针,指向任何子基本块的指针.然后,我正在通过Objdump结果并将Opcode与X86_64中的所有控制流操作码的数组进行比较.如果操作码是一个控制流程,则我将地址记录为基本块的末尾,并且根据操作码,添加两个子指针(条件操作码)或一个(调用或返回). 我在c中实施了这个过程,似乎它会起作用,但感觉非常脆弱.有没有人有任何建议,或者我没有考虑的任何东西? 感谢您花时间阅读! 编辑: 这个想法是使用它来比较Dynamorio生成的系统调用的堆栈痕迹针对目标二进制文件的预期CFG,我希望像这样建立它会促进它.
1394 2022-07-19
编程技术问答社区