protected override void onCreate(Bundle savedInstanceState) { var activity = this; base.onCreate(savedInstanceState); var sv = new ScrollView(this); var ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); sv.addView(ll); var t = typeof(MemoryFile); //var m = Activator.CreateInstance(t); //E/AndroidRuntime( 4217): Caused by: java.lang.InstantiationException: class android.os.MemoryFile has no zero argument constructor //E/AndroidRuntime( 4217): at java.lang.Class.newInstance(Class.java:1641) //E/AndroidRuntime( 4217): at ScriptCoreLibJava.BCLImplementation.System.__Activator.CreateInstance(__Activator.java:27) //E/AndroidRuntime( 4217): ... 14 more //E/AndroidRuntime( 4217): Caused by: java.lang.NoSuchMethodException: <init> [] //E/AndroidRuntime( 4217): at java.lang.Class.getConstructor(Class.java:531) //E/AndroidRuntime( 4217): at java.lang.Class.getDeclaredConstructor(Class.java:510) //E/AndroidRuntime( 4217): at java.lang.Class.newInstance(Class.java:1639) //E/AndroidRuntime( 4217): ... 15 more var m_descriptor = 0; var m_fd = default(java.io.FileDescriptor); var pid = android.os.Process.myPid(); var uid = android.os.Process.myUid(); //try { m = new MemoryFile(default(string), 0); } try { m = new MemoryFile("name1", 0x07); } catch { throw; } try { m.writeBytes( new byte[] { 7, 6, 5, 4, 3, 2, 1 }, 0, 0, 0x07 ); } catch { } var buffer = new byte[0x07]; try { m.readBytes(buffer, 0, 0, 0x07); } catch { } var buffer0 = buffer[0]; //new Button(this).AttachTo(ll).WithText(new { t, m, buffer0 }.ToString()); new Button(this).AttachTo(ll).WithText(new { buffer0 }.ToString()); #region fields var fields = t.GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); new Button(this).AttachTo(ll).WithText("fields: " + new { fields.Length }.ToString()); fields.WithEach( SourceField => { //E/AndroidRuntime( 9919): Caused by: java.lang.IllegalAccessException: Cannot access field: java.io.FileDescriptor android.os.MemoryFile.mFD //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Native Method) //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Field.java:279) //E/AndroidRuntime( 9919): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__FieldInfo.GetValue(__FieldInfo.java:46) var value = SourceField.GetValue(m); var xFileDescriptor = value as java.io.FileDescriptor; if (xFileDescriptor != null) { m_fd = xFileDescriptor; var xfields = typeof(java.io.FileDescriptor).GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); xfields.WithEach( xFileDescriptor_SourceField => { var xvalue = xFileDescriptor_SourceField.GetValue(value); //if (xFileDescriptor_SourceField.FieldType == typeof(int)) if (xFileDescriptor_SourceField.Name == "descriptor") { m_descriptor = (int)xvalue; } new Button(this).AttachTo(ll).WithText(xFileDescriptor_SourceField + new { xvalue }.ToString()); } ); } else { new Button(this).AttachTo(ll).WithText(new { SourceField, value }.ToString()); } } ); #endregion //var pfd = default(android.os.ParcelFileDescriptor); //try //{ // pfd = android.os.ParcelFileDescriptor.dup( // m_fd // ); //} //catch //{ //} new Button(activity).WithText("Next \n " + new { pid, uid //, //pfd = pfd.getFd(), //size = pfd.getStatSize() }).AttachTo(ll).AtClick( delegate { Intent intent = new Intent(activity, typeof(SecondaryActivity).ToClass()); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // share scope intent.putExtra("m_descriptor", m_descriptor); intent.putExtra("pid", pid); //intent.putExtra("pfd", pfd); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); try { Console.WriteLine("new LocalServerSocket"); var ss = new LocalServerSocket("MemoryFileDescriptor0"); // cached backgroun process? // switching to another process.. easy... activity.startActivity(intent); Console.WriteLine("before LocalServerSocket accept"); // http://alvinalexander.com/java/jwarehouse/android/core/tests/coretests/src/android/net/LocalSocketTest.java.shtml var ls = ss.accept(); Console.WriteLine("after LocalServerSocket accept"); ls.setFileDescriptorsForSend(new[] { m_fd }); ls.getOutputStream().write(42); } catch { throw; } } ); this.setContentView(sv); // https://developer.android.com/training/run-background-service/create-service.html }
protected override void onCreate(Bundle savedInstanceState) { // http://unix.stackexchange.com/questions/10050/proc-pid-fd-x-link-number // http://stackoverflow.com/questions/21955273/sharing-shared-memory-file-descriptors-across-android-app-processes-using-binder // http://permalink.gmane.org/gmane.comp.handhelds.android.porting/10904 // http://www.mkyong.com/android/android-activity-from-one-screen-to-another-screen/ // https://groups.google.com/forum/#!topic/android-ndk/sjIiMsLkHCM base.onCreate(savedInstanceState); var sv = new ScrollView(this); var ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); sv.addView(ll); var activity = this; // does it work for us? var fs = default(java.io.FileDescriptor); try { var ls = new LocalSocket(); ls.connect(new LocalSocketAddress("MemoryFileDescriptor0")); var i8 = ls.getInputStream().read(); fs = ls.getAncillaryFileDescriptors().FirstOrDefault(); new Button(this).AttachTo(ll).WithText(new { i8, fs }.ToString()); //var memory0 = new FileInputStream(ls_fd).read(); //new Button(this).AttachTo(ll).WithText(new { memory0 }.ToString()); } catch { } var m = default(MemoryFile); //try { m = new MemoryFile(default(string), 0); } try { m = new MemoryFile("name1", 0x07); } catch { throw; } var m_descriptor = this.getIntent().getIntExtra("m_descriptor", 0); var parentpid = this.getIntent().getIntExtra("pid", 0); //var pfd = (ParcelFileDescriptor)this.getIntent().getParcelableExtra("pfd"); ////var fs = new java.io.FileDescriptor { }; ////var xfields = typeof(java.io.FileDescriptor).GetFields( //// System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ////); ////xfields.WithEach( //// xFileDescriptor_SourceField => //// { //// var xvalue = xFileDescriptor_SourceField.GetValue(fs); //// //if (xFileDescriptor_SourceField.FieldType == typeof(int)) //// if (xFileDescriptor_SourceField.Name == "descriptor") //// { //// xFileDescriptor_SourceField.SetValue(fs, m_descriptor); //// } //// } ////); // need to call native_mmap var t = typeof(MemoryFile); // internal static int native_mmap(java.io.FileDescriptor fd, int length, int mode); //var native_mmap = t.GetMethod("native_mmap", new[] { // typeof(java.io.FileDescriptor), // typeof(int), // typeof(int) // } //); //var methods = t.GetMethods( // System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static //); //var native_mmap = methods.FirstOrDefault(x => x.Name == "native_mmap"); //#region time to patch it? //#endregion //var available = 0; var buffer = new byte[0x07]; //X:\jsc.svn\examples\java\android\Test\TestNewByteArray7\TestNewByteArray7\Class1.cs //try { m.readBytes(buffer, 0, 0, 0x07); } //catch { } //try //{ // //buffer0 = new java.io.FileInputStream(fs).read(); // available = new java.io.FileInputStream(fs).available(); //} //catch //{ } //var parentpidfd = "/proc/" + parentpid + "/fd/" + m_descriptor; //var parentpidfdx = global::System.IO.File.Exists(parentpidfd); //var parentpidf = new java.io.File(parentpidfd); //new Button(this).AttachTo(ll).WithText(new { parentpidfdx }.ToString()); //new Button(this).AttachTo(ll).WithText(new { parentpidfd }.ToString()); //new Button(this).AttachTo(ll).WithText(new { size = parentpidf.length() }.ToString()); //var parentfd = ParcelFileDescriptor.open(parentpidf, ParcelFileDescriptor.MODE_READ_WRITE); var pid = android.os.Process.myPid(); var uid = android.os.Process.myUid(); this.setTitle( new { pid, uid //m_descriptor, //parentpid, ////pfg = pfd.getFd(), ////size = pfd.getStatSize() //parentpidfdx, //parentpidfd }.ToString() ); //new Button(this).AttachTo(ll).WithText("methods: " + new //{ // methods.Length // , // native_mmap //}.ToString()); //methods.WithEach( // SourceMethod => // { // new Button(this).AttachTo(ll).WithText(new { SourceMethod }.ToString()); // } //); Action patch = delegate { }; #region fields var fields = t.GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); new Button(this).AttachTo(ll).WithText("fields: " + new { fields.Length }.ToString()); fields.WithEach( SourceField => { //E/AndroidRuntime( 9919): Caused by: java.lang.IllegalAccessException: Cannot access field: java.io.FileDescriptor android.os.MemoryFile.mFD //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Native Method) //E/AndroidRuntime( 9919): at java.lang.reflect.Field.get(Field.java:279) //E/AndroidRuntime( 9919): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__FieldInfo.GetValue(__FieldInfo.java:46) var value = SourceField.GetValue(m); var xFileDescriptor = value as java.io.FileDescriptor; if (xFileDescriptor != null) { var xfields = typeof(java.io.FileDescriptor).GetFields( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ); xfields.WithEach( xFileDescriptor_SourceField => { var xvalue = xFileDescriptor_SourceField.GetValue(value); //if (xFileDescriptor_SourceField.FieldType == typeof(int)) if (xFileDescriptor_SourceField.Name == "descriptor") { //m_descriptor = (int)xvalue; patch = delegate { Console.WriteLine("enter patch " + new { SourceField }); //mAddress = native_mmap(mFD, length, modeToProt(mode)); //mOwnsRegion = false; SourceField.SetValue(m, fs); //xFileDescriptor_SourceField.SetValue(value, m_descriptor); value = SourceField.GetValue(m); xvalue = xFileDescriptor_SourceField.GetValue(value); var field_mAddress = fields.FirstOrDefault(xx => xx.Name == "mAddress"); Console.WriteLine("enter patch " + new { xvalue } + " invoke mmap"); var PROT_READ = 0x1; //E/AndroidRuntime( 8047): Caused by: java.lang.IllegalAccessException: access to method denied //E/AndroidRuntime( 8047): at java.lang.reflect.Method.invokeNative(Native Method) //E/AndroidRuntime( 8047): at java.lang.reflect.Method.invoke(Method.java:507) //E/AndroidRuntime( 8047): at ScriptCoreLibJava.BCLImplementation.System.Reflection.__MethodInfo.InternalInvoke(__MethodInfo.java:93) //I/System.Console( 8648): 21c8:0001 enter patch { field_mAddress = int mAddress } invoke native_mmap //I/System.Console( 8936): 22e8:0001 GetFields { Length = 5, IsPublic = false, IsNonPublic = true, IsStatic = fal //I/System.Console( 8936): 22e8:0001 enter patch //I/System.Console( 8936): 22e8:0001 enter patch { field_mAddress = int mAddress, m_descriptor = 39 } invoke mmap //I/System.Console( 8936): 22e8:0001 lib: libs/armeabi_v7a/libTestNDKAsAsset.so //I/System.Console( 8936): 22e8:0001 loadLibrary: TestNDKAsAsset //I/System.Console( 8936): 22e8:0001 exit patch { mAddress = -1 } //var z = ScriptCoreLibNative.SystemHeaders.sys.mman_h.mmap( // null, // length, // PROT_READ | PROT_WRITE, // MAP_SHARED, // fd, // 0 // ); // I/System.Console( 8016): 1f50:0001 enter patch { SourceField = java.io.FileDescriptor mFD } //I/System.Console( 8016): 1f50:0001 enter patch { field_mAddress = long mAddress, xvalue = 32 } invoke mmap //I/System.Console( 8016): 1f50:0001 lib: libs/armeabi_v7a/libTestNDKAsAsset.so //I/System.Console( 8016): 1f50:0001 loadLibrary: TestNDKAsAsset //I/System.Console( 8016): 1f50:0001 exit patch { mAddress = -1 } //I/System.Console( 9792): 2640:0001 enter patch { SourceField = java.io.FileDescriptor mFD } //I/System.Console( 9792): 2640:0001 enter patch { xvalue = 32 } invoke mmap //I/xNativeActivity( 9792): x:\jsc.svn\examples\c\android\Test\TestNDKAsAsset\TestNDKAsAsset\Program.cs:139 mmap -1 errno: 13 Permission denied //I/System.Console( 9792): 2640:0001 exit patch { mAddress = -1 } //E/audit ( 5152): type=1400 msg=audit(1433328685.131:566): avc: denied { mmap_zero } for pid=9792 comm="Activities:foo1" scontext=u:r:untrusted_app:s0 tcontext=u:r:untrusted_app:s0 tclass=memprotect permissive=0 //E/audit ( 5152): SEPF_SM-G925F_5.0.2_0009 //E/audit ( 5152): type=1300 msg=audit(1433328685.131:566): arch=40000028 syscall=192 success=no exit=-13 a0=0 a1=7 a2=3 a3=10 items=0 ppid=2962 ppcomm=main pid=9792 auid=4294967295 uid=10315 gid=10315 euid=10315 suid=10315 fsuid=10315 egid=10315 sgid=10315 fsgid=10315 ses=4294967295 tty=(none) comm="Activities:foo1" exe="/system/bin/app_process32" subj=u:r:untrusted_app:s0 key=(null) //E/audit ( 5152): type=1320 msg=audit(1433328685.131:566): //D/SSRM:n ( 3468): SIOP:: AP = 290, PST = 300, CP = 395, CUR = 268 // https://github.com/realm/realm-java/issues/1037 var mAddress = (int) // ??? TestNDKAsAsset.xActivity.mmap( (int)xvalue, 0x07 ); // https://android.googlesource.com/platform/development/+/858086e/ndk/sources/android/libportable/arch-mips/mmap.c // https://groups.google.com/forum/#!msg/android-ndk/tNYpTsHNQEY/8S7VS2j8f_8J // jint result = (jint)mmap(NULL, length, prot, MAP_SHARED, fd, 0); //native_mmap.Invoke(null, // new object[] // { // value, // 0x07, // PROT_READ // } //); Console.WriteLine("exit patch " + new { mAddress }); field_mAddress.SetValue(m, mAddress); // http://stackoverflow.com/questions/8165216/what-is-the-use-of-memoryfile-in-android // http://osdir.com/ml/Android-Developers/2013-01/msg00793.html }; } new Button(this).AttachTo(ll).WithText(xFileDescriptor_SourceField + new { xvalue }.ToString()); } ); } else { new Button(this).AttachTo(ll).WithText(new { SourceField, value }.ToString()); } } ); #endregion new Button(activity).WithText("Patch n Read!").AttachTo(ll).AtClick( delegate { patch(); //return; //this.finish(); //E/AndroidRuntime( 7526): Caused by: java.lang.NoSuchMethodError: android.app.Activity.finishAndRemoveTask //E/AndroidRuntime( 7526): at TestMultiProcMemoryFile.Activities.SecondaryActivity._onCreate_b__0(SecondaryActivity.java:66) //this.finishAndRemoveTask(); //try { m.readBytes(buffer, 0, 0, 0x07); } //catch { } //var buffer0 = buffer[0]; //this.setTitle( // new { m_descriptor, buffer0 }.ToString() //); } ); this.setContentView(sv); }