fake.so 파일을 libil2cpp.so 로 덮어버리는 스크립트
사용되는 상황으로는
암호화 되거나 패킹된 libil2cpp.so 와 global_metadata 를 복호화한 후 수정하거나,
다른 방법으로 수정된 libil2cpp.so 를 만들었다고 가정했을때
특정 부분에서 암호화 되거나 패킹된 libil2cpp.so 를 복호화하는 부분을 후킹 하고 난 다음.
아래의 스크립트를 활용해서 fake.so를 libil2cpp.so 로 교체할 수 있습니다.
아래 스크립트의 동작의 예는
/data/local/tmp/fake.so 파일을 복사해서 /data/data/com.blah.blah.blah/libil2cpp.so 로 덮습니다.
이때 /data/local/tmp/fake.so 의 권한을 한번 확인해보시는게 좋습니다.
저같은경우는 덮을때 /data/local/tmp/fake.so 권한에러가 발생한 적이 있습니다.
Java.perform(function(){
const File = Java.use('java.io.File');
const FileInputStream = Java.use('java.io.FileInputStream');
const FileOutputStream = Java.use('java.io.FileOutputStream');
const FileChannel = Java.use('java.nio.channels.FileChannel');
var oriFile = File.$new.overload('java.lang.String').call(File, '/data/local/tmp/fake.so');
if (oriFile.exists() && oriFile.canRead()) {
var targetFile = File.$new.overload('java.lang.String').call(File, '/data/data/com.blah.blah.blah/libil2cpp.so');
var fileInputStream = FileInputStream.$new.overload('java.io.File').call(FileInputStream, oriFile);
var fileOutputStream = FileOutputStream.$new.overload('java.io.File').call(FileOutputStream, targetFile);
var fileInputStreamChannel = fileInputStream.getChannel();
var fileOutputStreamChannel = fileOutputStream.getChannel();
fileInputStreamChannel.transferTo(0, fileInputStreamChannel.size(), fileOutputStreamChannel);
fileInputStream.close();
fileOutputStream.close();
}
else {
console.log('Error : File cannot read.')
}
})
PS. 여담인데 제가 잘 몰라서그런거일 수도 있는데.
NOX 플레이어 최신버전 (6.6.1.2)을 설치하니까 ROOT사용을 안함으로 체크한 상태에서도 ADB SHELL 에서 ROOT 권한을 얻을 수 있네요
모든 에뮬레이터들이 다 그런가요???
신기하네요 ㅋㅋ