(۲۰-مرداد-۱۳۸۹, ۰۴:۵۶:۰۰)Cyrus نوشته است: [ -> ]نقل قول: پکر ها هم کار خاصی نمیکنن و فقط یک محدوده رو میگیرین و کد میکنن(فکر کن داری یک رشته 1000کاراکتری رو کد میکنی) بعد تابع دیکد رو توی فایل مینویسن و نقطه اجرایی برنامه رو میدن به اول تابع دیکد
مي شه يك مثال ساده از اين كار رو بذاريد و توضيح بديد؟ ممنون مي شم.
سلام
دست جوكر درد نكنه . گفتم واس ساختار بگم ، همه چيز رو بهم بريزي بهتر ديدم كه من چيزي نگم(به علت بد توضیح دادن
)
خوب بعضی ها که ساختار فایل رو میبینن یکمی بهم میریزن که چی شد و چی نشد؟بهمین دلیل این مثال بالا رو واستون زدم.که فکرکنم بد بودش(شاید افتضاح
)
بعضی افراد میخان کل فایل رو کد کنند ، فایل رو میخونن و عمل کد کردن رو انجام میدن و بعد روی حافظه دیکد و اجرا میکنند همون چیزای که برادر جوکر گفت(توضیحات بهتر).ولی بعضی ها فقط میخوان یک سکشن رو کد کنند مثلا .text و ...
خوب حالا شما نیاز به اشنایی با ساختار فایل دارین .
ساختار جدول Section هارو ، IMAGE_SECTION_HEADER میگن که دارای فیلدها و مقادیری واسه توضیحات بیشتری در مورد سکشن است که بدین ترتیبه:
1-Name : شامل نام سکشن که حداکثر طولش 8بایت است
2- VirtualSize : اندازه سکشن در حافظه
3-VirtualAddress : ادرس مجازی نسبی واسه سکشن.اگه مقدار این فید 1000 باشه و فایل توی ادرس 400000 بارگذاری بشه ،سکشن ما در 401000 قرار میگیره
4-SizeOfRawData: اندازه سکشن در فایل
5- PointerToRawData : این مهمه چون محل شروع سکشن در فایل رو مشخص میکنه
6- Characteristics : شامل فلگ های برای خصوصیات سکشن است . بعنوان مثال سکشن فقط خواندنی باشد مثل سکشن ریسورس.حالا اگه بخوای توی محدوده این سکشن کدی رو اجرا کنی برنامت بهم میریزه و بسته میشه. بنابراین باید فلگ هاشو برای اجرای کد هم تنظیم کنی
خوب دیدین که کلی حساب و کتاب داره.
شما شروع سکشن در فایل و بعد اندازه سکشن در فایل ( میشه تعداد بایت های رو که باید بخونین) رو بدست بیارین ، سپس به محل شروع سکشن میرین و تعداد بایت ها مشخص شده رو از اون محل میخونین. کل داده های سکشن رو در اختیار دارین و میتونین کد کنین
در تابع دیکد باید از فیلدهای شماره 2و3 استفاده کنین.چونکه بایدروی حافظه دیکد بشه ،نه توی فایل
(۲۰-مرداد-۱۳۸۹, ۰۴:۵۶:۰۰)Cyrus نوشته است: [ -> ]نقل قول: توابع API رو Encrypt کنی؟اگه واسه توی پکر میخوایی که بحث میره روی بخش های دیگه فایل. ولی توی برنامه نویسی که راه مختلفی داره و میتونی بزنی توی کار داینامیک.
دايناميك؟ اگه يه توضيح كوچولو و مثال ساده هم از اين بذاريد كه عالي ميشه.
وقتی شما از توابع api استفاده میکنید باید در برنامتون اونو فراخوانی کرده تا بتونید ازش استفاده کنید.این کار میشه حالت استاتیک. یک تعریف تابع در vbهستش
کد:
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, ByVal lpDrawTextParams As Any) As Long
ولی در حالت داینامیک شما توسط تابع LoadLibrary فایل dllمورد نظر رو بارگذاری می کنید و سپس با تابع دیگری به نام GetProcAddress ادرس تابعی رو که میخوایین اجرا کنید رو به دست میارین و با ادرس بدست امده تابع رو فراخوانی می کنین
مثال ذیل در vb
کد:
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
این پیوست بهتر کار میکنه که vb