Skip to content

Commit f2ad54b

Browse files
author
Manohar Akula
committed
first commit.. all the files
0 parents  commit f2ad54b

8 files changed

+173
-0
lines changed

ClassModifier.h

+13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ClassModifier.java

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import javassist.*;
2+
3+
public class ClassModifier {
4+
public static void main(String[] args) {
5+
try {
6+
System.loadLibrary("jvmfaketime");
7+
8+
ClassPool pool = ClassPool.getDefault();
9+
CtClass systemClass = pool.get("java.lang.System");
10+
11+
systemClass.addField(
12+
CtField.make("public static long fakeTimeOffset;", systemClass)
13+
);
14+
15+
systemClass.addMethod(
16+
CtNewMethod.make(
17+
"public static void resetTime() { System.fakeTimeOffset = 0L; }",
18+
systemClass)
19+
);
20+
21+
systemClass.addMethod(
22+
CtNewMethod.make(
23+
"public static void moveTimeBy(long offset) { System.fakeTimeOffset += offset; }",
24+
systemClass)
25+
);
26+
27+
systemClass.addMethod(
28+
CtNewMethod.make(
29+
Modifier.PUBLIC | Modifier.STATIC | Modifier.NATIVE,
30+
CtClass.longType,
31+
"trueCurrentTimeMillis",
32+
new CtClass[0],
33+
new CtClass[0],
34+
null,
35+
systemClass)
36+
);
37+
38+
systemClass.addMethod(
39+
CtNewMethod.make(
40+
Modifier.PUBLIC | Modifier.STATIC | Modifier.NATIVE,
41+
CtClass.voidType,
42+
"startFakingTime",
43+
new CtClass[0],
44+
new CtClass[0],
45+
null,
46+
systemClass)
47+
);
48+
49+
systemClass.writeFile();
50+
} catch (Exception e) {
51+
e.printStackTrace();
52+
}
53+
}
54+
}

README.md

Whitespace-only changes.

Tests.java

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import java.util.*;
2+
import java.lang.reflect.Method;
3+
import static java.lang.System.*;
4+
5+
public class Tests {
6+
public static void main(String[] args) {
7+
try {
8+
Method m = ClassLoader.class.getDeclaredMethod("loadLibrary", Class.class, String.class, Boolean.TYPE);
9+
m.setAccessible(true);
10+
m.invoke(null, java.lang.System.class, "jvmfaketime", false);
11+
} catch (Exception e) {
12+
System.out.println("couldn't load native library.");
13+
}
14+
15+
out.println("current time: " + new Date());
16+
17+
startFakingTime();
18+
moveTimeBy(30 * 24 * 60 * 60 * 1000l);
19+
out.println("faked by 30 days: " + new Date());
20+
out.println("faked still, true time: " + new Date());
21+
resetTime();
22+
out.println("defaked: " + new Date());
23+
startFakingTime();
24+
moveTimeBy(1 * 24 * 60 * 60 * 1000l);
25+
out.println("faked by 1 day again: " + new Date());
26+
}
27+
}

build-linux.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
cc -I '$JAVA_HOME/include' -I '$JAVA_HOME/include/darwin' -o libjvmfaketime.dylib -dynamiclib jvmfaketime.c
2+
echo "compiled libjvmfaketime.so..."
3+
4+
sudo cp libjvmfaketime.dylib $JAVA_HOME/jre/lib
5+
echo "installed libjvmfaketime in $JAVA_HOME/jre/lib"
6+
7+
javac -cp javassist.jar:. ClassModifier.java
8+
java -cp .:javassist.jar -Djava.library.path=. ClassModifier
9+
jar -cf jvmfaketime.jar java/
10+
echo "generated jvmfaketime.jar in current directory"
11+
12+
echo "\nexecuting fake time functions, please verify manually"
13+
javac -Xbootclasspath/p:jvmfaketime.jar Tests.java
14+
java -cp . -Xbootclasspath/p:jvmfaketime.jar Tests

build-osx.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
cc -I "$JAVA_HOME/include" -I "$JAVA_HOME/include/darwin" -o libjvmfaketime.dylib -dynamiclib jvmfaketime.c
2+
echo "compiled libjvmfaketime.dylib..."
3+
4+
sudo cp libjvmfaketime.dylib $JAVA_HOME/jre/lib
5+
echo "installed libjvmfaketime in $JAVA_HOME/jre/lib"
6+
7+
javac -cp javassist.jar:. ClassModifier.java
8+
java -cp .:javassist.jar -Djava.library.path=. ClassModifier
9+
jar -cf jvmfaketime.jar java/
10+
echo "generated jvmfaketime.jar in current directory"
11+
12+
echo "\nexecuting fake time functions, please verify manually"
13+
javac -Xbootclasspath/p:jvmfaketime.jar Tests.java
14+
java -cp . -Xbootclasspath/p:jvmfaketime.jar Tests

jvmfaketime.c

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <jni.h>
2+
#include <sys/time.h>
3+
#include <stdlib.h>
4+
5+
long long system_time() {
6+
struct timeval now;
7+
gettimeofday(&now, NULL);
8+
return now.tv_sec * 1000LL + now.tv_usec / 1000LL;
9+
}
10+
11+
JNIEXPORT jlong JNICALL Fake_CurrentTimeMillis(JNIEnv* env, jclass jc) {
12+
jfieldID field = (*env)->GetStaticFieldID(env, jc, "fakeTimeOffset", "J");
13+
if (field == NULL || (*env)->ExceptionCheck(env)) {
14+
(*env)->ExceptionClear(env);
15+
return 0;
16+
}
17+
jlong offset = (*env)->GetStaticLongField(env, jc, field);
18+
return system_time() + offset;
19+
}
20+
21+
JNIEXPORT jlong JNICALL Fake_TrueCurrentTimeMillis(JNIEnv* env, jclass jc) {
22+
return system_time();
23+
}
24+
25+
static JNINativeMethod fake_method[] = {
26+
{ "currentTimeMillis", "()J", (void*) &Fake_CurrentTimeMillis },
27+
{ "trueCurrentTimeMillis", "()J", (void*) &Fake_TrueCurrentTimeMillis }
28+
};
29+
30+
JNIEXPORT void JNICALL Java_java_lang_System_startFakingTime(JNIEnv *env, jclass cls) {
31+
(*env)->RegisterNatives(env, cls, fake_method, sizeof(fake_method) / sizeof(fake_method[0]));
32+
}

notes.txt

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--- java6
2+
C_INCLUDE_PATH=/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers cc jvmfaketime.c -o libjvmfaketime.dylib -dynamiclib -lcurl
3+
sudo cp libjvmfaketime.dylib /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Libraries
4+
5+
javac -cp javassist.jar:. ClassModifier.java
6+
java -cp .:javassist.jar -Djava.library.path=. ClassModifier
7+
8+
javac -Xbootclasspath/p:. Test.java
9+
java -cp . -Xbootclasspath/p:. Test
10+
11+
--- java7
12+
C_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/include cc -I '/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/include/darwin' jvmfaketime.c -o libjvmfaketime.dylib -dynamiclib -lcurl
13+
sudo cp libjvmfaketime.dylib /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib
14+
15+
javac -cp javassist.jar:. ClassModifier.java
16+
java -cp .:javassist.jar -Djava.library.path=. ClassModifier
17+
18+
javac -Xbootclasspath/p:. Test.java
19+
java -cp . -Xbootclasspath/p:. Test

0 commit comments

Comments
 (0)