گروه ویژه
گیفت کارت آیتونز و گوگل پلی

صفحه 1 از 3 123 آخرینآخرین
نمایش نتایج: از 1 به 10 از 25
  1. #1
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    *** آموزش نحوه کرک برنامه های سیمبیان ***

    سلام دوستان قبل از هر چیزی این مطلب رو بیان کنم که تمامی این مطالب برگرفته از انجمن های آریا میباشد

    ================================================

    یه تایپیک رو از امروز شروع کرده ام که خیلی اولش اسون به نظر می رسه ولی الان که دارم آماده اش می کنم می بینم کار سختیه خداییش چون برای اولین باره که تو یه انجمن ایرانی این کار قراره بطور کامل انجام بشه و شاید در داخل ایران فعلا تو کار کرک برنامه های موبایل به اون صورت نشدن وتجربه ها در این زمینه پایینه فعلا.به هر حال امیدوارم بتونم یه کم این راه رو براتون آسونتر بکنم و ار همه دوستان هم می خوام که اگه بلدن چیزی من کمک بکنن.به امید روزی که بهترین کرکهای ایرانی برنامه های موبایل از این سایت باشه.
    .با توجه به اینکه یه کم وقتم کمه و می خوام مطالب خوب باشن یه کم صبر داشته باشید و بزارید سر حوصله و نه عجله ای مطالب رو براتون بزارم.
    سعی می کنم این مطالب مختصر باشن تا شما سردر گم نشید.من یک سیمیبیان کرکر نیستم
    توجه کنید که شما با خوندن این مطالب یک سیمیبیان کرکر نمیشید .فقط این مطالب کمک می کنه تا استارت توبزنید بقیه راه به خودتون(دانش برنامه نویسی و پشتکارتون) بستگی داره.........


    تعریف کرک
    پروسه ای است که کرکر با استفاده از مهندسی معکوس فایل های اجرایی (در مورد برنامه های سیمیبیان
    فایل های با پسوند APP)را معکوس می کنه و این فایل ها را برای دستیابی به اهداف شیطانی اش دستکاری می کند .
    تعریف مهندسی معکوس
    در این موردی که ما بحث می کنیم مهندسی معکوس یعنی تبدیل فایل های APP یا هر فایل اجرایی دیگر به زبان اسمبلی برای دستیابی به اهداف زیر:


    1.فهم این فایل و برگرداندن آن به HHL(high level language -برنامه های سطح بالا مثل C++)
    2.اصلا ح این فایل در سطح اسمبلی (این اصلاح بسته یه کار شما داره.اگه نویسنده برنامه هستید برای
    برطرف کردن باگ ها و اگر شما کرکر هستیدبرای کرک کردن برنامه این کار رو انجام می دهید)
    یه کم مقدمه

    بعضی از کرکر ها یک راه بسیار ساده برای کرک فایل هایی که نیلز به ریجیستر شدن برای اجرا دارند استفاده می کنند که روش نووپینگ(NOOPing) نام دارد


    نوپینگ(NOOPHNG-NO OPretion)
    یک دستور العمل(instruction) به معنای انجام ندادن هیچ کاری می باشد که شما از آن برای جایگزینی بعضی از دستورالعمل ها (به زبان خلاصه برای جایگزینی دستور العملی که شما را به سمت بلوکی از کدها که به شما می گوید :
    )استفاده خواهد کرد(زیاد عجله نکنید به مرور همه چیز براتون جا می افته).

    برای فهم بیشتر من از یک مثال ساده(البته نه در زبان اسمبلی) برای فهم بیشتر این روش استفاده می کنم:
    compare good_registration_number with input_registration_number


    jump to nasty_block_of_code if they are not equal----
    display you are great for buying this ugly software,,,,|
    .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
    .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
    .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
    exit program,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,|
    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
    ------------------------------------------------------------------|
    |
    |--nasty_block_of_code:
    display YOU HAVE ENTERED A NASTY REGISTRATION NUMBER
    display you are nasty boy do not do it again


    (من از علامت های ویرگول برای نشان دادن کدهایی که برای کرک مهم نیستن استفاده کرده ام)


    حالا اون کاری که در ادامه باید انجام بدید:
    compare good_registration_number with input_registration_number


    NOOP (nothing remember???)
    display you are great for buying this ugly software
    .
    .
    .
    exit program


    nasty_block_of_code:
    display YOU HAVE ENTERED A NASTY REGISTRATION NUMBER
    display you are nasty boy do not do it again


    خب به هر با این کار شما همیشه باید برید نرم افزار اصل و بخرید چون هیچ وقت به کد اصلی نمی رسید!!!!!!!!!
    روش های دیگه ای هم هست که اگه می خواید بازم بزارمتون سر کار بگم؟؟؟؟؟؟؟؟؟؟؟؟
    بله ...امبدوارم فهمیده باشید که کرک همچین هم کار ساده ای نیست و حسابی باید وقت و انرژی بزارید.

    خب حالا بگذریم
    وقتی می گم دستورالعمل منظورم یک خط از کدهای اسمبلی هستش (در HHL بهش statement می گن).
    مهندسی معکوس یک ماشین وابسته است یعنی خودش وابسته به ماشین شما است(مخصوصا سی پی یو وسیله اتون)
    برای بسیاری از وسایل شما اونها رو به دستورالعمل های سری اینتل تبدیل می کنید(تبدیل از زبان ماشین به زبان اسمبلی)ولی در مورد فایل های APP سیمیبیان اونهارو به دستورالعمل های سری ARM تبدیل می کنید.شما شباهت های بسیار زیادی در مورد این دو سری( یعنی اینتل و ARM) خواهید دید به خاطر اینکه اسمبلی به طور کلی با سخت افزار وسیله در ارتباط است.
    برای تغییر دادن BAD Line در کدها یی که شما نمی خاهیدشان باید یک hex Editor داشته باشید.شما اول باید فایل رومجزا بکنید و سپس آدرسی رو که می خواهید تغییر بدهید پیدا بکنید و سپس ان را hex editor وارد کنید و تغییرات لازم را در آن بدهید.وقتی شما فایل های PC را کرک می کنید( کامپیوترتان نه موبایل تون) شما باید ازکارهای ضد کرکی روتینی که توسط سازنده در فایل بکار گرفته می شود اطلاع کافی داشته باشید.
    کارهای محافظتی روتین بلوکی از کدها هستن که توسط سازنده برای جلوگیری از کرک برنامه شان توسط کرکرها نوشته می شود ودر برنامه قرار می گیرد.در کرک برنامه های موبایل شما روتین های محافظتی کمتری را برای مبارزه دارید چون سازندگان باید حا فظه و محدودیت ذخیره را باید در نظر بگیرند.

    الزامات

    خب حالا من قصد دارم اون چیزهایی رو که برای شروع کرک کردن نیاز دارید بهتون بگم.اگه این الزامات رو ندارید فعلا بی خیال شید برید این ها رو یاد بگیرید بعد ادامه بدید:
    1.یه کم زبان برنامه نویسی سطح بالا مثل C++ رو یاد بگیرید بخصوص دستورات مربوط بهLOOPS وJUMPS
    2.کار بعدی اینه که بدونید کامپیوترتون چطوری کار می کنه(CPUو و حافظه)
    3.خب حالا باید در مورد نحوه ریجستر کردن یه سری چیزها رو یاد بگیرید(در مورد ریجستر کردن من چیزی فعلا نمی گم خودتون در موردش پیگیر بشید . فقط من یه نکته بهتون می در HHL متغیر=REgister)
    4.شما باید آشنایی کافی با زبان اسمیلی داشته باشید(من سری اینتل رو پیشنهاد می کنم)
    5. حالا که به اینجا رسیدید باید به دستورالعمل ها jump و movمسلط باشید و همچنینconversion (تا قادر به کانورت بین binary decimal hexdecimal باشید)
    6.شما باید زبان اسمبلی سری ARM رو هم یاد بگیرید(اگه سری اینتل رو بلیدید این یکی مثل آب خوردن می مونه)

    اینم یه سری آموزش ها در مورد این بالا هایی که گزاشتم:

    1.لینک داونلود آموزش C++
    2.لینک داونلود آموزش اسمبلی
    3.لینک داونلود ARM


    برنامه های مورد نیاز برای کرک

    1.UnmakeSIS(برای آنپک کردن بسته های EPOC به فایل ها و دسترسی به فایل APP)
    لینک داونلود UnMakeSIS


    2.MakeSIS(ریپک کردن فایلها بعد از اصلاح فایل APP)
    لینک داونلود MakeSIS

    3.IDA PRO Disassenmbler (برای تبدیل کردن فایل های APP به زبان اسمبلی)
    لینک داونلود IDA PRO DISASSEMBLER
    (حجم 31 مکابایت)

    4.HEX Editor(برای اعمال تغییرات در فایل APP)
    لینک داونلود WINHEX

    من شنیدم که ورژن جدید برنامه IDA PRO Disassembler اجازه ادیت کردن و اعمال تغییرات را هم میدهد پس به دیگر به مورد 4 دیگر نیازی ندارید
    اگه یه کم وقت خالی و علا قه داشته باشید این راه که به نظر طولانی می یاد کوتاه خواهد شد.شاید بعضی از افراد بهتون بگن بعضی از این نیازمندیها که در بالا اشاره کردم نیاز نیست.ولی مطمئن باشید که بر اساس تجربه ام به تک تکشون نیاز پیدا خواهید کرد. خب فعلا این برنامه ها رو بگبرید و با هاشون یه کم ور برید
    تا یه کم با هاشون راحت بشید. تو پست بعدی یه کم دیگه مقدمات رو توضیح می دم و بعدش هم سعی می کنم یکی دو مثال رو با هم دیگه کار کنیم تا همه چی براتون جا بیفته.(یعنی یکی دو برنامه رو کامل با هم کرک می کنیم!!!!!!!!)
    تشکر ویژه از پوریای عزیز


  2. 11 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #2
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

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

    نحوه شناسایی دستگاه

    یک تلفن موبایل نوعا بوسیله دو شماره خاص شناسایی می شود:
    -IMEI٬ که مخفف International Mobile Equipment Identity است که نشانگر سخت افزار وسیله است.این کد را با زدن کلیدها ی *#06# در گوشیتان می توانید ببینید.
    -IMSI ٬ که مخفف International Mobile Subscriber Identity است که نمایشگر اشتراکتان است.این شماره شامل دو قسمت است: اولین قسمت مشخص کننده اپراتور شبکه GSM ای است که مشترک در آن حساب دارد.دومین قسمت این شماره بوسیله ی اپراتور شبکه برای شناسایی مشترک تخصیص داده شده است.
    زمانی که می خواهید برنامه اتان را ریجستر کنید می توتنید از یکی از این دو کد یا تر کیبی از هر دو برای تولید یک کدفعال سازی برای برنامه تان استفاده کنید:
    ١.اگر شما برای اینکار IMEI را انتخاب کنید٬ شما اجرای برنامه را به وسیله محدود می کنید.کاربر فقط قادر به اجرای برنامه بروی تلفنی که برنامه بروی آن نصب سده خواهد بود.کاربر می تواند آپراتورش را بدون هیچ مشکلی عوض بکنه ٬اما اگر کاربر یک گوشی دیگر داشته باشد باید برای نصب برنامه لیسانس جدیدی را بخرد.
    ٢.اگر شما IMSI را انتخاب کنید ٬ شما برنامه رو به کاربر محدود می کنید. کاربر می تواند برنامه را بروی چندین دستگاه نصب کند اما برنامه فقط بروی دستگاهی که در حال حاضر از آن استفاده می کند قابل اجرا می باشد ( یعنی دستگاهی که در حال حاضر سیم کارت روی آن قرار دارد).این زمانی مفید است که شما یک سیم کارت و چندین گوشی دارید.
    ٣.شما می توانید برنامه را بیشتر محدود کنید و از ترکسبی از دو کد استفاده کنید و برنامه تان روی IMEI و IMSI قفل کنید یعنی یک سیم کارت و یک گوشی.
    ٤.همچنین می توان کد های خاص دیگری را بر اساس شماره های دیگر تولید کرد.
    در پست های بعدی در مورد IMSI و IMEI وفرمت هایشان ونحوه تولید و باز یابی شان توضیح می دهم.
    اجازه بدید که شما را یک نویسنده برنامه های سیمیبیان فرض کنیم.شما یک برنامه کوچک بدردبخور نوشته اید و تصمیم به فروش آن از طریق Handago ٬ Symbos و یا سایر کانال های فروش گرفته اید. خب بسیار معمول است که شما یک روش محافظتی را که بر اساس یکی از دو کد کار می کند را طراحی کرده باشید. اجازه بدید که IMEI را در نظر بگیرید. ولی در نظر داشته باشید که کرکر هم این موضوع را می داند......... و این اولین ضعف در برنامه ی شما می باشد.به عنوان قسمتی از واقعیت باید در نظر داشته باشید که با داشتن مقداری دانش در مورد زبان اسمبلی ARM و ابزارهای مربوطه با استفاده از مهندسی معکوس قسمت یا تمامی یک برنامه را معکوس کرد و تشخیص داد کجا هر سیستمی بازخوانی ساخته شده است.که این مسایل باعث کرک برنامه خواهد شد.

    پیدا کردن نقطه ورود : مشخص کردن جایی که کدباز تولید می شود

    در مثال ما٬کرکر فهمیده است که دومین تابع در آنجا فراخوانی شده است:
    .text:10000284 MOV R0, SP ; mov stack pointer in R0
    .text:10000286 BL sub_10004B6C ; get IMEI
    .text:1000028A ADD R0, R6, #0 ;
    .text:1000028C BL sub_100008DC ;
    .text:10000290 ADD R0, #0x2C ; R0 = R0+0x2C
    .text:10000292 MOV R1, SP ; R1 = SP
    .text:10000294 BL sub_10003DB0 ; copy IMEI which is in memory location SP to R0+0x2C
    اول نشانگرپشته ( Stack Pionter ) به R0 منتقل شده است.سپس IMEI باز تولید می شود. حالا ما می دانیم که IMEI در پشته است.بعد از تایع یعدی توصیف گر IMEI یه یک محل حافظه مشخص کپی می شود.

    پیدا کردن اگوریتم تولید کد:

    حالا ما بایستی جایی را مشخص کنیم که ما کدمان را وارد می کنیم و همچنین جایی را در app که کد را تولید و مقایسه می کند.بنابراین کرک “ADD R0,#0x2C” را سرچ می کند زیرا اینجا مکانی است که توصیف گر IMEI کپی شده است. در زیر روتین محاسبه گر کد فعال سازی برنامه را می بینید:
    .text:1000240C PUSH {R4-R7,LR} ; Push registers
    .text:1000240E ADD R6, R0, #0 ; Rd = Op1 + Op2
    .text:10002410 ADD R7, R1, #0 ; Rd = Op1 + Op2
    .text:10002412 STR R7, [R6,#0x5C] ; Store to Memory
    .text:10002414 MOV R5, #0 ; Rd = Op2
    .text:10002416 MOV R4, #0 ; Rd = Op2
    .text:10002418
    .text:10002418 loc_10002418 ; CODE XREF: sub_1000240C+2Aj
    .text:10002418 ADD R0, R6, #0 ; Rd = Op1 + Op2
    .text:1000241A ADD R0, #0x2C ; Rd = Op1 + Op2
    .text:1000241C ADD R1, R4, #0 ; Rd = Op1 + Op2
    .text:1000241E BL sub_10003EF0 ; Branch with Link
    .text:10002422 LDRH R0, [R0] ; Load from Memory
    .text:10002424 SUB R0, #7 ; Rd = Op1 - Op2
    .text:10002426 ADD R2, R4, #1 ; Rd = Op1 + Op2
    .text:10002428 ADD R1, R0, #0 ; Rd = Op1 + Op2
    .text:1000242A MUL R1, R2 ; Multiply
    .text:1000242C LDR R0, =0x16F ; Load from Memory
    .text:1000242E MUL R0, R1 ; Multiply
    .text:10002430 ADD R5, R5, R0 ; Rd = Op1 + Op2
    .text:10002432 ADD R4, R2, #0 ; Rd = Op1 + Op2
    .text:10002434 CMP R4, #4 ; Set cond. codes on Op1 - Op2
    .text:10002436 BLE loc_10002418 ; Branch
    .text:10002438 MOV R4, #0xA ; Rd = Op2
    .text:1000243A
    .text:1000243A loc_1000243A ; CODE XREF: sub_1000240C+4Aj
    .text:1000243A ADD R0, R6, #0 ; Rd = Op1 + Op2
    .text:1000243C ADD R0, #0x2C ; Rd = Op1 + Op2
    .text:1000243E ADD R1, R4, #0 ; Rd = Op1 + Op2
    .text:10002440 BL sub_10003EF0 ; Branch with Link
    .text:10002444 LDRH R0, [R0] ; Load from Memory
    .text:10002446 SUB R0, #7 ; Rd = Op1 - Op2
    .text:10002448 SUB R1, R4, #4 ; Rd = Op1 - Op2
    .text:1000244A MUL R1, R0 ; Multiply
    .text:1000244C LDR R0, =0x16F ; Load from Memory
    .text:1000244E MUL R0, R1 ; Multiply
    .text:10002450 ADD R5, R5, R0 ; Rd = Op1 + Op2
    .text:10002452 ADD R4, #1 ; Rd = Op1 + Op2
    .text:10002454 CMP R4, #0xE ; Set cond. codes on Op1 - Op2
    .text:10002456 BLE loc_1000243A ; Branch
    .text:10002458 LSL R0, R5, #0x10 ; Logical Shift Left
    .text:1000245A LSR R0, R0, #0x10 ; Logical Shift Right
    .text:1000245C CMP R7, R0 ; Set cond. codes on Op1 - Op2
    .text:1000245E BNE loc_10002464 ; Branch
    .text:10002460 MOV R0, #1 ; Rd = Op2
    .text:10002462 STR R0, [R6,#0x60] ; Store to Memory
    .text:10002464
    .text:10002464 loc_10002464 ; CODE XREF: sub_1000240C+52j
    .text:10002464 POP {R4-R7} ; Pop registers
    .text:10002466 POP {R0} ; Pop registers
    .text:10002468 BX R0 ; Branch to/from Thumb mode
    .text:10002468 ; End of function sub_1000240C

    این روتین از کدهای زیر فراخوانی شده است:

    .text:10000D02 LDR R1, =0x16E8701B ; Enter reg code
    .text:10000D04 LDR R2, [R0,#0x74] ;
    .text:10000D06 ADD R0, R4, #0 ;
    .text:10000D08 BL sub_10003D20 ; Get the code
    .text:10000D0C CMP R0, #0 ;
    .text:10000D0E BEQ loc_10000D98 ; If Cancel was pressed b
    .text:10000D10 BL sub_10003DD4 ;
    .text:10000D14 ADD R0, R6, #0 ;
    .text:10000D16 BL sub_100008DC ;
    .text:10000D1A LDR R1, [SP] ; Entered code moved to R1
    .text:10000D1C BL sub_1000240C ; Call to code calc routine
    .text:10000D20 ADD R0, R6, #0 ;
    .text:10000D22 BL sub_100008DC ;
    .text:10000D26 BL sub_10002470 ; Load Memory location to R0 = return value of code calc func
    .text:10000D2A ADD R4, R0, #0 ; Put R0 -> R4
    .text:10000D2C CMP R4, #0 ; Compare R4 to 0
    .text:10000D2E BNE loc_10000D60 ; B if R4 is not 0 = reg code is right
    اول ID اصلی در R1 قرار می گیرد. سپس یک تابع فراخوانی می شود تا ورودی را که از طریق کاربر وارد می شود را دریافت کند.بعد از آن برنامه کلیدهایی را که فشار داده شده اند را آنالیز می کند. اگر این کلیدها همان بودند شعبات را کنسل می کند. اگر نه که اعدادی را که بوسیله کاربر وارد شده اند را در R1
    را انتقال می دهد ( .text:10000D1A ) . حالا تابع محاسبه گر فراخوانی می شود ٬ با نگاه کردن به آن تابع خواهیم دید که مقدار برگشت داده از تابع محاسبه گر کد در R6,#*x60 ذخیره می گردد
    ( .text:10002462 ).
    در .text:10000D26 برنامه آن حافظه ویژه را به R0 بازیابی می کند. سپس R0 به R4 منتقل می شود و این مقدار با 0 مقایسه می گردد.پس اولین سرنخ رو پیدا کردیم : ارزش برگشتی از تابع محاسبه گر کد نباید 0 باشد.
    خب حالا بریم این مقدار برگشتی رو بررسی کنیم:
    .text:1000245C CMP R7, R0 ; compare R7 = R0
    .text:1000245E BNE loc_10002464 ; b if not equal
    .text:10002460 MOV R0, #1 ; R0 = 1
    .text:10002462 STR R0, [R6,#0x60] ; store R0 to memory location
    با مشاهده تابع محاسبه گر ما می توانیم ببینیم که R7 باید برابر R0 باشد . سپس مقدار برگشتی 1 خواهد بود که در حافظه ذخیره می گردد . همانطوری که اشاره شد این مسئله بعد از برگشت و مقایسه با 0 اتفاق می افتد ( .text:10000D2C ) . حالا باید بدونیم که چه چیزی در داخل R7 وجود دارد. به شروع کد یه نگاه بندازید :
    .text:10002410 ADD R7, R1, #0 ; Rd = Op1 + Op2
    R1 به R7 منتقل شده است . پس چه چیزی داخل R1 بوده است؟؟؟ قبل از اینکه تابع محاسبه گر باز خوانی شود ٬محتوای SP به R1 منتقل شده است :
    .text:10000D1A LDR R1, [SP] ; Entered code moved to R1
    حالا ما می دانیم که کد وارد شده باید با کد محاسبه شده توسط app برابر باشد. این کد محاسبه شده باید توسط کاربر وارد گردد تا برنامه ریجستر شود. حالا ما باید این کد را برای خودمون محاسبه کنیم................

    کرک کردن کد

    خب حالا قسمت هیجان انگیز کار ما به عنوان کرکر شروع می شود . حالا به قسمت اول تابع محاسبه گر توجه کنید:

    .text:10002414 MOV R5, #0 ; R5 = 0
    .text:10002416 MOV R4, #0 ; R4 = 0
    .text:10002418
    .text:10002418 loc_10002418 ; CODE XREF: sub_1000240C+2Aj
    .text:10002418 ADD R0, R6, #0 ;
    .text:1000241A ADD R0, #0x2C ; R0 = Pointer to IMEI descriptor
    .text:1000241C ADD R1, R4, #0 ; R1 = R4 (which number from IMEI descriptor)
    .text:1000241E BL sub_10003EF0 ; Get ASCII value
    .text:10002422 LDRH R0, [R0] ; load value in R0
    .text:10002424 SUB R0, #7 ; R0 = R0 - 7
    .text:10002426 ADD R2, R4, #1 ; R2 = R4 + 1
    .text:10002428 ADD R1, R0, #0 ; R1 = R0
    .text:1000242A MUL R1, R2 ; R1 = R2 * R1
    .text:1000242C LDR R0, =0x16F ; R0 = 0x16F
    .text:1000242E MUL R0, R1 ; R0 = R1 * R0
    .text:10002430 ADD R5, R5, R0 ; R5 = R5 + R0
    .text:10002432 ADD R4, R2, #0 ; R4 = R2
    .text:10002434 CMP R4, #4 ; is R4 = 4
    .text:10002436 BLE loc_10002418 ; b if R4 is less or equal 4

    خب حالا تو کدهای بالایی چه اتفاقی افتاده است؟
    اول R4 و R5 صفر شده اند . سپس یک نشانگر به توصیف گر IMEI به R0 منتقل شده است.R1 شمارهIMEI می باشد. بنابراین در آغاز اجرای این حلقه R4=R1 صفر است. بنابراینapp شروع به گرفتن مقدارASCII اولین شماره در IMEI می کند.اگر این مقدار 3 فرض شود مقدار موجود در R0 بعد از دستورالعمل LDRH ٬ 0x33 ( که همان کد ASCII عدد 3 می باشد ) . از این مقدار 7 کم می شود .
    مقداری که یرای اولین اجرای ما 0x2C در R0 بعد از SUB را نتیجه می دهد. سپس 1 به R4 افزوده
    می شود و نتیجه در R2 قرار می گیرد ( R2 در حال حاضر 1 می باشد ) . R0 به R1 ( ADD ) می شود
    حالا هر دو ضرب می شوند . حالا دیگه نتیجه را حدس زدن آسان است: R2 = 1 * R1 =0x2C .
    در R1 مقدار 0x2C قرار می گیرد .پس R1 در 0x16F موجود در R0 ضرب می شود که0x3F14 را
    می سازد که به R5 اضافه می گردد. در نهایت R2 به R4 که حالا 1 است منتقل ( ADD ) می شود و با 4
    مقایسه می گردد . حالا که R4 برابر 1 است BLE برداشته می شود و دوباره از .text:100002418 شروع می شود. ولی حالا دومین شماره IMEI بازیابی می شود (R4=1 ) . شاید 5 باشه . بعد از دستورالعمل LDRH چه مقداری در R0 است ؟ معلومه دیگه ٬ 0x35 ! پس ما -7 و ضرب را داریم . ولی حالا دقت کنید: R2 حالا محتوی 2 می باشد از وقتی که 0x5C می شود. ما مشاهده می کنیم که یک شماره مجزا از IMEI با موقعیتش در IMEI ضرب شده است . بعد از * با 0x16F آن را به R5 اضافه می کنیم
    ( .text:10002430 ) .اما در R5 مقداری از آخرین حلقه ( LOOP ) وجود دارد.پس شما می بینید که تمامی مقادیر به 1 اضافه شده اند . بعد از دومین اجرایمان این مقدار باید 0xC2F8 باشد. این کد موجود در پلن c است :
    code = ((ASCIIvalueofIMEI - 7) * PositionofNumberinIMEI) * 0x16F;
    پس تمامی کدها اضافه می گردد ............ حالااولین حلقه رو بررسی کردیم.بعد از اینکه R4 برابر 5 شد
    BLE برداشته نمی شود وما انجا ادامه می دهیم :
    .text:10002438 MOV R4, #0xA ; R4 = 0xA
    .text:1000243A
    .text:1000243A loc_1000243A ; CODE XREF: sub_1000240C+4Aj
    .text:1000243A ADD R0, R6, #0 ;
    .text:1000243C ADD R0, #0x2C ; R0 = Pointer to IMEI descriptor
    .text:1000243E ADD R1, R4, #0 ; R1 = R4 (which number from IMEI descriptor)
    .text:10002440 BL sub_10003EF0 ; Get ASCII value
    .text:10002444 LDRH R0, [R0] ; load value in R0
    .text:10002446 SUB R0, #7 ; R0 = R0 - 7
    .text:10002448 SUB R1, R4, #4 ; R1 = R4 - 4
    .text:1000244A MUL R1, R0 ; R1 = R0 * R1
    .text:1000244C LDR R0, =0x16F ; R0 = 0x16F
    .text:1000244E MUL R0, R1 ; R0 = R1 * R0
    .text:10002450 ADD R5, R5, R0 ; R5 = R5 + R0
    .text:10002452 ADD R4, #1 ; Rd = Op1 + Op2
    .text:10002454 CMP R4, #0xE ; is R4 = 0xE
    .text:10002456 BLE loc_1000243A ; b if R4 is less or equal 0xE
    شما می بینید که 0x2 به R4 منتقل شده است.بنابراین بعضی از اعداد IMEI در محاسبه کد نهایی به کار نمی روند و آنها اعداد 5-9 هستند . پس اساسا کار مشابهی در این حلقه انجام می شود.مقدار ASCII را از شمارهIMEI در یک وضعیت خاص بگیرید . 7 را از آن کم کنید .
    اما در اینجا (text : 10002448 )بعضی تغییرات وجود دارد : SUB R1,R4,#4 .بنابراین 4 از R4 کم شده است و در R1 قرار گرفته است.برای اولین اجرا در این حلقه R4 برابر 0xA می باشد و سپس R1 باید0xA – 4 = 0x6 باشد.بنابراین برنامه وضعیت اعداد را نیز ویرایش می کند! پس ما بصورت معمولی با ضرب و جمع تا R5 این روند را ادامه می دهیم . این حلقه تا انتهای IMEI که آن وضعیت 0xE می باشد ادامه پیدا می کند و با 0x0 که به عنوان اولین وضعیت به حساب می آید شروع می کنیم . 0x0 -0xE = 0xF یا 15 وضعیت ٬ که تعداد ارقام شماره IMEI می باشد. پس :
    code = ((ASCIIvalueofIMEI - 7) * PositionofNumberinIMEI - 4) * x16F;
    و در نهایت کدها با هم دیگر جمع می شود . آخرین قدم در محاسبه کد به قرار زیر است:

    .text:10002458 LSL R0, R5, #0x10 ; Logical Shift Left
    .text:1000245A LSR R0, R0, #0x10 ; Logical Shift Right

    R5 به چپ 0x10 بار شیفت شده می شود که به این معناست که در 65536 ضرب شده است
    ( R0=R5*65536 ).سپس این عدد را بر 65536 تقسیم می گردد ( به عقب شیفت می شود
    R0 = R0/65536 ) . حالا ما کد نهایی در R0 را که با کد وارد شده توسط کاربر ( که در R7 قرار گرفته است ) مقایسه می گردد را بدست آورده ایم ( .text:1000245 ) ......
    خب حالا با این الگوریتمی که بدست آورده ایم یک kegen می نویسیم و کار تمومه!!!!!!!!!!!!!!!
    تشکر ویژه از پوریای عزیز


  • 13 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #3
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

    دوستان امیدوارم مصالب بدردتون خورده باشه
    یکم ویرایش و شکل مطلب بهم خورده که می تونید از لینک پایین
    فایل PDF رو بگیرید که راحتتر بتونید مصلب رو بخونید
    حجم 83 کیلو بایت

    لینک داونلود PDF
    تشکر ویژه از پوریای عزیز


  • 3 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #4
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

    دوستان من پست ها رو هم ويرايش كردم تا اگر خداي ناكره كسي از اين تاپيك استقبال كرد سر در گم نشه!!!!!
    تشکر ویژه از پوریای عزیز


  • 3 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #5
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

    دوستاني كه ميخواستند برنامه كرك كنند و مدام براي من پيام خصوصي ميدادند كه به ما ياد بده چرا هيچ استقبالي نميكنند
    تشکر ویژه از پوریای عزیز


  • 4 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #6
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935
    IMSI




    IMSI مخففی برای Internatinal Mobile Subscriber Identity است. شماره IMSI یک کد 15 رقمی منحصربفرد است که به هر SIM ( Subscriber Identification Module ) کارتی اختصاص داده می شود و برای شبکه های موبایل امکان تشخیص کشور و شبکه مشترک موردنظر را فراهم
    می آورد .


    پلتفرم UIQ

    شماره IMSI از سونی اریکسون P800 و P900 برای استفاده در برنامه های C++ بوسیله ی خواندن محتویات فایل C:\system\data\imsi.txt قابل دستیابی است.
    این فایل بصورت اتوماتیک در صورت عوض شدن سیم کارت آپدیت می شود .
    بعضی از عملیات سیستم این فایل را باز نگه می دارد و از این رو ٬ فایل لازم است برای خواننده در حالت اشتراک باز شود.این حالت بوسیله استفاده از پرچم EFileShareReadersOnly در هنگام باز کردن فایل انجام می شود. کدهای C++ زیر محتویات imsi.txt را می خواند و در روی صحفه نمایش می دهد:

    RFs fs;
    fs.Connect();
    RFile file;

    _LIT(KImsiFileName,"C:\\System\\data\\imsi.txt");

    TInt res = file.Open(fs,KImsiFileName,
    EFileShareReadersOnly|EFileStreamText);

    if(res != KErrNone)
    {
    gConsole->Printf(_L("Open failed: %d\n"),res);
    }
    else
    {
    TBuf8<128> buf;
    file.Read(buf);
    file.Close();
    fs.Close();

    TBuf<128> printBuf;
    printBuf.Copy(buf);
    gConsole->Printf(_L("IMSI: "));
    gConsole->Printf(printBuf);
    gConsole->Printf(_L("\n"));
    }

    پلتفرم سری 60


    بروی پلتفرم سری 60 ٬ برای موبایل هایی که از تکنولوژی نسل سومAPI پشتیبانی می کنند کارهای مشابه ای قابل اجرا است ( منظور گوشی هایی است که بر اساس V7.0sبه جز نوکیا 6600 کارمی کنند)
    کد IMSI بوسیله کدهای زیر قابل دستیابی است:



    CTelephony telephony = CTelephony::NewL();
    TRequestStatus status;
    CTelephony::TSubscriberIdV1 subscriberId;
    CTelephony::TSubscriberIdV1Pckg subscriberIdPckg(subscriberId);
    telephony->GetSubscriberId(status, subscriberIdPckg));
    User::WaitForRequest(status);
    User::LeaveIfError(status);
    TPtrC theIMSI(subscriberId.iSubscriberId

    برای اصلاعات بیشتر در این زمینه به سایت های زیر مراجعه کنید:


    Sony Ericsson Developer Site


    Symbian Site
    تشکر ویژه از پوریای عزیز


  • 7 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #7
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

    لینک داونلود پست بالا بصورت PDF


    در پست بعدی یه مطلب کوتاه دیگه ای در مورد IMEI می زارم و سپس دو مثال عملی در مورد کرک دو برنامه موبایل می زارم
    تشکر ویژه از پوریای عزیز


  • 4 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #8
    AmIr NiKoOnAm آواتار ها
    درجه
    مدير ارشد بازنشسته
    شماره كاربری
    29625
    نوشته ها
    1,247
    سپاس ها
    800
    سپاس از شما 2,078 بار در 564 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Sep 2005
    091-0935

    پیش فرض

    کسی نیست.......

    شاید دیگه ادامه ندم...بابا یه نظری . انتقادی . یه چیزی.....
    تشکر ویژه از پوریای عزیز


  • 4 كاربر زير از شما AmIr NiKoOnAm عزيز، سپاسگزاری كرده اند




  • #9

    sina61 آواتار ها
    درجه
    عضو نيمه فعال
    شماره كاربری
    44960
    نوشته ها
    172
    سپاس ها
    85
    سپاس از شما 231 بار در 50 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Jun 2006
    محل سکونت
    IRAN
    091

    پیش فرض ديكشنري انگليسي به فارسي براي Uiq

    Salam arz mikonm.
    mazerat mikham farsi type nemikonm. lotfan application dictionary farsi be englisi ke NIA baraye S60 neveshte ro baraye UIQ (motorola a1000 ham qabele estefade konid. motashakkeram

    arsham_pa80@yahoo.com

  • كاربران زير از شما sina61 عزيز، سپاسگزاری كرده اند




  • #10


    درجه
    عضو جديد
    شماره كاربری
    2626
    نوشته ها
    22
    سپاس ها
    14
    سپاس از شما 4 بار در 3 پست
    جزئیات بیشتر...
    تاریخ عضویت
    Apr 2005

    پیش فرض

    خيلي عالي بود ممنون از توضيحا تتون واقعا كف كردم با اين هوشي كه داري . اي نشون ميده كه ايراني ها چقدر با هوش هستند و چه كارايي ميتوانند انجام دهند . اگه ميشه در مورد گوشي هايي كه اصلا وارد شبكه نميشن توضيح بدين آيا راهي هست كه بدون مراجعه به مخابرات ودادن شماره سريال گوشي وارد شبكه بشه ؟ اگه لطف كني ممنون ميشم . و اگه ميشه جوابش رو برام به ادرس ايميل من بفرست ahmad_shiraz26@yahoo.com

  • 2 كاربر زير از شما dabiri_a عزيز، سپاسگزاری كرده اند




  • صفحه 1 از 3 123 آخرینآخرین

    مجوز های ارسال و ویرایش

    • شما نمیتوانید موضوع جدیدی ارسال کنید
    • شما امکان ارسال پاسخ را ندارید
    • شما نمیتوانید فایل پیوست کنید.
    • شما نمیتوانید پست های خود را ویرایش کنید
    •