Skip to content

Commit c25a339

Browse files
olifozzyoleavr
authored andcommitted
Handle field / method name collisions (#21)
1 parent 216d0d7 commit c25a339

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

lib/class-factory.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,14 @@ function ClassFactory (vm) {
669669
try {
670670
const fieldName = invokeObjectMethodNoArgs(env.handle, field, fieldGetName);
671671
try {
672-
const fieldjsName = env.stringFromJni(fieldName);
672+
let fieldjsName = env.stringFromJni(fieldName);
673+
while (jsMethods.hasOwnProperty(fieldjsName)) {
674+
fieldjsName = "_" + fieldjsName;
675+
}
676+
673677
const fieldHandle = env.newGlobalRef(field);
674678
fieldHandles.push(fieldHandle);
679+
675680
jsFields[fieldjsName] = fieldHandle;
676681
} finally {
677682
env.deleteLocalRef(fieldName);

test/re/frida/MethodTest.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,61 @@ public void genericsCanBeUsed() {
6565
assertEquals("Badger", script.getNextMessage());
6666
}
6767

68+
@Test
69+
public void fieldsThatCollideWithMethodsGetSuffixed() {
70+
loadScript("var Collider = Java.use('re.frida.Collider');" +
71+
"var collider = Collider.$new();" +
72+
"send(collider._particle);");
73+
assertEquals("1", script.getNextMessage());
74+
}
75+
76+
@Test
77+
public void methodsThatCollideWithFieldsKeepName() {
78+
loadScript("var Collider = Java.use('re.frida.Collider');" +
79+
"var collider = Collider.$new();" +
80+
"send(collider.particle());");
81+
assertEquals("3", script.getNextMessage());
82+
}
83+
84+
@Test
85+
public void fieldsThatCollideWithMethodsGetSuffixed2() {
86+
loadScript("var Collider = Java.use('re.frida.Collider');" +
87+
"var collider = Collider.$new();" +
88+
"send(collider._particle2);");
89+
assertEquals("2", script.getNextMessage());
90+
}
91+
92+
@Test
93+
public void methodsThatCollideWithFieldsKeepName2() {
94+
loadScript("var Collider = Java.use('re.frida.Collider');" +
95+
"var collider = Collider.$new();" +
96+
"send(collider.particle2());");
97+
assertEquals("4", script.getNextMessage());
98+
}
99+
100+
@Test
101+
public void collidedMethodsFieldsCanStillBeInstrumented() {
102+
loadScript("var Collider = Java.use('re.frida.Collider');" +
103+
"Collider._particle.implementation = function () {" +
104+
"return 11;" +
105+
"};" +
106+
"Collider._particle2.implementation = function () {" +
107+
"return 22;" +
108+
"};" +
109+
"Collider.particle.implementation = function () {" +
110+
"return 33;" +
111+
"};" +
112+
"Collider.particle2.implementation = function () {" +
113+
"return 44;" +
114+
"};");
115+
116+
Collider collider = new Collider();
117+
assertEquals(11, Collider.particle);
118+
assertEquals(22, collider.particle2);
119+
assertEquals(33, collider.particle());
120+
assertEquals(44, Collider.particle2());
121+
}
122+
68123
// @Test
69124
public void interfaceCanBeImplemented() {
70125
loadScript("var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');" +
@@ -118,3 +173,16 @@ public int returnZero() {
118173
return 0;
119174
}
120175
}
176+
177+
class Collider {
178+
static int particle = 1;
179+
int particle2 = 2;
180+
181+
int particle() {
182+
return 3;
183+
}
184+
185+
static int particle2() {
186+
return 4;
187+
}
188+
}

0 commit comments

Comments
 (0)