Seregon/ShadPKG

A tool for deriving PKG packet encryption keys for ps4 written in c++

C++/47.3 KB/No license
core/decompiler/analysis/DataFlowAnalysis.h
ShadPKG / core / decompiler / analysis / DataFlowAnalysis.h
1#pragma once
2 
3#include "../ir/AST.h"
4#include <map>
5#include <memory>
6#include <set>
7 
8namespace ShadPKG::Decompiler::Analysis {
9 
10// ╔═══════════════════════════════════════════════════════════════════════════╗
11// ║ DATA FLOW ANALYSIS ║
12// ║ ║
13// ║ Infers types of variables based on usage. ║
14// ║ - Usage in CMP -> Integer/Boolean ║
15// ║ - Usage as Address -> Pointer ║
16// ║ - Flow propagation ║
17// ╚═══════════════════════════════════════════════════════════════════════════╝
18 
19class DataFlowAnalysis : public AST::ASTVisitor {
20public:
21 explicit DataFlowAnalysis(std::shared_ptr<AST::FunctionAST> func);
22 
23 void analyze();
24 
25 // Visitor Overrides
26 void visit(AST::ConstantExpr *node) override {}
27 void visit(AST::VariableExpr *node) override;
28 void visit(AST::BinaryExpr *node) override;
29 void visit(AST::UnaryExpr *node) override;
30 void visit(AST::CallExpr *node) override;
31 void visit(AST::MemoryExpr *node) override;
32 void visit(AST::MemberAccessExpr *node) override { node->base->accept(this); }
33 void visit(AST::CastExpr *node) override;
34 
35 void visit(AST::CompoundStatement *node) override;
36 void visit(AST::ExpressionStatement *node) override;
37 void visit(AST::IfStatement *node) override;
38 void visit(AST::WhileStatement *node) override;
39 void visit(AST::DoWhileStatement *node) override;
40 void visit(AST::ForStatement *node) override;
41 void visit(AST::ReturnStatement *node) override;
42 void visit(AST::BreakStatement *node) override;
43 void visit(AST::ContinueStatement *node) override;
44 void visit(AST::GotoStatement *node) override;
45 void visit(AST::LabelStatement *node) override;
46 void visit(AST::CaseStmt *node) override;
47 void visit(AST::SwitchStmt *node) override;
48 
49private:
50 std::shared_ptr<AST::FunctionAST> func_;
51 
52 // Track inferred types
53 std::map<std::string, AST::Expression::Type> inferredTypes_;
54
55 // Track variable usage for dead code elimination
56 std::set<std::string> usedVariables_;
57 std::set<std::string> assignedVariables_;
58 
59 void inferType(const std::string &varName, AST::Expression::Type type);
60 void applyTypes();
61 void trackVariableUsage();
62 void eliminateDeadCode();
63};
64 
65} // namespace ShadPKG::Decompiler::Analysis
66