-
Notifications
You must be signed in to change notification settings - Fork 186
Expand file tree
/
Copy pathScramblePrivateProperty.php
More file actions
132 lines (111 loc) · 3.07 KB
/
Copy pathScramblePrivateProperty.php
File metadata and controls
132 lines (111 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
/**
* ScramblePrivateProperty.php
*
* @category Naneau
* @package Obfuscator
* @subpackage NodeVisitor
*/
namespace Naneau\Obfuscator\Node\Visitor;
use Naneau\Obfuscator\Node\Visitor\TrackingRenamerTrait;
use Naneau\Obfuscator\Node\Visitor\SkipTrait;
use Naneau\Obfuscator\Node\Visitor\Scrambler as ScramblerVisitor;
use Naneau\Obfuscator\StringScrambler;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_ as ClassNode;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
/**
* ScramblePrivateProperty
*
* Renames private properties
*
* WARNING
*
* See warning for private method scrambler
*
* @category Naneau
* @package Obfuscator
* @subpackage NodeVisitor
*/
class ScramblePrivateProperty extends ScramblerVisitor
{
use TrackingRenamerTrait;
use SkipTrait;
/**
* Constructor
*
* @param StringScrambler $scrambler
* @return void
**/
public function __construct(StringScrambler $scrambler)
{
parent::__construct($scrambler);
}
/**
* Before node traversal
*
* @param Node[] $nodes
* @return array
**/
public function beforeTraverse(array $nodes)
{
$this
->resetRenamed()
->scanPropertyDefinitions($nodes);
return $nodes;
}
/**
* Check all variable nodes
*
* @param Node $node
* @return void
**/
public function enterNode(Node $node)
{
if ($node instanceof PropertyFetch) {
if (!is_string($node->name) || $node->var->name !== "this") {
return;
}
if ($this->isRenamed($node->name)) {
$node->name = $this->getNewName($node->name);
return $node;
}
}
if ($node instanceof Node\Expr\StaticPropertyFetch) {
if ((string)$node->class !== "self") {
return;
}
if ($this->isRenamed($node->name)) {
$node->name = $this->getNewName($node->name);
return $node;
}
}
}
/**
* Recursively scan for private method definitions and rename them
*
* @param Node[] $nodes
* @return void
**/
private function scanPropertyDefinitions(array $nodes)
{
foreach ($nodes as $node) {
// Scramble the private method definitions
if ($node instanceof Property && ($node->type & ClassNode::MODIFIER_PRIVATE)) {
foreach($node->props as $property) {
// Record original name and scramble it
$originalName = $property->name;
$this->scramble($property);
// Record renaming
$this->renamed($originalName, $property->name);
}
}
// Recurse over child nodes
if (isset($node->stmts) && is_array($node->stmts)) {
$this->scanPropertyDefinitions($node->stmts);
}
}
}
}