استفاده از کدهای اسمبلی به صورت inline در سی شارپ
سلام به همه دوستان
من تو یه پروژه لازم دارم یه سری کارها رو با زبان اسمبلی انجام بدم حالا سوالم اینه که چطوری میتونم کدهای اسمبلی رو به صورت inline در بین کدهای سی شارپ استفاده کنم ؟؟
تو C++ با دستور asm__ اینکار رو میکردیم اینجا قضیه چطوری هست ؟؟
پیشاپیش از دوستانی که همکاری میکنند متشکرم :چشمک:
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
دقیقا" میخواستم همین رو بپرسم.:گیج::کف::متعجب:شما زودتر پریسدی.
یه روش بلدم که با DEP حال نمیکنه.
یه روش دیگه هم بلدم که مشکل codesize داره.
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
نقل قول:
نوشته شده توسط
FastCode
دقیقا" میخواستم همین رو بپرسم.:گیج::کف::متعجب:شما زودتر پریسدی.
یه روش بلدم که با DEP حال نمیکنه.
یه روش دیگه هم بلدم که مشکل codesize داره.
:چشمک:
حالا شما لطف کن همین دو روشی که میدونی رو بگو تا بعدا ببینیم دوستان دیگه روش بهتری میدونند یا نه ؟؟
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
تا اونجایی که بنده اطلاع دارم همچین قابلیتی در #C وجود نداره , علتش هم فکر کنم به خاطر رفتارهای پر خطری هست که میشه با اسمبلی انجام داد ؛ در واقع مایکروسافت در فریم ورک دات نت یکی از عمده تلاشهاش اینه که کمترین ریسک در برنامه های تولیدی تحت دات نت وجود داشته باشه.
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
نقل قول:
نوشته شده توسط
CYCLOPS
:چشمک:
حالا شما لطف کن همین دو روشی که میدونی رو بگو تا بعدا ببینیم دوستان دیگه روش بهتری میدونند یا نه ؟؟
روش اول اینه که متغیر _methodpter رو درون شی دلگیت به یه متغیر ارجا میدیم.
روش دوم اینه که یه پراسیجر با lots of spaghetti درست مکنیم.بعد آدرسش رو میگیریم و توشو عوش میکنیم.
اولی با DEP مشکل داره و دومی هم اندازه ی کد.
من از هر دو روش جواب گرفتم ولی دنبال یه چیز بهتر هستم.
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
نقل قول:
نوشته شده توسط
FastCode
روش اول اینه که متغیر _methodpter رو درون شی دلگیت به یه متغیر ارجا میدیم.
روش دوم اینه که یه پراسیجر با lots of spaghetti درست مکنیم.بعد آدرسش رو میگیریم و توشو عوش میکنیم.
اولی با DEP مشکل داره و دومی هم اندازه ی کد.
من از هر دو روش جواب گرفتم ولی دنبال یه چیز بهتر هستم.
دوست عزیز متاسفانه چیزی از مطالبی که گفتی سر در نیاوردم
خواهشا یه تکه کد که خودت هم جواب گرفتی به عنوان مثال بذار
بازم ممنون
نقل قول: استفاده از کدهای اسمبلی به صورت inline در سی شارپ
1.
using System;
using System.Reflection;
class Program
{
public delegate uint Ret1ArgDelegate(uint arg1);
static uint PlaceHolder1(uint arg1) { return 0; }
public static byte[] asmBytes = new byte[]
{
0x89,0xD0, // MOV EAX,EDX
0xD1,0xC8, // ROR EAX,1
0xC3 // RET
};
unsafe static void Main(string[] args)
{
fixed(byte* startAddress = &asmBytes[0]) // Take the address of our x86 code
{
// Get the FieldInfo for "_methodPtr"
Type delType = typeof(Delegate);
FieldInfo _methodPtr = delType.GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);
// Set our delegate to our x86 code
Ret1ArgDelegate del = new Ret1ArgDelegate(PlaceHolder1);
_methodPtr.SetValue(del, (IntPtr)startAddress);
// Enjoy
uint n = (uint)0xFFFFFFFC;
n = del(n);
Console.WriteLine("{0:x}", n);
}
}
}
DEP
2.(کدش رو پیدا نمیکنم.:خجالت:)
3.این یکی با DEP مشکل نداره ولی هنوز هم قابلیت کدنویسی نداره:(همین الان پیدا کردم):
[DllImport("coredll.dll", SetLastError = true)]
static extern int[] VirtualAlloc(int lpAddress, int dwSize,uint
flAllocationType, uint flProtect);
IntPtr pExecutableBuffer = VirtualAlloc(
IntPtr.Zero,
new IntPtr(byteCount),
AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
MemoryProtection.PAGE_EXECUTE_READWRITE);