Exemplo n.º 1
0
        public Int32 GenerateCallInt(ParameterInfo parameterInfo)
        {
            var attr = parameterInfo.GetCustomAttributes(typeof(ASMRef), false);

            // var method = attr[0] as ASMMethodAttribute;

            if (attr.Length > 0)//Ref)
            {
                Ref = true;
                var ptr = GCHandleBypass.Alloc(Value, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32();
                RefResultPtr = ptr;
                return(ptr);
            }
            else
            {
                if (_isIntOrSmaller())
                {
                    return((int)(object)Value);
                }
                else
                {
                    WentRefForced = true;
                    //force ref due 32 bit OS (R0, R1, R2, etc = 32 bit int)
                    var ptr = GCHandleBypass.Alloc(Value, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32();
                    RefResultPtr = ptr;
                    return(ptr);
                }
            }
        }
Exemplo n.º 2
0
        IEnumerable <byte> DCD_bytes(params object[] objects)
        {
            //int asd = 10;
            // var od = GCHandleBypass.Alloc(asd, GCHandleType.Pinned);
            // var ad = od.AddrOfPinnedObject();
            // var lk = asd;

            var addresses = objects.Reverse().Select(obj => BitConverter.GetBytes(GCHandleBypass.Alloc(obj, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32())).ToArray();

            foreach (var bArray in addresses)
            {
                foreach (var b in bArray)
                {
                    yield return(b);
                }
            }
        }
Exemplo n.º 3
0
        public void TestCall(int funcAddress, object[] obj)
        {
            var addr = funcAddress;

            var objAddr = obj.Select(o => GCHandleBypass.Alloc(o, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32()).ToArray();

            //var msgIntPtr = GCHandleBypass.Alloc(msgInt, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32();
            //var args = DCD_bytes(addr, msgIntPtr).ToArray();
            //            asm.AddRange(new byte[]
            //            {
            //0x04, 0xE0, 0x2D, 0xE5,
            //0x08, 0x30, 0x9F, 0xE5,
            //0x0F, 0xE0, 0xA0, 0xE1,
            //0x03, 0xF0, 0xA0, 0xE1,
            //0x04, 0xF0, 0x9D, 0xE4,
            ///*0x48, 0x95, 0x46, 0x15 [insert 32 bit func ptr] > */
            //0x00, 0x00, 0x9F, 0xE5,
            //0x0E, 0xF0, 0xA0, 0xE1 /*(return)*/
            //            });
            asm.AddRange(new byte[]
            {
                0x04, 0xE0, 0x2D, 0xE5, //[SKIP]skip for edit //str         lr, [sp, #-4]!
//0x08, 0x30, 0x9F, 0xE5, //ldr r3 = #8
            });
            List <byte> asm2 = new List <byte>();
            //for (int i = objAddr.Length * 0x10 - 0x10, reg = objAddr.Length; i > -1; i -= 0x10, reg -=0x10)
            //{
            //    asm.AddRange(LDR((byte)i, (byte)(reg)));
            //}
            var asa = Enumerable.Range(0, objAddr.Length).Select(o =>
            {
                var ia = (int)(0xE59F0010 + (0x8 * o) + (o * 0x1000));
                return(BitConverter.GetBytes(ia));
            }).Reverse().ToArray();

            foreach (var item in asa)
            {
                asm.AddRange(item);
            }

            var asm2R = asm2.ToArray();

            //asm.AddRange(LDR(0x10, 0));
            asm.AddRange(LDR(0x8, /*(byte)(objAddr.Length * 0x10 + 0x10)*/ 0x30));

            asm.AddRange(new byte[] {
                0x0F, 0xE0, 0xA0, 0xE1, //[SKIP]mov         lr, pc
                0x03, 0xF0, 0xA0, 0xE1, //[SKIP]mov         pc, r3
                0x04, 0xF0, 0x9D, 0xE4  //[SKIP]ldr         pc, [sp], #4
            });

            //var bits = BitConverter.GetBytes(addr);
            asm.AddRange(BitConverter.GetBytes(addr)); //place DCD args
            foreach (var item in objAddr)
            {
                asm.AddRange(BitConverter.GetBytes(item)); //place DCD args
            }
            //asm.AddRange(BitConverter.GetBytes(msgIntPtr)); //place DCD args
            asm.AddRange(new byte[]
            {
                0x00, 0x00, 0x9F, 0xE5, //[SKIP]ldr         r0, [pc]
                0x0E, 0xF0, 0xA0, 0xE1  /*(return)*/
            });
        }