برگزیده های پرشین تولز

چگونگي نوشتن قفل با وي بي

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
اقا مي خوام يه بحث شروع كنم در مورد چگونگي قفل گذاشتن رو برنامه ها .
نمي دونم اين رو بايد اينجا بگم و يا مثل يكي از دوستان اين اطلاعات يه فوته. بهر حال من كه نه برنامه نويسم(حرفه اي) و نه قفل گذار پس بي خيالش :lol:
حالا هر كي نظري داره بگه كه ايا بايد اينجا باشه و يا تو قسمت عمومي و ...

اولين پروژه هم در مورد قفل گذاري رو فايل كامپايل شده است .سعي مي كنم همه چيز رو خيلي ساده توضيح بدم (ممكنه اطلاعات من غلط باشه پس بهم بگين ) اما ممكنه سخت بنظر بياد پس پيشنهاد ميكنم اسمبلي رو و چگونگي ساختار فايل اجرايي رو تا حدودي بلد باشين
اين قفل رو با وي بي و اسمبلي مي نويسيم . درسته وي بي در اين زمينه مشكل داره ولي بهر حال كمك مي كنه كه شما!!!! اين ضعفها رو ببندين ودر نتيجه قدرت كاري شما افزايش پيدا كنه.

راستي بگم من عددي نيستم ها :blink:
باميد موفقيت براي شما :lol:
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
ايا شما با برنامه tzcopy كار كرديد يا نه. يه برنامه است براي تغيير iso و سپس قرار دادن يه لودر براي فايل exeكه اگه فايل قفل با سايز مشخص رو سي دي نبود اون فايل اجرايي اجرا نشه و....
اين برنامه رو با وي بي نوشتن چون به runtime dll msvb... نيازمنده.
پرتكتور اين برنامه مياد يه فايل exe درست ميكنه و بعد از فايل شما رو به پسوند .dat ذخيره كرده و.....
ولي اين كار يه باگ داره اونم اينه كه اگه يكي بياد و فايل با پسوند dat رو تغيير پسوند به exe بده فايل اجرا ميشه :(
حالا ما ميخواييم همچين كاري رو يكنيم ولي يه زره پيشرفته تر يعني اگه حتي فايل dat رو به exe تغيير داد اجرا نشه
يعني در كل فايل exe مون رو پچ نيم و يه پچر براش بنويسيم
براي اجرا يه برنامه توسط وي بي فرماني هست به نام shell كه فايل رو اجرا كرده و بعد از اجرا فايل بر اساس تنظيمات ما سكان كشتي رو يا در اختيار فايل ميزاره و يا به برنامه ما .
يه راه حل ديگه استفاده از api ويندوز :
کد:
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
 ويا 
Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long
مثلا 
    ShellExecute Me.hwnd, vbNullString, "mailto:[email protected]", vbNullString, "C:\", SW_SHOWNORMAL
خوب براي اينكه بتونيم اخيتار كامل رو در دست بگيريم بايد ببينيم اين تابع چي كار ميكنه يا اصلا چه جوري يه فايل اجرايي احرا ميشه.
1-اول از همه لودر ويندوز مياد چك ميكنه كه ايا هدر فايل اگزه درست يا نه اگه نه كه يه خطا گزارش ميكنه
2-اگه فايل dll داشت ( كه اگه تحت ويندوز باشه صد در صد داره) ميبينه كه چه dll رو بايد استفاده كنه كه اين اطلاعات هم باز توي هدر فايل اگزه است .
3-بعد از اون تمامي توابع api رو بر اساس نوع فايل اگزه مشخص و ادرس دهي ميكنه
4-بعد مياد تمامي سكشنها رو براساس اين هدر توي حافظه لود ميكنه( وتمامي ريسورسها رو )
5-سكشن اجرايي رو براساس خصوصيات اون سكشن با خاصيت WRC لود كرده و تمامي كالها به api رو مقدار دهي ميكنه
6-بعد از اون تمامي Call هاي برنامه رو اگه ديناميك بود متغيير دهي كرده و كد رو اماده اجرا ميكنه
8-EPO رو براساس هدر معين كرده وسپس مياد نوع اجرا رو معين كرده
9-حالا با ست كردن ريجستر ,esp,ebx,eds,EPI اختيار برنامه اجرايي رو بدستش ميده
اين EPO =Entry point يا نقطه شروع كد.كه ما باهاش كار داريم( ممكنه يه لودر كار هاي ديگه اي هم بكنه ولي تا اونجا كه يادم بود سعي كردم همه چيز رو بنويسم و ممكنه توي ترتيب مراحل وسطي اشتباه كرده باشم ولي مهم فهم چگونگي اجراست ولي مرحه 9 هميشه اخر همه هست)

بر اساس اين اطلاعات ميشه ديد كه اگه به لودر بگيم (دستور بديم) مرحله 9 رو اجرا نكن چي ميشه هيچي فايل اجرايي ما اجرا نيمشه و به حالت معلق در مياد (suspended ) و ما حالا مي تونيم چك كنيم و ....

ادامه دارد :wacko:
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
حالا فرض كنيم كه اين اتفاق افتاد يعني اينكه برنامه معلق شد .چيكار بايد بكنيم
فرض كنيم كه نقطه شروع برنامه ما در حافظه 401000 باشه ودر افست ( بيت ) 0x445B كد برنامه ( به هگزه ) و شامل اطلاعات
کد:
E9XXXXXXXX
كه يعني به نقطه اي از حافظه بپر .
خوب ما اين كد رو با يه برنامه ( يك هگزه اديتور و يا برنامه اي كه مي شه نوشت ) به مقادير
کد:
EBFE9090C0
تغيير ميديم
خوب EB يعني پرش از نوع نزديك حداكثر مقدار پرش 128 تا جلو يا 127 تا عقب
عدد بعدي يعني : مقداربايتي كه بايد بپره (از بايت بعدي ) رو معين مي كنه در اين حالت خاص چون عدد ما بيشتر از 128 پس پرش ما منفي شده يعني برگشت به عقب كه اينطوري حساب ميشه:
مقدار كنوني(0) منهاي مقداري كه بايد بپره يعني 2 تا عقب ( برگرده به اول دستور خودش) ميشه FE ( هر پرش نزديك دو بايت ميگيره يكي دستور EB و مقدار پرش )
بعد 90 كه يعني nop يعني هيچ كاري نكن و بگذر ( no oprate)
بعدش دوباره 90
و بعدش C0 يعني Ret خروج از برنامه ( چون هيچ الوكيت نشده پس احتياج به استفاده كردن از تابع Exitprocess و از اين دست توابع نداريم )
خوب اگه كسي اين برنامه رو كه ما تغيير داديم اجرا كنه چي ميشه :
هيچي يا ويندوزش هنگ ميكونه ( خيلي خيلي كند ميشه ) و برنامه تو حافظه ميمونه ( رجيستر ميشه ) و بايد يه جوري از حافظه اونرو پاك كنه
و يا اينكه از برنامه خارج ميشه ( يعني به طريقي به كد C0 ميرسه ).
نكته براي اطمينان بيشتر ميشه كدهاي بيشتري رو برداشت يعني منظورم از ابتدا كد هاست كه درون برنامه قرار داره ( برنامه اي كه مي خوايم روش قفل بگذاريم ) و در نتيجه يه ذره كار ها بيشتر ميشه و ميشه حفاظت رو بيشتر كرد .( بعدا بيشتر توضيح مي دم :rolleyes: )

حالا ما بايد به عنوان برنامه نويس يه لودربراي اين برنامه تحت ويندوز بسازيم و بعد از لود كامل فايل اجراي اون رو تغيير بديم و به كد اصلي برگردونيم تا برنامه درست عمل كنه ;) مثل يه پكر
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
هيچكس نظري نداره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :blink: :blink: :blink: :blink: :blink:
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
انگار كسي ايده نداره . خوب براي اينكه كه كاري كه شروع شده رو تموم كنم اين قسمت و فكر كنم اخرين قسمت ) در اين بحث)رو ميزارم .
خوب براي مثال ما يه برنامه واقعي مثل Notepad.exe رو قفل مي كنيم .( ورژن اين برنامه 5.1.2600.2180 متعلق به ويندوز xp)
براي اين كار فايل notepad.exe رو توي به فولدر مثل work كپي ميكنيم حالا با يه برنامه كه اطلاعات هدر فايل exe رو نشون ميده برنامه notepad رو مورد بررسي قرار ميديم ( مثل برنامه ProcDump32 توي قسمت PE Editor)
*نكته تمامي عددها در مبناي hex مي باشد
Entry Point : 739d
Size of image:14000
Image Base: 01000000​
يعني EP ما در حافظه برابر است با
EP=01000000+739d=0100739d​
و در قسمت سكشنها داريم:
کد:
.text 
Virtual Size:00007748 مقدار فضايي كه اين سكشن در حافظه ميگيره
Virtual Offset:00001000 ( Image base محل شروع در حافظه(بعلاوه 
RAW Size:00007748 مقدار فضايي كه اين سكشن در روي هارد ميگيره
Raw Offset:00000600 محل شروع در روي هارد  
Characteristics:60000020 خصوصيت اين سكشن مثل خواندن و توشتني و ....
.data
Virtual Size:00001BA8 مقدار فضايي كه اين سكشن در حافظه ميگيره
....
.rsrc
Virtual Size:00008958 مقدار فضايي كه اين سكشن در حافظه ميگيره
....
همانطور كه ديده ميشه EP برنامه ما درون سكشن .text پس محل شروع برنامه بروي هارد ميشه:
REP:739d-1000+600=699d​
حالا با يه برنامه هگزه اديتور اگه به اين محل پرش كنيم :
6A706898180001​
كه يعني :
6A70 push 00000070
6898180001 push 01001898​
حالا ما خط اول رو با اين كد عوض مي كنيم ( موقعيت 699d از اول فايل )
EBFE كه قبلا توضيح دادم يعني چي​
و برنامه رو به اسم test.lck ذخيره مي كنيم . حالا اگه فايل رو اجرا بكنيم مي بينيم كه فايل اجرا نميشه ( براي اجرا اون بايد با پسوند Exe ذخيرش كنيم (
. حالا بايد برنامه اي با وي بي بنويسيم كه بياد و اين كد رو يعيني EBFE رو با 6A70 عوض كنه . برنامه Microsoft Visual Basic رو ران كرده و يه پروژه جديد از نوع STANDARD EXE مي سازيم و بعد فرم پيش فرض وي بي رو حذف كرده و يك Module به برنامه اضافه مي كنيم . براي اينكه برنامه مون اجرا بشه احتياج به
Public Sub Main()
End Sub​
ست كردن اين نوع برنامه ها رو همه بلدن:D
توي قسمت توضيحات اين كدها رو اضافه مي كنيم:
کد:
Option Explicit

Dim lngProcess As Long
Dim lngThread As Long
Dim lngProcessID As Long
Dim lngThreadID As Long
Dim lngReply As Long

Public Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Byte
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
End Type

Public Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type

Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess _
    As Long, ByVal uExitCode As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As _
    Long) As Long

Public Declare Function WaitForSingleObject Lib "kernel32" _
    (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Public Declare Function CreateProcess Lib "kernel32" Alias _
    "CreateProcessA" (ByVal lpApplicationName As String, ByVal _
    lpCommandLine As String, lpProcessAttributes As Any, _
    lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal _
    dwCreationFlags As Any, lpEnvironment As Any, ByVal _
    lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long
 
Public Declare Function GetWindowThreadProcessId& Lib "user32" _
    (ByVal hWnd As Long, lpdwProcessID As Long)
    
Public Declare Function ResumeThread Lib "kernel32" _
    (ByVal hThread As Long) As Long
    
Public Declare Function WriteProcessMemory Lib "kernel32" _
    (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, _
    ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    
Public Const GW_HWNDNEXT = 2
Public Const WM_QUIT = &H12
Public Const WM_CLOSE = &H10

Public Const SYNCHRONIZE = &H100000
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const CREATE_SUSPENDED = &H4&

Public pInfo As PROCESS_INFORMATION
Public sInfo As STARTUPINFO
Public sNull As String

و بعد توي سابروتين main اين كدها رو اضافه مي كنيم

کد:
Public Sub Main()
    Dim txtStart As String, pHandle As Long, BufferTXT As String

[RIGHT]' اسم برنامه ما كه مي خواييم با تابع زير اون رو اجرا كنيم[/RIGHT]
    txtStart = "test.lck"

[RIGHT]' چك كردن وجود فايل در زير شاخه اجرا برنامه [/RIGHT] 
    If Dir(txtStart) = "" Then
        MsgBox "Failed to Start "
        End
    End If

[RIGHT]'مقدار دهي متغييري كه مشخصات برنامه ما رو مثل دستگيره برنامه  رو نگه ميداره[/RIGHT]
    sInfo.cb = Len(sInfo)

[RIGHT]' اجرا برنامه بوسيله تابع CreateProcess با خاصيت Suspended كه باعث ميشه برنامه بصورت معلق اجرا بشه  و هنگامي كه لودر به EP رسيد برنامه 
' متوقف بشه و منتظر فرمانResumeThread بشه كه برنامه اجرا بشه در اين صورت ميشه هر موقعه بخواييم برنامه رو متوقف و يا ادامه دهيم[/RIGHT] 
    lngReply = CreateProcess(sNull, txtStart, ByVal 0&, ByVal 0&, 1&, _
        CREATE_SUSPENDED, ByVal 0&, sNull, sInfo, pInfo)

[RIGHT]' چك ميكنه ايا برنامه اجرا شد يا نه ؟[/RIGHT]
    If lngReply = 0 Then
        MsgBox "Unable to start "
        End
    End If
[RIGHT] 'ذخيره اطلاعات اوليه برنامه براي استفاده هاي بعدي[/RIGHT]
    lngProcessID = pInfo.dwProcessId
    lngThreadID = pInfo.dwThreadId
    lngProcess = pInfo.hProcess
    lngThread = pInfo.hThread
    
[RIGHT]'6A70 مقدار دهي بافري كه بايد نوشته بشه يعني مقدار   [/RIGHT]   
    BufferTXT = Chr(&H6A) & Chr(&H70)

[RIGHT]' نوشتن در حافظه برنامه ( ِD100739 ) توسط تابع  WriteProcessMemory[/RIGHT]
    lngReply = WriteProcessMemory(lngProcess, &H100739D, BufferTXT, Len(BufferTXT), 0&)

[RIGHT]' چك كردن اينكه نوشتن با موفقيت  انجام شده يا نه و گرنه به تابع اتمام برنامه برو[/RIGHT]
    If lngReply = 0 Then
        MsgBox "Failed to change. " 
        GoTo End_Process
    End If

[RIGHT]' ادامه دادن برنامه ( تمامي تغييرات اعمال شده و مثل فايل اوليه شده اما در حافظه )[/RIGHT]
    lngReply = ResumeThread(lngThread)
  
[RIGHT] ' چك كردن ادامه برنامه و در صورت عدم ادامه برنامه پرش به قسمت اتمام برنامه[/RIGHT]
    If lngReply = 0 Then
        MsgBox "Failed to Resume " 
        GoTo End_Process
    End If

[RIGHT]' بستن هندلهاي استفاده شده[/RIGHT]
    lngReply = CloseHandle(lngThread)
    lngReply = CloseHandle(lngProcess)

[RIGHT]' خروج از برنامه[/RIGHT]
    End
    
End_Process:

[RIGHT]' اتمام برنامه[/RIGHT]
    lngReply = TerminateProcess(lngProcess, 0&)

[RIGHT]' بستن هندلهاي استفاده شده[/RIGHT]
    lngReply = CloseHandle(lngThread)
    lngReply = CloseHandle(lngProcess)

[RIGHT]' خروج از برنامه[/RIGHT]
    End

End Sub
اميدوارم توضيحات كافي باشه و بتونه به شما كمك كنه :D
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
حالا مي خوايم يه تغييرات بديم توي فايل exe تا اونو نشه براحتي شناخت كه با وي بي نوشته شده. اول بايد فايل اجرايي رو طوري تغيير بديم كه نشانه هاي وي بي حذف بشه . اولين مشكل msvb ران تايم dll .خوب همه ميدونن كه براي اجراي فايل اي كه با وي بي نوشته شده احتياج به اين dll هستش .
خوب ابتدا ما برنامه اجرايي رو با يك هگزا اديتور بازش مي كنيم و بعد دنبال msvbvm60.dll ( براي وي بي 6) مي گرديم و اونرو به testtest.tst تغيير مي ديم و برنامه رو ذخيره كرده و بعد اجرا مي كنيم . سيستم ارور ميده كه اين فايل رو پيدا نكرده. testtest.tst .
براي اينكه فايل اجرا بشه از msvbvm60.dll يه نسخه توي جاي كه فايل اجراي هست كپي كرده و بعد اون رو به نام testtest.tst تغيير نام مي ديم و حالا برنامه رو اجرا مي كنيم. بينگو اجرا شد.
با اين ترفند ميشه همه توايع موجود توي فايل رو كه با vba شروع ميشن رو تغيير نام داد . ( بايد هر اسمي كه براي اون تابع مشخص ميكنيم توي فايل اجرايي توي فايل testtest.tst هم همون اسم رو براش بذاريم)
بعضي از توابع هم با rtc شروع ميشن
مثلا rtcMidBstr كه همون تابع mid است. خوب با يك مثال فكر كنم قضيه روشن تر بشه:
همون rtcMidBstr رو دنظر بگيريم اگه اين تابع رو به توي فايل اجرايي به ord0000001 تغيير نام بديم بايد توي فايل testtest.tst هم به همين نام تغييرش بديم .لذا هنگامي كه فايل اجرايي لود ميشه لودر توي هدر فايل testtest.tst دنبال محل شروع ord0000001 ميگرده و اگه ما توي اين فايل اين rtcMidBstr عوض نكرده باشيم به ما صفحه خطا رو نشون ميده.
حالا بر اساس اين توضيحات ميشه يه فايل نوشت كه دقيقا اين كار رو بكنه و بعد فايل testtest.tst رو با يك برنامه exepacker پك كرد و درنتيجه كركر ها گمراه ميشن . چون يكي از كارهاي كه كركر ها ميكنن قرار دادن بريك پوينت روي تابع مقايسه است ( بطور مثال براي مقايسه دو عبارت رشته اي وي بي معمولا از تابع vbaStrTextCmp __ استفاده ميكنه) حالا اگه كركر سر فصل فايل msvbvm60.dll رو توي ديباگرش لود كنه چون برنامه ما از فايل اصلي msvbvm60.dll استفاده نميكنه نمي تونه رو اين تابع به راحتي بريك پوينت قرار بده و....
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
مثل اينكه دوستمونsaeedsmk تجربه خوبي داره .

saeedsmk جان شفاف و خلاصه جواب اين مساله رو تشريح كن :

صورت مساله : تصميم داريم نرم افزاري توليد كنيم كه يك جا بيشتر نصب نشه . ( با اين فرض كه نصب نرم افزار به عهده خريدار مي باشد ) . يعني اگر يكي از ما سي دي نرم افزار بخصوصي رو خريد نتونه به رفيق رفقاش هديه بده . دقت كن كه هدف تكثير نشدن مثلا سي دي نيست . هدف اينه كه فقط روي يه كامپيوتر نصب بشه .

قبلا راجع به شماره منحصر به فرد براي هر سيستم صحبت شده . فكر مي كنم شما توي تشريح قفل گذاري با روش خودتون بيشتر به روشهاي جلوگيري از كرك شدن اشاره كرديد .

saeedsmk جان منتظرم
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
به نقل از Piter1356 :
صورت مساله : تصميم داريم نرم افزاري توليد كنيم كه يك جا بيشتر نصب نشه . ( با اين فرض كه نصب نرم افزار به عهده خريدار مي باشد ) . يعني اگر يكي از ما سي دي نرم افزار بخصوصي رو خريد نتونه به رفيق رفقاش هديه بده . دقت كن كه هدف تكثير نشدن مثلا سي دي نيست . هدف اينه كه فقط روي يه كامپيوتر نصب بشه .

saeedsmk جان منتظرم

ببين توي برنامه حالا به هر زبوني كه نوشته بشه فرق نمكنه براي قفل گذاري بايد اصول قفل گذاري رعايت بشه
اما جواب سئوال بر اساس اطلاعاتي كه من دارم قفل رو ميشه به چند طريق اعمال كرد:
1- قفل نرم افزاري
2- قفل سخت افزاري
وقتي قفل قفل نرم افزاري بايد ديد كه نحوه عمل كرد اون قفل چيه مثلا همين قفل سيدي ويندوز هميشه ثابته يعني مياد كي رو توي يه لوپ قرار ميده وبعد اگه نتيجه درست بود ادامه ميده ونه ..... كه در مورد سئوال شما جواب كامل نيست اما ميشه با تغيراتي اون رو كامل كرد . برنامه اول مياد اطلاعاتي كه ثابت هستند و تا زمان تغيير سخت افزار تغيير نيمكنن رو بدست مياره مثل سريال هارد. سريال سي پي يو سريال كارت گرافيك( زياد كاربردي نيست) سريال lan card و ... رو بدست آورده و بعد اونها رو توي يك تابع قرار ميده و بعد بر اساس كد سيدي ( كه ثابته) مياد و يك سريال رو جنريت كرده و يا با تلفن ويا اينترنت اونرو به شما داده وشما بر اساس يك تابع ديگر كد نصب رو در اختيار اون شخص و يا كاربر گذاشته و....( حتي ميشه با تغييراتي كاري كرد كه هر بار به اينترنت وصل ميشه اين كد رو چك كنه)

توي روش دوم
بجاي سخت افزار متدوال از سخت افزار متصل استفاده ميشه و قضيه تماما مثل بالاست مثل تمامي دانگلها و ...

روش سوم هم تلفيقي از دو روشه بالا است

اما تمام اينها توي فايل اجراي و يا كامپونتهاي مصرفي برنامه است و اگر يه كسي ( بر اساس ارزش برنامه ) بياد و برنامه رو كرك كنه ( و در صورت درست بسته نشدن استراكچر برنامه خيلي كار راحت تر ميشه) تمامي اين تلاشها ها از بين ميره و برنامه خيلي راحت با قيمت پايين در اختيار هر كسي قرار ميگيره.

پس بايد كاري كرد كه برنامه به راحتي كرك نشه .حالا ميشه از قفلهاي ديگه هم در كنار قفل هاي ذكر شده استفاده كرد.

تماي شركت هاي سازنده و يا برنامه نويسها براي هر برنامه كار بردي معمولا يه محدوده زماني رو پيش بيني مي كنن كه توي اون محدوده زماني برنامه كرك نشه ( يعني هر برنامه اي كرك ميشه ) و با فروش برنامه توي اون بازه شركت سازنده هم اصل سرمايه گذاري و هم سود پيش بيني شده رو بدست بياره .

مشكل اينجاست كه توي كشور هاي ديگه قانون كپي رايت خيلي به برنامه نويسان و شركت هاي سازنده برنامه كمك مي كنه ولي توي ايران اين قانون وجود عملي نداره .

اميدوارم توضيحات كامل باشه و بتونه كمك كنه
نكته:::
بيشتر توي اين مبحث توي همه دنيا سعي ميشه ايده داده بشه نه خود برنامه محافظت كننده چون هر كس روشي براي برنامه نويسي داره كه خودش باعث سختي كار كركر ميشه منم سعي ميكنم از همين روش استفاده كنم نميدونم تونستم درست برنامه ريزي كنم و مبحث رو درست ادامه بدم يا نه به هر حال هر كسي منابع اطلاعات كمي
داره و اگه كسي در مورد مطلبي ميدونه دليل نيست كه اون استاد و يا حرفه اي باشه ممكنه دوستان بيشتر بلد باشن و اگه كمك كنن من يكي كه خيلي ازشون ممنون ميشم . :cool:
 

darklord

Registered User
تاریخ عضویت
23 آپریل 2005
نوشته‌ها
1,085
لایک‌ها
1
محل سکونت
System32
سعید جان این آخری رو خیلی قشنگ نوشتی (مثل بقیش) . آره پیتر جان نمیشه کاری کرد که برنامه غیر قابل نفوذ بشه ولی میشه کاری کرد که یه کم کار کرکر سخت تر بشه. مطمئن ترین راه چک کردن آنلاین برنامه و سریال برنامه است ولی اینکار منطقی نیست چون ممکنه من به عنوان یه کاربر به اینترنت دسترسی نداشته باشم و بخوام از برنامت استفاده کنم ! میبینی نمیشه کاربر رو مجبور کرد که هر وقت خواست با برنامه کار کنه به اینترنت وصل بشه.

با این حال اگه این کار رو هم انجام بدی مشکل اصلی به قوت خودش باقیه. با این ارتباط (به اینترنت) از دست keygen ها راحت میشی ولی crack ای که برای برنامت نوشته میشه میاد و کلا وصل شدن به اینترنت رو از برنامت حذف میکنه و با تغییر چند دستور به برنامه میگه که "الان وصل شدیم و اطلاعات صحیح است" به همین قشنگی سریال برنامه شد : پشم!

بعضی نرم افزارهای پا رو فراتر می ذارن :
1- وارد کردن اطلاعات کد شده به رجیستری
2- ذخیره اطلاعات در چند فایل در قلب سیستم عامل
3- جایگزینی چند تابع بتا با توابع اصلی در dll ها پس از دریافت سریال (اگر برنامه کرک شود این قسمت ناخودآگاه حذف خواهد شد و برنامه دیگر کار نخواهد کرد)
4- دستکاری فایل اصلی اجرایی برنامه توسط یک برنامه اجرایی کوچک پس از تایید سریال
5- ارتباط با اینترنت و چک کردن سریال
6- قرار دادن قفل سخت افزاری و نرم افزاری برای جلوگیری از کپی شدن اطلاعات
7- استفاده از فلاپی و سی دی به طور هم زمان
8- و در انتها تغییر متداوم سریال نامبر با هر بار اتصال به اینترنت (اطلاعات سیستم شما نیز فرستاده میشود نوعی نرم افزار جاسوس در برنامه اصلی جاگذاری می شود )

با این وجود نرم افزاری که تمامی 8 مورد بالا را نیز به کار ببندد قابل کرک کردن است چرا؟ چون تمامی کدهایی که این کار را میکنند پس از نصب بر روی سیستم شما هستند و شما می توانید آنها را آنگونه که می خواهید تغییر دهید.

تنها مورد قابل استفاده مورد شماره 8 است البته قانونی نیست ولی با این وجود تنها قسمتی است که اطمینان لازم را میتواند فراهم کند :

قطعه کدی را که در واقع یک spyware است را در برنامه استتار می کنیم . هر چند وقت یکبار به عنوان live Update تقاضای برقراری ارتباط با اینترنت را میکنیم پس از برقراری ارتباط توسط توابع checksum گیری از سورس کد میکنیم و به همراه مشخصات سیستم به سایت مربوطه ارسال میکنیم. اگر checksum برنامه با checksum مورد نظر در سایت یکی نبود برنامه با اجرای بعدی قسمتی از خود را نابود می کند.

این روش نسبتا مطمئن است البته بهید مخفیانه باشد و کاربر متوجه آن نشود. مثلا با آغاز برنامه سریال نامبر را بخواهیم یعنی تمتمی قفلهای ممکن را بگذاریم و در کنار آنها این سیستم جاسوسی نیز فعالیت کند . با این روش و کمی شانس کرکر قطعه کر جاسوسی را جزئی از برنامه ی اصلی خواهد دید و به آن دست نخواهد زد.

بازم میگم این روق به هیچ عنوان قانونی نیست ازش استفاده نکنید ;)
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
از darklord جان خيلي خيلي ممنونم كه به كمك ما اومد :D بنظرم من كه توضيحات كاملي بودن

بيشتر روشهاي ابداعي در واقعه از يك واقعيت كمك ميگيرن توانايي بدست اوردن اطلاعات و بعد تغيير تكه هاي از سيستم -برنامه و يا كامپنت هاي برنامه . اما چه چيزي باعث ميشه كه يه برنامه به راحتي كرك بشه ؟. نحوه گرفتن اطلاعات .
بزارين يك مثال بزنم تا مشخص تر بشه: برنامه اي بصورت دمو اجرا ميشه و هر دفعه بعد از اجرا مياد و صفحه پيغامي نشون ميده كه 20 روز هنوز مونده و يا 10 بار استفاده
براي نوشتن اين نوع از قفلها كه به قفلهاي زماني يا دفعه اي معروف هستند معمولا از توابع اي استفاده ميكنن كه ميشه اونها را به توابع زير تقسيم بندي كرد
1- توابع گرفتن زمان مثل date توي vb
2- توابع بدست اوردن زمان اجرا برنامه
3- توابع گرفتن تاريخ يك فايل
4- توابع بدست اوردن اخرين تغيير فايل
كه همگي تابلو هستند .اما ايا ميشه به روشي برنامه رو نوشت كه با اين توابع تابلو هم داراي ساختار مناسبي ياشن ؟
بله ميشه

حالا اگه اين گرفتن اطلاعات سخت تر بشه ايا بازم به راحتي كرك ميشه ؟

بله . اگه قسمت تغيير اطلاعات بد نوشته شده باشه

مثلا بعضي از برنامه ها براي اينكه سخت تر بشه اون ها رو كرك بكنن كد قسمت قفل رو در حالت اجرا تغيير ميدن
و.......
اگه وقت كنم و اين پروژه دفاع از پايان نامه بزاره يك نمونه اش رو اينجا ميزارم

:D
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
يه فايل قفل نوشتم كه از همين روش استفاده مي كنه بعدا كدش رو ميزارم فايل اصلي اينه :
و كدش 235154027412062812064
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
خوب نحوه چگونگي قفل رو اينجا توضيح دادم
از اينجا هم مي تونين بخونين
http://forum.persiantools.com/showpost.php?p=400786&postcount=126


اما سورش هم اتچ كردم

البته ببخشيد كه خوب برنامه نويسي نشده اخه من برنامه نويس خوبي نيستم( چند تا برنامه ديگه هم داره كه كار خاصي نميكنن مثل چسباندن فايل اصلي به اجرا كننده با ديكد كردن اون )
لازم بگم كد crc چكر نداره !!!

فعلا :)

فايل سورس : اينجا است
 

soda

کاربر تازه وارد
تاریخ عضویت
21 آپریل 2005
نوشته‌ها
5
لایک‌ها
1
سلام saeedsmk عزيز
خياي خوب بود
استفاده كرديم
در ضمن فكر نكنم به اون راحتي ( يعني تغيير msvbvm به يه فايل كذايي ) بتوني كركر رو از فهميدن اينكه با وي بي نوشته شده دور كني
ميشه بيشتر توضيح بدي ؟
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
اره میشه سودا جان
چرا نمیشه چه توضیحی بگو تا کاملش کنم
ببین شما میتونید فایل مورد نظرتون رو که msvb باشه رو بصورت پک کنید و تمام توابعش و که اکسپورت میشه رو تغییر نام بدی همچنین اسمشو و بعد هم توی فایل اگزه تم همین کار رو بکنی و در ضمن فایل رو پیکد ببندی و هم ایمنکه بعد فایلت رو هم پک کنی و ...
این سری فایلها جلوی خیلی از مشکلات رو میگیره
ولی مشکلاتی رو هم اضافه میکنه ....
 

redjoker

کاربر تازه وارد
تاریخ عضویت
21 فوریه 2006
نوشته‌ها
91
لایک‌ها
0
محل سکونت
نصف جهان
جالب کار کردی ... اگه با دلفی مینوشتی منم پایه بودم ولی VB هیچی نبفهمم ;)
 

فایل های ضمیمه

  • serial.zip
    8.6 KB · نمایش ها: 81
  • crk.zip
    8.6 KB · نمایش ها: 76
  • serial_coded.zip
    11.7 KB · نمایش ها: 76

techmix

Registered User
تاریخ عضویت
12 آگوست 2004
نوشته‌ها
75
لایک‌ها
0
سن
35
محل سکونت
Tehran
آخ جون ! آخ جون ! من اصلا ميام pt واسه همين بحثا ، برم بخونم ...
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام تک مکس جان ( خواستم اسمت رو بگم گفتم شاید ناراحت بشی) بابا تو که خودت این کاره ای . چی کار داری با قفل مردم، میخوای بشکنیش .
شوخی کردم سال نو ات هم مبارک .
راستی یه نگاهی هم به pm ات بنداز.
راستی اقای " جوکر قرمز " این فایل ها رو چی کار باید بکنیم . از چه روشی استفاده میکنه یه توضیح بدی یک ادم کم سوادی مثل من هم میتونه بفهمه اینها چی هستند
سال نو شما هم مبارک
 

redjoker

کاربر تازه وارد
تاریخ عضویت
21 فوریه 2006
نوشته‌ها
91
لایک‌ها
0
محل سکونت
نصف جهان
به نقل از saeedsmk :
راستی اقای " جوکر قرمز " این فایل ها رو چی کار باید بکنیم . از چه روشی استفاده میکنه یه توضیح بدی یک ادم کم سوادی مثل من هم میتونه بفهمه اینها چی هستند
سال نو شما هم مبارک

ای بابا سرکارم گذاشتی :)
فایل اصلی که بعد از اکستراکت شدن با پسوند .dat بود یا همون exe اصلی که تریس کردم و شرطهای چک قفل و.... ( فکر کنم 3تا بود ) را تغییر دادم .


عید شما هم مبارک :)
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
کارت عالی بود اما یک مشکل داشت میدونی چی شما تابع اصلی برنامه رو از کار انداختین در نتیجه نوشتها به نمایش در نمیاید!
یعینی هنوز یک قسمت مونده
 
بالا