خيلي خوب روال اينطوريه كه شما يه تابع كد كردن بايد بنويسي اين تابع هر رشته اي رو مي گيره و تبديل مي كنه به يه چيز ديگه (با قاعده و قانوني كه شما تعريف مي كنيد و منحصر به فرد)
مثلا شماره سريال هارد رو ميگيره : 2F2 و به شماره 1234-1233-4444-5555 تبديل مي كنه.
بعدش برنامه چك مي كنه در هنگام شروع و اگه رجيستر نبود فرم رجيستريشن بايد نمايش داده بشه. در اين فرم اين كد نمايش داده ميشه و كد از كاربر درخواست ميشه. و دكمه تاييد كه چك مي كنه اگه تبديل كد با يه تابع مثل تابع قبلي و يا اصلا همون با كد ورودي توسط كاربر يكي يا خير. اگه يكي بود رجيستر و الا هيچ.
چند نكته هست كه بهتره رعايت بشه :
وقتي مي خواد كد چك بشه كد دوباره Generate بشه نه اينكه از محتواي تكست باكسي كه قبلا توش كد ريخته شده استفاده بشه. اين يعني اينكه مجدد شماره سريال هارد رو بگيريد با تابع تبديلش كنيد و دوباره تبديل براي مقايسه و در نهايت با كد وارد شده توسط كاربر مقايسه بشه.
نكته خيلي مهم اينه كه در عمليات رجيستر چيزي از متن نوشته شده توسط كاربر براي عمليات رجيستر مورد استفاده قرار بگيره اينو قبلا چند بار گفتم. يه مثال مي زنم روشن بشه :
روش اشتباه :
عمليات ثبت : كد كاربر اگر صحيح بود در رجيستري بنويس 1
عمليات بررسي : اگر در رجيستري 1 بود برنامه فعال است.
روش صحيح :
عمليات ثبت : كد كاربر اگر صحيح بود در رجيستري كد كاربر (و يا تبديل يافته آن را) بنويس
عمليات بررسي : اگر در رجيستري كد نوشته شده با تبديل يافته تبديل يافته شماره سريال هارد برابر بود برنامه فعال است.
يك روش خوب استفاده از خاصيت مقدار دهي در شرطه اينطوري :
کد:
global Checked as boolean
function RealyChecked() as boolean
Checked=1
RealyChecked = True
end function
حالا در برنامه و هنگام چك كردن كد وارد شده توسط كاربر :
کد:
if EnteredCode=CorrectCode and RealyChecked=True then
Register EnteredCode ' as a neccesary parameter
end if
و در مرحله پاياني در هنگام رجيستر شدن توسط تابع Register كه نوشتيد بايد از اين متغير Checked استفاده كنيد و از مقدار يك اون در مراحل توليد كد و ثبت استفاده بشه. طوري كه اگه يك نبود (صفر بودن يعني كرك شدن) برنامه ثبت كنه اما ثبتي اشتباه. اميدوارم متوجه منظورم شده باشيد. مثلا در هنگام ثبت شما به هر كاراكتر ورودي كاربر يه عدد بعلاوه Checked اضافه كنيد و در رجيستري بريزيد حالا اگه Checked صفر باشه بازهم تو رجيستري چيزي ريخته ميشه اما اون چيزي نيست كه باعث فعال شدن برنامه بشه
قدم آخر اينه كه مراحل چك شدن برنامه در تمام كد ها و تمام بخش ها انجام بشه. در لود شدن فرمها دكمه هاي تاييد پروسس پرينت و هر قسمت مهمي كه داريد. به تبع اينكار سرعت نرم افزار رو پايين مياره.
توضيحاتي درمورد آخرين مرحله هست كه بايد خدمتون عرض كنم : از يك كد يكسان براي چك كردن ثبت برنامه استفاده نكنيد چون اگه كركر يكيشون رو پيدا كنه بقيشون رو در عرض چند دقيقه پيدا ميكنه.
كد ها تون رو كد كنيد :
يه روش بسيار مفيد براي افزايش زمان كرك، كد كردن كد هاست!!! براي اينكار لازمه يه تابع بنويسيد كه معكوس خودش باشه. (اگه از رياضيات چيزي يادتون مونده باشه) يه مثال ساده از اين تابع ، تابعيه كه كل كاراكتر هاي رشته ورودي رو از 255 كم مي كنه به اينصورت مثلا كد شده a ميشه 5 و كد شده 5 ميشه a . منظورم از معكوس خودش باشه اين بود.
در واقع شما بايد يه تابع ديگه براي تغيير خود سورس ها بنويسيد. اين كار يعني چي و چه فايده اي داره ؟ بذاريد يه مثال بزنم :
برنامه من موقع ثبت شدن در رجيستري در مسير hklm\Sofware يه چيزي ميريزه حالا اگه كركر برنامه رو برگردونه متوجه آدرس ميشه و مستقيم مي فهمه داريد چه مي كنيد. حالا ما با يه تابع داخلي خود HKLM\Software رو به يه رشته ديگه (قابل برگردوندن) بر مي گرديونم به طور مثال اسم تابع هست ChangeStr و اينطوري كار مي كنه :
کد:
ChangeStr(ChangeStr("Salam"))="Salam"
حالا هر جا از برنامه كه مربوط ميشه به چك كردن صحت رجيستر و جاهاي مختلف ديگه (براي رد گم كني) رشته هاي نوشته شده رو با اين تابع كد كنيد و در ويرايشگر ويژوال بيسيك بنويسيد. به طور مثال
به جاي اينكه بنويسيد :
کد:
if ReadCode="Salam" then ActivateProgram
بنويسيد :
کد:
if ReadCode=ChangeStr("#%E%D") then ActivateProgram
كه هردو دقيقا يه كار انجام ميدند ولي قسمت دوم وقتي به زبان اسمبلي برگرده رديابيش سخت تره.
در جاهاي بيربط و نامربوط عبارت هايي مثل :
کد:
mylocalvar="Program Registered Thanks"
بنويسيد تا كركر وقت بيشتري براي پيدا كردن محل چك شدن رجيستر صرف كنه.
در پايان بايد بگم با تمام اين كار ها باز هم برنامه شما كرك ميشه. اما يه خورده بيشتر زمان ميبره و بايد دعا كنيد كه كركر حوصله نداشته باشه بيشتر از زمان مورد نياز وقت صرف كنه.