PDA

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



AmIr NiKoOnAm
09-07-2006, 19:37
سلام دوستان قبل از هر چیزی این مطلب رو بیان کنم که تمامی این مطالب برگرفته از انجمن های آریا میباشد

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

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


تعریف کرک
پروسه ای است که کرکر با استفاده از مهندسی معکوس فایل های اجرایی (در مورد برنامه های سیمیبیان
فایل های با پسوند 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++ (http://...........biz/uploads/teachyourselfc.zip)
2.لینک داونلود آموزش اسمبلی (http://...........biz/uploads/tutasm01_896.zip)
3.لینک داونلود ARM (http://...........biz/uploads/arm_154.rar)


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

1.UnmakeSIS(برای آنپک کردن بسته های EPOC به فایل ها و دسترسی به فایل APP)
لینک داونلود UnMakeSIS (http://...........biz/uploads/UnMakeSISv0.2b.zip)


2.MakeSIS(ریپک کردن فایلها بعد از اصلاح فایل APP)
لینک داونلود MakeSIS (http://...........biz/uploads/Makesis_v1.0.zip)

3.IDA PRO Disassenmbler (برای تبدیل کردن فایل های APP به زبان اسمبلی)
لینک داونلود IDA PRO DISASSEMBLER (http://www............info/Mobile/win-app/DataRescue.IDA.Pro.v4.8.0.847.Advanced............ ORG.rar)
(حجم 31 مکابایت)

4.HEX Editor(برای اعمال تغییرات در فایل APP)
لینک داونلود WINHEX (http://...........biz/uploads/winhex_full__130.zip)

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

AmIr NiKoOnAm
09-07-2006, 19:40
اگه توجه کرده باشید وقتی یه برنامه رو روی گوشیتون نصب می کنید برنامه یه کدی رو برای ریجستر شدن ازتون می خواهد.برای کرک این برنامه ها ٬راه های متعددی وجود داره. که در تقریبا همشون ابتدا باید فهمید که برنامه براساس چه الگوریتمی کد را می سازه و ازتونبرای ریجستر می خواهد.مطالبی که در ادامه می آید این کارو با یک مثال بیشتر توضیح می دهد واین مطالب از دیدگاه یک نویسنده برنامه ارائه می گردد.

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

یک تلفن موبایل نوعا بوسیله دو شماره خاص شناسایی می شود:
-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 می نویسیم و کار تمومه!!!!!!!!!!!!!!!

AmIr NiKoOnAm
09-07-2006, 19:43
دوستان امیدوارم مصالب بدردتون خورده باشه
یکم ویرایش و شکل مطلب بهم خورده که می تونید از لینک پایین
فایل PDF رو بگیرید که راحتتر بتونید مصلب رو بخونید
حجم 83 کیلو بایت

لینک داونلود PDF (http://...........biz/uploads/001.pdf)

AmIr NiKoOnAm
11-07-2006, 12:05
دوستان من پست ها رو هم ويرايش كردم تا اگر خداي ناكره كسي از اين تاپيك استقبال كرد سر در گم نشه!!!!!

AmIr NiKoOnAm
12-07-2006, 21:06
دوستاني كه ميخواستند برنامه كرك كنند و مدام براي من پيام خصوصي ميدادند كه به ما ياد بده چرا هيچ استقبالي نميكنند

AmIr NiKoOnAm
12-07-2006, 21:09
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 (http://developer.sonyericsson.com/site/global/techsupport/tipstrickscode/symbian/p_symbian_0601.jsp)


Symbian Site (http://www3.symbian.com/faq.nsf/0/8DA91C7B8610E79980256F0800547B5C?OpenDocument)

AmIr NiKoOnAm
12-07-2006, 21:11
لینک داونلود پست بالا بصورت PDF (http://...........biz/uploads/IMSI.pdf)


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

AmIr NiKoOnAm
13-07-2006, 11:36
کسی نیست.......

شاید دیگه ادامه ندم...بابا یه نظری . انتقادی . یه چیزی.....

sina61
13-07-2006, 13:35
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

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

AmIr NiKoOnAm
17-07-2006, 11:00
IMEI


IMEI ‘ مخفف Internatinal Mobile Equipment Identity است که یک شماره منحصربفرد تخصیص داده شده به هر دستگاه موبایل می باشد. توجه کنید که شناسه های IMEI بوسیله سازنده و نه کاربر و نه شبکه سرویس دهنده تخصیص داده می شود که کاربر و شبکه بوسیله IMSI شناسایی می شوند یعنی:


-کاربر IMEI را تغییر می دهد نه IMSI را ‘ زمانی که دستگاه موبایل اش را تغییر می دهد و اشتراکش در این حالت تغییر نمی کند.
-کاربر هنگامی که اشتراکش ( SIM CARD ) را عوض می کند ولی گوشی را عوض نمی کند ‘ IMSI را تغییر داده ولی IMEI را تغییر نداده است.

به هر حال IMEI بوسیله کاربر تعریف نمی شود و کپی از IMEI معمولا پشت باطری چسبانده می شود.همچنین این شماره را می توان با وارد نمودن کد *#06# بروی صحفه نمایش گوشی موبایل مشاهده کرد.


بسته به دستگاه موبایلتان ‘ این شماره میتواند دو فرمت داشته باشد(فرمت قدیمی و جدید) :


-aabbb-cc-dddddd-e اگر که گوشی شما قبل از اول آوریل 2004تولید شده باشد
-xxxxxxxx-dddddd-e اگر گوشی شما از تاریخ بالا به بعد تولید شده باشد.

فرمت قدیمی IMEI

فرمت xxxxxxxx-cc-dddddd-e تا تاریخ اول آوریل 2004 استفاده می شد. معنای این کد به شرح زیر است:
-aabbb کد تصویب نمونه ( Type Approval Code – TAC ) است. اولین دو رقم ( aa ) کد کشور را نشان می دهند.
-گروه دوم اعداد ( cc ) کدهای اسمبلی نهایی ( Final Assembly Code – FAC ) هستند ‘ که تولید کننده دستگاه را مشخص می کند:




01,02 = AEG
60 = Alcatel
07,40 = Motorola
61 = Ericsson
10,20 = Nokia
65 = AEG
30 = Ericsson
70 = Sagem
40,41,44 = Siemens
75 = Dancall
50 = Bosch
80 = Philips
51 = Sony, Siemens, Ericsson
85 = Panasonic

این مقادبر برای تمامی موبایل هایی که از اول ژانویه 2003 تولید شده اند 00 شده اند.


-dddddd شماره سریال دستگاه ( SNR ) را نشان می دهد.
-آخرین رقم تکی ( e ) یک رقم کنترلی است ( معمولا 0 است ).


فرمت جدید IMEI

فرمت جدید xxxxxxxx-dddddd-e از تاریخ اول آوریل 2004 به بعد مورد استفاده قرار گرفته است . مقدار FAC حذف گردیده و کد تصویب نمونه ( TAC ) بوسیله کد تخصیص نمونه ( Type Allocation Code –TAC) جایگزین گردیده است :

-xxxxxxxx یک شماره 8 رقمی که نشان دهنده ی کد تخصیص نمونه است.
-dddddd و e که دارای معانی مشابه با فرمت قدیمی هستند.

فرمت IMEISV

در بعضی از فرمت ها ممکن است در انتهای شماره IMEI دو رقم اضافی دیگر هم وجود داشته باشند ‘ این دو رقم اضافی نشانگر ورژن نرم افزار گوشی می باشد.

بازیابی کد IMEI در گوشی های سیمبیان

در زیر یک تابع کوچک وجود دارد که به شما اجازه می دهد که IMEI دشتگاه را فراخوانی کنید :


#include <plpvariant.h>

void DeviceUtils::GetImei(TDes& aImei)
{
#ifndef __WINS__
// This only works on target machine
TPlpVariantMachineId imei;
PlpVariant::GetMachineIdL(imei);
aImei.Copy(imei);
#else
// Return a fake IMEI when working on emulator
_LIT(KEmulatorImei, "000000000000000");
aImei.Copy(KEmulatorImei);
#endif
}

sirvaan
17-07-2006, 14:01
خيلي عالي بود ممنون از توضيحا تتون واقعا كف كردم با اين هوشي كه داري . اي نشون ميده كه ايراني ها چقدر با هوش هستند و چه كارايي ميتوانند انجام دهند . اگه ميشه در مورد گوشي هايي كه اصلا وارد شبكه نميشن توضيح بدين آيا راهي هست كه بدون مراجعه به مخابرات ودادن شماره سريال گوشي وارد شبكه بشه ؟ اگه لطف كني ممنون ميشم . و اگه ميشه جوابش رو برام به ادرس ايميل من بفرست ahmad_shiraz26@yahoo.com

با عرض معذرت از آقا امیر (چون نویسنده با من نبودن!!!!!)

آقا من منظورتون متوجه نشدم اصلا..........
اگه منظورتون از شماره سریال همون IMEI هستش که این ربطی به مخابرات نداره.........
واسه فعال شدن شماره تون توی مخابرات باید تو شبکه IMSI تون تعریف بشه.

AmIr NiKoOnAm
29-07-2006, 16:53
کرک کردن Symbianware Stacker V2.02


برنامه های مورد نیاز :
1
.IDA PRO V4.04 یا بالاتر
2.Hex Editor که من WinHex را پیشنهاد می کنم.

هدف:
Symbianware Stacker V2.02


" Stacker یک سیستم اتومات و کامل فشرده سازی برای نوکیا 7650 است. Stacker حجم درایوهای داخلی را دو برابر کرده و در پشت صحنه بصورت مخفی کار می کند. زمانی که شما برنامه را اجرا می کنید برنامه در بگراند بصورت اتوماتیک دکمپرس شده و دوباره زمانی که برنامه را می بندید فشرده می شود."
برنامه اورجینال از سایت www.symbianware.com قابل دریافت است.

الزامات:

داشتن مقداری دانش در مورد زبان اسمبلی ARM .........( www.arm.com )
اگر چنین دانشی را ندارید ‘ حداقل شما باید بدانید که چگونه از IDA و HexEditor استفاده کنید و چگونه فایل را بین PC و Nokia 7650 انتقال دهید.

هشدار :

این مطالب برای یک فرد مبتدی در زمینه کامپیوتر قابل فهم نیست !!!! خب شاید این اولین مقاله ای باشد که در زمینه کرک برنامه های موبایل به این صورت و به زبان فارسی دیده باشید. پس احتمالا یه کم بد فهم باشد. به هر حال امیدوارم که خوب مطالب را انتقال بدم.
در ضمن اگر نمی دانید اسمبلر چیست‘همین الان از خواندن ادامه مطالب دست بردارید و برید یه کار دیگری انجام دهید!!!!!!!!!!!

دستورالعمل :

برنامه Symbianware Stacker به این خاطر که هم زودفهم است و هم به سادگی کرک می شود ، انتخاب شده است. به نظر من همه برنامه های Symbianware به راحتی کرک می شود . شاید شما در ابتدا فکر کنید که کار مشکلی است ولی در واقع نیست !!!!!
خب حالا ادامه می دهیم:
اول از همه برنامه را تو گوشی نصب و اجرا کنید.همه چیز را تست کنید.بعد از آن..........
با برنامه HexEditor فایل stacker.app را باز کنید ( فایل sis برنامه را بوسیله برنامه UnMakeSIS باز کنید تا به فایل stcker.app دسترسی داشته باشید ) و به اعداد درهم ریخته و حروف ASCII نگاه کنید . در خط اول در فاصله ( offset ) 0x10 شما عبارت " EPOC " را می بینید که به معنای آن است که این یک فایل EPOC برای استفاده در سیستم عامل سیمبیان است .
به پایین حرکت کنید تا رشته های یونیکد مابین فواصل 0x76C0 تا 0x7FA0 را ببینید. اینجا کمی دقت کنید !!!
این یونیکدها چیست که ما قادر به خواندنشان هستیم؟؟؟ آیا این همان متنی که در About و سایر پیغام های برنامه قابل مشاهده است، نمی باشد ؟؟؟؟؟؟؟؟
بلی،دقیقا خودشه!!!!خب برنامه نویس سوتی خودش را داد!!!!خب حالا با دقت بیشتر به فاصله 0x7F18 نگاه کنید:


00007F18 U.n.r.e.g.i.s.t.e.r.e.d.!. .T.r.i.a.l. .i.s. .o.v.e.r....... ....... .d.

00007F60 a.y.s. .l.e.f.t. .t.o. .e.x.p.i.r.e.....U.n.r.e.g.i.s.t.e.r.e.d.

ووووووووو!!! ما متنی را که هنگام شروع برنامه می بینیم پیدا کردیم. این فاصله را یادداشت کنید و زود بریم سراغ برنامه IDA ..............
فایل stacker.app را با IDA باز کنید. IDA اعلام می کند که این یک فایل EPOC است، چیزی که قبلا هم فهمیده بودیم.
منابع را مارک لود ( Mark Load ) کنید. OK کنید.حالا شما متوجه شده اید که پردازشگر ARM دو سری دستورالعمل دارد اما این مسئله در حال حاظر چندان به کار نمی آید.
حالا IDA کدهای دستورالعمل ARM دیسمبل شده ( Disassemble ) برایتان نمایش می دهد. ممکن است شما گزینه Option/General/Auto Comments را برای فهم بهتر کدها روشن کرده باشید.........
برای آندسته از دوستانی که با IDA آشنا نیستند مهم است که بدانند در خط وضعیت ( Status Line ) در زیر، فواصل نمایش داده می شود. ( توجه: وضعیت غعلی در فایل ورودی به معنای فواصل می باشد).
حالا بریدپایین کدها،تا فواصلی را که یادداشت کرده بودید را پیدا کنید. IDA این متون را نشان می دهد:



.text:10007E9C dword_0_10007E9C DCD 0x6E0055, 0x650072, 0x690067, 0x740073,

.text:10007E9C 0x720065, 0x640065 ; DATA XREF: .text:10005830

.text:10007E9C DCD 0x200021, 0x720054, 0x610069, 0x20006C, 0x730069,

.text:10007E9C DCD 0x6F0020, 0x650076, 0x2E0072, 0

.text:10007ED8 dword_0_10007ED8 DCD 0xA0020, 0 ; DATA XREF: .text:100058A4

حالا روی اعداد راست کلیک کرده و Undefine را انتخاب کرده تا کدهای بالا مرتب شوند :


text:10007E9C unk_0_10007E9C DCB 0x55 ; U ; DATA XREF: .text:10005830o
.text:10007E9D DCB 0 ;

.text:10007E9E DCB 0x6E ; n

.text:10007E9F DCB 0 ;

.text:10007EA0 DCB 0x72 ; r

.text:10007EA1 DCB 0 ;

.text:10007EA2 DCB 0x65 ; e

.text:10007EA3 DCB 0 ;

.text:10007EA4 DCB 0x67 ; g

.text:10007EA5 DCB 0 ;

.text:10007EA6 DCB 0x69 ; i

.text:10007EA7 DCB 0 ;

.text:10007EA8 DCB 0x73 ; s

.text:10007EA9 DCB 0 ;

.text:10007EAA DCB 0x74 ; t

.text:10007EAB DCB 0 ;

.text:10007EAC DCB 0x65 ; e

.text:10007EAD DCB 0 ;

.text:10007EAE DCB 0x72 ; r

.text:10007EAF DCB 0 ;

.text:10007EB0 DCB 0x65 ; e

.text:10007EB1 DCB 0 ;

.text:10007EB2 DCB 0x64 ; d

.text:10007EB3 DCB 0 ;

.text:10007EB4 DCB 0x21 ; !

.text:10007EB5 DCB 0 ;

...............................................(sh ortend)


به رشته یونیکدی که در Hex Editor دیدید ، دقت کنید!حالا می خوانیم بدانیم چه زمانی از این رشته ها در کدها استفاده شده است؟ پس روی " DATA XREF:.text:1000580C↑o " راست کلیک کرده و
Jump to cross reference را انتخاب و Ok کنید. شما به اینجا برده خواهید شد:


.
text:10005830 off_0_10005830 DCD loc_0_10007E9C ; DATA XREF: .text:1000580Cr

دوباره انجام بدید: روی " DATA XREF:.text:1000580C↑r " راست کلیک کرده و Jump to cross reference را انتخاب و Ok کنید. بالاخره به کد زیر میرسید:


text:1000580C LDR R1, =dword_0_10007E9C ; Load from Memory

LDR دستورالعملی برای بارگزاری رشته از حافظه است.این رشته بعدا نمایش داده می شود.آما ما نمی خواهیم این متن را در برنامه ببینیم چون بسیارآزاردهنده است!!! خب حالا در کدها کمی بالا می رویم.ما قبلا چکار کردیم :


text:100057BC BL sub_0_1000538C ; Branch with Link .text:100057C0 CMP R0, #0 ; Set cond. codes on Op1 - Op2 text:100057C4 BNE loc_0_100058B0 ; Branch <<<<<<< .text:100057C8 MOV R0, R4 ; Rd = Op2 .text:100057CC BL loc_0_100054C4 ; Branch with Link .text:100057D0 SUBS R7, R0, #0 ; Rd = Op1 - Op2 .text:100057D4 BEQ loc_0_10005834 ; Branch <<<<<<< .text:100057D8 BL loc_0_10006168 ; Branch with Link .text:100057DC LDR R1, =0x5BED5021 ; Load from Memory .text:100057E0 LDR R2, =0x5BED5020 ; Load from Memory .text:100057E4 BL loc_0_100064A8 ; Branch with Link .text:100057E8 MOV R0, R4 ; Rd = Op2 .text:100057EC BL loc_0_10005230 ; Branch with Link .text:100057F0 MOV R0, R4 ; Rd = Op2 .text:100057F4 BL sub_0_1000538C ; Branch with Link .text:100057F8 CMP R0, #0 ; Set cond. codes on Op1 - Op2 .text:100057FC BNE loc_0_100058B4 ; Branch <<<<<<< .text:10005800 BL loc_0_10006168 ; Branch with Link .text:10005804 MOV R4, R0 ; Rd = Op2 .text:10005808 ADD R0, SP, #0x20 ; Rd = Op1 + Op2 .text:1000580C LDR R1, =dword_0_10007E9C ; Load from Memory <--- Stupid String
.text:10005810 BL loc_0_10005B48 ; Branch with Link

همانطور که در بالا علامت های قیچی مشخص کرده اند آنجا سه شعبه ( branch ) شرطی برای پرهیز از بارگذاری رشته وجود دارد. در متن این شعبه ها بوسیله <<<<<<< علامت گذاری شده اند. به نظر می رسد که برنامه تست می کندکه اگر ما ریجستر کرده باشیم که هیچ اما اگر برنامه ریجستر نشده باشد، برنامه رشته
" Unregistered " را نمایش می دهد.
واضح است که ما باید BL ها را قبلاز شعبه ها امتحان کنیم. چرا؟ کدها را توضیح می دهم:


ext:100057BC BL sub_0_1000538C ; Branch with Link

یک شعبه به یک تابع دیگر فراخوانی می شود ( BL هاهمیشه به دستورالعمل بعدی بر می گردند ). همچنین آنها شاید به یک یا بیشتر از یک ریجستر برگشت داده شوند.


text:100057C0 CMP R0, #0 ; Set cond. codes on Op1 - Op2

ریجستر R0 با صفر مقایسه می گردد :


text:100057C4 BNE loc_0_100058B0 ; Branch if not equal

اگر R0 صفر نبود، شعبه برداشته می شود، اگر R0 برابر صفر بود عملی انجام نمی گیرد.پس ما باید مطمئن باشیم که نتیجه از تابع فراخوانی ( BL) ، صفر نباشد. سپس شعبه برداشته می شود و ما یک برنامه ریجستر شده خواهیم داشت!!!!!!!!!!!!!!!!!!!
اگر شما هم با مسئله موافق هستید، ممکن است این سوال برایتان پیش آمده باشد: کدام یک از اینم شعبه ها باBL ها را قبل از رشته ها باید امتحان کنیم؟
در حقیقت شما باید هر سه را امتحان کنید و کدها را بررسی کنید . اما اینجا فقط اولین شعبه را امتحان می کینم، چون اصل قضیه هم، همونجا است.....................
اجازه بدید با اون یکی در .text:100057C4 شروع کنیم.روی BL sub_0_1000538C راست کلیک کرده وJump immediate را انتخاب کنید.کدهای زیر را خواهید دید:


text:1000538C ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦ .text:1000538C .text:1000538C sub_0_1000538C ; CODE XREF: sub_0_100003F8+480p .text:1000538C ; sub_0_100050CC+188p ... .text:1000538C STMFD SP!, {R4,LR} ; Store Block to Memory .text:10005390 SUB SP, SP, #8 ; Rd = Op1 - Op2 .text:10005394 MOV R4, R0 ; Rd = Op2 .text:10005398 LDR R3, [R4,#0xF8] ; Load from Memory .text:1000539C CMP R3, #0 ; Set cond. codes on Op1 - Op2 .text:100053A0 BEQ loc_0_100053C4 ; Branch .text:100053A4 MOV R0, SP ; Rd = Op2 .text:100053A8 LDR R1, =dword_0_10007D64 ; Load from Memory .text:100053AC BL loc_0_10005B48 ; Branch with Link .text:100053B0 MOV R0, R4 ; Rd = Op2 .text:100053B4 MOV R1, SP ; Rd = Op2 .text:100053B8 BL loc_0_10005C48 ; Branch with Link .text:100053BC CMP R0, #0 ; Set cond. codes on Op1 - Op2 .text:100053C0 BNE loc_0_100053D0 ; Branch .text:100053C4 .text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j .text:100053C4 MOV R0, #0 ; Rd = Op2 .text:100053C8 B loc_0_100053EC ; Branch .text:100053C8 ; --------------------------------------------------------------------------- .text:100053CC off_0_100053CC DCD dword_0_10007D64 ; DATA XREF: sub_0_1000538C+1Cr .text:100053D0 ; --------------------------------------------------------------------------- .text:100053D0 .text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j .text:100053D0 MOV R0, R4 ; Rd = Op2 .text:100053D4 MOV R1, R4 ; Rd = Op2 .text:100053D8 BL sub_0_100050CC ; Branch with Link .text:100053DC LDR R3, [R4,#0xF8] ; Load from Memory .text:100053E0 CMP R0, R3 ; Set cond. codes on Op1 - Op2 .text:100053E4 MOVNE R0, #0 ; Rd = Op2 .text:100053E8 MOVEQ R0, #1 ; Rd = Op2 .text:100053EC .text:100053EC loc_0_100053EC ; CODE XREF: sub_0_1000538C+3Cj .text:100053EC ADD SP, SP, #8 ; Rd = Op1 + Op2 .text:100053F0 LDMFD SP!, {R4,LR} ; Load Block from Memory .text:100053F4 BX LR ; Branch to/from Thumb mode

این توابع ما است. اینجا است که برنامه می فهمد که برنامه ریجستر شده است یا نه. همچنین در این کدها کد XREF در خط اول وجود دارد که به این معنی است که این تابع می تواند یا بیشتر از یک بار فراخوانی می شود.حالا به خاطر بسپارید که صفر یعنی ریجستر نشده است و نابرابر با صفر یعنی ریجستر شده است.پس ببینیم چه زمانی عددی جز صفر در ریجستر R0 قرار می گیرد.پیداش کردید؟؟؟


.text:100053E8 MOVEQ R0, #1 ; move if equal

اگر دستورالعمل cmp قبل از حرکت ( Move ) برابر باشد، یک 1 در R0 قرار می گیرد. اما زمانی که صفر در R0 قرار گیرد، دو دستورالعمل خواهیم داشت:


text:100053C4 MOV R0, #0 ; move

.text:100053E4 MOVNE R0, #0 ; move if not equal

ما باید چکار کنیم حالا؟زمانی که به کدهای زیر توجه کنیم، متوجه می شوید که دو راه برای رسیدن به پایان وجود دارد.یکی در طول این مکان قرار دارد:


text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j

و دیگری اینجا قرار دارد:



text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j.

بر اساس runtime تصمیم گرفته می شود که کدام راه در پیش گرفته شود.راه دیگر همیشه برداشته می شود!!راه دیگری هم بهجز این دو وجود ندارد!!!!و ما نمی توانیم در مورد اینکه برنامه چکاری انجام می دهد تصمیم بگیریم.پس حالا نوبت فکرکردن است،فکر،فکر،فکر.................
ما نیازمند یک راه میانبر به پایان هستیم و همچنین باید 1 درR0 قرار گیرد. بیایید این کار را در این راه انجام دهیم:
تغییر

text:100053A0 BEQ loc_0_100053C4 ; Branch if equal

به

text:100053A0 B loc_0_100053C4 ; Branch always

که همان شعبه ای است که همیشه برداشته می شود،و
تغییر


text:100053C4 MOV R0, #0 ; R0 = 0

به



text:100053C4 MOV R0, #1 ; R0 = 1

پس آن 1 به ریجستر R0 منتقل ( Move ) می شود.ادامه کدها حالا بصورت زیر است:


.text:1000538C ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦

.text:1000538C .text:1000538C .text:1000538C sub_0_1000538C ; CODE XREF: sub_0_100003F8+480p .text:1000538C ; sub_0_100050C8+18Cp ... .text:1000538C STMFD SP!, {R4,LR} ; .text:10005390 SUB SP, SP, #8 ; .text:10005394 MOV R4, R0 ; .text:10005398 LDR R3, [R4,#0xF8] ; .text:1000539C CMP R3, #0 ; .text:100053A0 B loc_0_100053C4 ; Branch always <<<<<<< Changed .text:100053A4 ; --------------------------------------------------------------------------- .text:100053A4 MOV R0, SP ; .............All .text:100053A8 LDR R1, =dword_0_10007D64 ; .......these .text:100053AC BL loc_0_10005B48 ; .............instructions .text:100053B0 MOV R0, R4 ; .............are .text:100053B4 MOV R1, SP ; .............never .text:100053B8 BL loc_0_10005C48 ; .............executed!!! .text:100053BC CMP R0, #0 ; ............. .text:100053C0 BNE loc_0_100053D0 ; ............. .text:100053C4 .text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j .text:100053C4 MOV R0, #1 ; move R0 = 1 <<<<<<<< Changed .text:100053C8 B loc_0_100053EC ; .text:100053C8 ; --------------------------------------------------------------------------- .text:100053CC off_0_100053CC DCD dword_0_10007D64 ; DATA XREF: sub_0_1000538C+1Cr .text:100053D0 ; --------------------------------------------------------------------------- .text:100053D0 .text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j .text:100053D0 MOV R0, R4 ; ............. .text:100053D4 MOV R1, R4 ; ............. .text:100053D8 BL loc_0_100050CC ; .............These .text:100053DC LDR R3, [R4,#0xF8] ; .............also! .text:100053E0 CMP R0, R3 ; ............. .text:100053E4 MOVNE R0, #0 ; ............. .text:100053E8 MOVEQ R0, #1 ; ............. .text:100053EC .text:100053EC loc_0_100053EC ; CODE XREF: sub_0_1000538C+3Cj .text:100053EC ADD SP, SP, #8 ; .text:100053F0 LDMFD SP!, {R4,LR} ; .text:100053F4 BX LR ; back

ما حالا به اتمام کارمان نزدیک شده ایم.ما تصمیم گرفته ایم که چه چیزی را عوض کنیم.حالا فواصل از این دو دستورالعمل را یادداشت می کنیم.اولین مورد ( branch ) در 0x541C و دومین ( Move ) در 0x5440 قرار دارد. به HexEditor بروید و به اولین فاصله بروید:



0000541C 07 00 00 0A ã.... <<< this is the branch if equal instruction

0A را به EA تغییر دهید



0000541C 07 00 00 EA ã...ê <<< this means branch always

دومین دستورالعمل که باید تغییر کنند


00005440 00 00 A0 E3 .. ã <<< move R0, 0

اولین 00 را به 01 تغییر دهید




00005440 01 00 A0 E3 .. ã <<< move R0, 1


بله، ما برنامه را کرک کردیم!!!!!!!!!!!!!
حالا این فایل تغییر داده شده را یا با MakeSIS به SIS برگردانده و یا فایل stacker.app را بصورت دستی با یک برنامه مدیریت فایل به شاخه موردنظر کپی کنید تا برنامه بصورت کامل کرک شود.
به آن آسانی که من و شما فکر می کردیم،نبود؟؟خودمم یه کم جا خوردم که چرا مطلب اینقدر طولانی شد!!!
امیدوارم همه مطلب رو متوجه شده باشید..............

AmIr NiKoOnAm
29-07-2006, 16:54
لینک دریافت پست بالا بصورت PDF (http://d.turboupload.com/d/786865/001-pdf-crack_stacker.pdf.html)

Arash66
29-07-2006, 17:57
ببخشيد آقا امير ما تو كار هك نيستيم....!

benali
07-08-2006, 13:34
سلام
من علاقمند به يادگيري هستم لينك هاي گفته شده در صفحه اول دانلود نميشوند انگار سايت مورد نظر فعال نمي باشد ممنون ميشم اصلاح بفرمائيد باز هم تشكر از شما و زحماتتون

sirvaan
09-08-2006, 17:02
متاسفانه آپلودسنتر سایت .......... فعلاً کار نمیکنه..........تمامی برنامه های معرفی شده به راحتی قابل داونلود کردن هستن.........و به زودی در یه سرور جدید آپ می کنم فقط برنامه Ida دارای حجم بالایی است که من نمی تونم اون رو براتون آپ کنم..........ولی یه لینک براتون حتما جور می کنم

sirvaan
09-08-2006, 17:31
UnMakeSISv0.2b.zip

http://d.turboupload.com/d/860701/UnMakeSISv0.2b.zip.html
************************************************** **************
Makesis_v1.0.zip

http://d.turboupload.com/d/860717/Makesis_v1.0.zip.html
************************************************** *************
DataRescue.IDA.Pro.v4.8.0.847.Advanced-SSG.exe (31695 KB)

http://rapidshare.de/files/3832240/D...d-SSG.exe.html

Password: www.appzworld.com
************************************************** ***************
winhex_full__130.zip

http://d.turboupload.com/d/860745/winhex_full__130.zip.html
************************************************** **************

Hosein_824
13-08-2006, 01:23
amir joon be khoda man dare geryam migireh
harja ke negah mikonam neveshti daram miram
akhe chera?
age to beri dige ki baraye man(ma) post haye be in khafani mizareh
to ro khda age mitooni ye karish bokon
chon age beri site ham rafteh

az in matlabe khafan ham kheyli kheyli mamnoon
be omide khoda mizanam too karsh
chon khdam ham ye programmer hastam
saei mikonam javabe zahamateto bedam
hamishe movafagh bashi

sirvaan
13-08-2006, 14:59
گویا اون لینک برنامه ی IDA پاک شده

از اینجا داونلود کنید


http://www.datarescue.com/idabase/pix/idalarge.gif

http://rapidshare.de/files/1600789/sdid48wa.zip.html
http://rapidshare.de/files/1600822/sdid48wb.zip.html
http://rapidshare.de/files/1600893/sdid48wc.zip.html
http://rapidshare.de/files/1600933/sdid48wd.zip.html
http://rapidshare.de/files/1600989/sdid48we.zip.html
http://rapidshare.de/files/1601110/sdid48wf.zip.html
http://rapidshare.de/files/1601125/sdid48wg.zip.html
http://rapidshare.de/files/1601181/sdid48wh.zip.html
http://rapidshare.de/files/1601195/sdid48wi.zip.html
http://rapidshare.de/files/1601224/sdid48wj.zip.htm

borteh
20-12-2006, 22:52
امیر جان طبق معمول عالی بود .... دمت گرم

دوستانی هم که به اینکار میگن Hack کاملا" غلط هستش ! چون اصلا" هک یه چیز دیگه س ! کرک یعنی مهندسی معکوس ! یعنی از یه فایل اجرایی بری به سورس برسی ... تغییراتی که دوست داری رو بدی و دوباره کامپایل کنی که ابزار و توضیحات همه این کارارو امیرجان لطف کردن برامون نوشتن !

یه سری هم نرم افزار دست من هست که باید وقت کنم پیدا کنم از سیستمم و بیارم بحث کنیم ببینیم میشه با اونا کاری کرد یا نه ...

رهحال ممنون.

borteh
20-12-2006, 23:22
با درود بي پایان
من از اعضاء جدید هستم ولی وقتی مطالب شما رو خوندم خیلی لذت بردم، یه زحمت براتون دارم و اونم اینه که اگر براتون مقدوره حتما با من تماس بگیرید چون به هوش و ذکاوت شما تویه اروپا بیشتر از ایران نیازه.
بقول معروف قدر زر زرگر شناسد و....... نه اینکه اینا زرگرند یا قدر شما رو بهتر میدونن، خیر0
متاسفانه امکانات حال حاضر دنیا در اینطرف جمع شده و شناگر اگر در یک استخر با عمق 10سانتی متر بماند شنا را فراموش میکند، چه بهتر در عمقی شیرجه بزند که بتواند براحتی مانور نماید0
با آرزویه موفقیت
بابک - babak22222 in yahoo


آقا فوری بازارگرمی راه نندازین مغزارم فراری ندین !
گور پدر اروپا !

امیر و خیلی کسای دیگه جایی تو این مملکت دارن و اگه ماها که اینهمه ادعامون میشه باهم جمع شیم خیلی کارا میتونیم تو همین مملکت بکنیم ! خیلی کارایی که هم واسه خودمون نفع داشته باشه هم واسه ملت و مملکت !

مثال شما هم اشتباه هست ! شناگر اگر شناگر باشه تو همون 10 سانت هم تلاش خودشو می کنه نمیگم بتونه شناشو حفظ کنه ! تلاش میکنه شنارو فراموش نکنه !
نه اینکه تو عمق کم براحتی مانور بده ! اینکه تو عمق کم مانور هاشو فراموش نکنه !

و مطمئا" باش دوست عزیزم عمق آب هیچوقت 10 سانت نخواهد ماند ! چون اگه من ببینم یه تیزهوش با ذکاوت مونده تو بقول شما عمق 10 سانت، خودم میام با تمام جانفشانی آب استخر رو پر هم نکنم لااقل 20 سانتش می کنم !

پس امیر نیکونام ، آرش عزیز یا هر دوست دیگه ای که خودش پیش خودش به این رسیده که میدونه، کم هم بدونه بیشتر از خیلی های دیگه میدونه و میدونه که کم هم نمیدونه !

نگفتم این مملکت بهشته ! نگفتم اینجا آمریکاس ! ... ماها اگه ما باشیم ! من اگه آرمان برته باشم، امیرمون اگه امیر نیکونام باشه و خیلیای دیگه اگه خودشون باشن میتونیم و با ایمان قلبی میگم میتونیم یه گوشه از این جهنمی رو که دوستان زیادی بخاطرش سختیای زیادی تحمل کردن و از مملکتمون فراری شدن، رو نمیگم بکنیم بهشت ! ولی میتونیم طوری کنیم که خیلی از این جهنم بهتر باشه !

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

فکرم نکنین آمریکا یا اروپا ریختن ! آمریکا عموی خود من کارگره ! ساعتی 9 دلار پول میگیره ! روزی میشه 72 دلار ماهی میشه 2460 دلار ! که با این داره کیف زندگیشو میکنه ! آره عزیزم .. اونجا کارگر راحته ! اونجا کسی که تو ایران تو صنعتی شریف فوق لیسانس متالوژی گرفت و با معدل الف 19.20 فارغ التحصیل شد و دعوتنامه از دانشگاه MIT براش اومد، رفت و الان داره کیف میکنه که بدون دغدعه ام ! قرض ندارم ! کسی باهام کاری نداره شخصیت دارم ! ولی اون عموی من هیچ موقع نفهمید که چه چیزی رو از دست داد که رفت با اون آرامش رسید ....

شرمنده من پرچونگی کردم.


این مدیران هم لطف کنن بغل این دگمه تشکر یه چند تا فحش هم بذارن واسه مقاصد بعدی! چون داشتم فکر می کردم بعد اینکه مردم اینو خوندن فحش میدن و دگمه تشکر فقط هست !! یکم ناجوره !

amin_pro
30-12-2006, 16:12
سلام . خیلی از مطالبتون متشکرم . در ضمن من هم کرکر هستم و از این نحوه کرک خوشم اومد . اونهایی هم که بلد نیستند اول برن کرک معمولی یاد بگیرن بعد بیان arm یاد بگیرن . راستی اگه افتخار بدید من دارم یه پروژه بزرگ رو سر گروهی می کنم و می خوام کسایی که واردن بیان کمک . اگر خواستید با میل من تماس بگیرید :
amin.cccx[at]gmail[dot]com

sirvaan
14-03-2007, 10:00
\

آموزش نحوه کرک Cellpoker v1.02


ابزارها :
-IDA Pro v4.04 or higher
-Hex Editor که من WinHex رو ترجیح می دم

هدف :

Cellpoker

این بازی یک بازی چندنفره Poker است که بوسیله بلوث می توان آ ن رابازی کرد امکان تکی بازی کردن هم وجود دارد

نیازمندیها :

-مقداری دانش در ارتباط با معکوس کردن برنامه های PC/Windows ...........
-نحوه استفاده Hex Editor و چگونگی انتقال فایلها بین گوشی و کامپیوتر
-خواندن مطالب قبلی

مقدمه :

علت انتخاب این برنامه این است که یک بازی خوب محسوب می شود و هدف آسانی برای کرک شدن نیست!!!

وحالا شروع می کنیم :

ابتدا برنامه کرک نشده را در گوشی نصب و اجرا کنید. به همه چیز خوب دقت کنید و همه ی منوها را امتحان کنید سپس ...
فایل poker.app را توسط برنامه ی Hex Editor باز کنید و به اعداد پیچیده و حروف ascii نگاه کنید. در خط اول در
آفست (offset) 0x10 شما عبارت "EPOC" را خواهید یافت که به این معنا است که این یک فایل EPOC است که برای استفاده در سیستم عامل سیمبیان بکار می رود.
برید پایین تا تعدادی رشته های تقریباً قابل خواندن در بین فواصل 0x1B0C0 و 0x1CA70 بیابیید.این حروف اگر دقت کنید همان عباراتی هستند که در بازی دیده اید. حالا نگاه دقیقتری به آفست 01C934 می اندازیم:


01C920 ····w·i·n···w·i·n···C·e·l·l·P·o ·k·e·r· ·d·e·m·o·:···D·a·y·s· ·l. 01C960 e·f·t· ·····N·o· ·s·a·v·e·d· ·g·a·m·e···C·e·l·l·P·o·k·e·r· ·d·e. 01C9A0 m·o·············7·······mr· ?············.·······C·:·\·s ·y·s·t·e.
بله.........این همان عباراتی است که هنگام آغاز برنامه در گوشی نمایش داده می شود.
این آفست ها را یادداشت کنید و برنامه ی IDA را باز کنید.........
حالا برنامه ی IDA کدهای دستورالعملی ARM دیسمبل شده را نمایش می دهد. شما می توانید در مسیر Options/General گزینه ی Auto Comments را برای درک بهتر کدها روشن کنید......
برای کسانی که با برنامه ی IDA اشنا نیستند باید گفت که درstatus line در پایین آفست ها نشان داده می شود.حالا در کدهاآفست های یادداشت شده در مرحله ی قیل را پیدا کنید.برنامه IDA این پیغام را نشان می دهد :



.text:1001C8B8 dword_0_1001C8B8 DCD 0x650043, 0x6C006C, 0x6F0050, 0x65006B, 0x200072, 0x650064
.text:1001C8B8 ; DATA XREF: sub_0_1000EC6C+148o
.text:1001C8B8 DCD 0x6F006D, 0x3A

حالا بروی یک عدد راست کلیک کرده و Undefine را انتخاب کنید تا کدها بصورت زیر مرتب شود :



.text:1001C8B8 unk_0_1001C8B8 DCB 0x43 ; C ; DATA XREF: sub_0_1000EC6C+148o
.text:1001C8B9 DCB 0 ;
DCB 0x65 ; e
.text:1001C8BB DCB 0 ;
text:1001C8BC DCB 0x6C ; l
.text:1001C8BD DCB 0 ;
.text:1001C8BE DCB 0x6C ; l
.text:1001C8BF DCB 0 ;
.text:1001C8C0 DCB 0x50 ; P
.text:1001C8C1 DCB 0 ;
.text:1001C8C2 DCB 0x6F ; o
.text:1001C8C3 DCB 0 ;
.text:1001C8C4 DCB 0x6B ; k
.text:1001C8C5 DCB 0 ;
.text:1001C8C6 DCB 0x65 ; e
.text:1001C8C7 DCB 0 ;
.text:1001C8C8 DCB 0x72 ; r
.text:1001C8C9 DCB 0 ;
.text:1001C8CA DCB 0x20 ;
.text:1001C8CB DCB 0 ;
.text:1001C8CC DCB 0x64 ; d
.text:1001C8CD DCB 0 ;
.text:1001C8CE DCB 0x65 ; e
.text:1001C8CF DCB 0 ;
DCB 0x6D ;

.text:1001C8D1 DCB 0 ;
.text:1001C8D2 DCB 0x6F ; o
.text:1001C8D3 DCB 0 ;
.text:1001C8D4 DCB 0x3A ; :
.text:1001C8D5 DCB 0 ;
.text:1001C8D6 DCB 0 ;
.text:1001C8D7 DCB 0 ;
...............................................(sh ortend)
بله این همان رشته های نمایش داده شده در Hex Editor می باشد. حالا ما می خواهیم بدانیم که این رشته ها کی در برنامه نشان داده می شود. پس بروی "DATA XREF: sub_0_1000EC6C+148o" راست کلیک کرده و Jump to cross reference را انتخاب کنید و OK را کلیک کنید . شما به اینجا می روید :



text:1000EDB4 off_0_1000EDB4 DCD loc_0_1001C8B8 ; DATA XREF: sub_0_1000EC6C+BCr
دوباره این کار انجام دهید . روی "DATA XREF: sub_0_1000EC6C+BCr" راست کلیک کرده و Jump to cross
Reference را انتخاب و OK را کلیک کنید . بالاخره شما به اینجا می رسید :



.text:1000ED28 LDR R1, =loc_0_1001C8B8 ; Load from MemoryLDR
یک دستورالعمل برای بازخوانی رشته از حافظه است . این رشته بعداً نمایش داده می شود. ولی ما نمی خواهیم این رشته نمایش داده شود چون شدیداً آزاردهنده است !!!!!!
پس کمی بالا می رویم و به کده نگاه می کنیم .



.text:1000EC6C sub_0_1000EC6C ; CODE XREF: sub_0_1000EBF8+64p
.text:1000EC6C STMFD SP!, {R4-R7,LR} ; Store Block to Memory
.text:1000EC70 SUB SP, SP, #0xC0 ; Rd = Op1 - Op2
.text:1000EC74 MOV R6, R0 ; Rd = Op2
text:1000EC78 LDR R0, [R6,#0x17C] ; Load from Memory
<<<<<<<<<<.text:1000EC7C CMP R0, #0 ; Set cond. codes on Op1 - Op2
5..text:1000EC80 LDRNE R3, [R0] ; Load from Memory
.text:1000EC84 MOVNE R1, #3 ; Rd = Op2
.text:1000EC88 LDRNE R12, [R3,#8] ; Load from Memory
.text:1000EC8C MOVNE LR, PC ; Rd = Op2
.text:1000EC90 TEQNEP PC, R12,LSL PC ; Set cond. codes on Op1 ^ Op2
.text:1000EC94 MOV R5, #0 ; Rd = Op2
.text:1000EC98 STR R5, [R6,#0x17C] ; Store to Memory
.text:1000EC9C ADD R7, R6, #0x180 ; Rd = Op1 + Op2
.text:1000ECA0 MOV R0, #0x88 ; Rd = Op2
.text:1000ECA4 BL loc_0_100164D8 ; Branch with Link
.text:1000ECA8 SUBS R4, R0, #0 ; Rd = Op1 - Op2
<<<<<<<<<<.text:1000ECAC BEQ loc_0_1000ECFC ; Branch
آنچه که ما بدنبالش هستیم مقایسه های "CMP" است . وهمچنین مقایسه ی تاریخ امروز با تاریخ انقضای برنامه و BEQ/BNE
....شعبات اضافی. (BEQ/BNE/BHI/B... مانند رمزالعمل های (opcode ) کامپیوتر هستند )
این کدها با علامت <<<<<<<<<< مشخص شده اند. برنامه حالت انقضای خود را تست کرده و اگر حالت انقضایش پیش آمده باشد رشته ی "Cell Poker: Days Left XX" را نمایش می دهد.
آنچه که ما باید برای کرک برنامه انجام دهیم این است که شعبات (branches ) را بگونه ای اصلاح کنیم که برنامه بتواند بیشتر موعد انقضایش کار کند..........
اکنون سوال اساسی این است :
کدام یک از شعبه ها قبل از رشته امتحان می گردد ؟
برای این کار شما باید تمامی شعبه ها را امتحان کنید.
برای اهداف ای آموزش من به شما چگونگی تغییر یکی از اینها و تست کردنش را نشان خواهم داد.....
خب حالا بیایید با یکی از اینها در .text:1000ECAC شروع کنیم . حالا آفست دستورالعمل های BEQ را یادداشت کنید. اینو باید یادداشت کنید : 0xED28 .
حالا IDA را بدون ذخیره کردن چیزی ببندید و سپس در برنامه ی Hex Editor به اولین آفست نگاه کنید :



0000ED28 12 00 00 0A ?.... <<< this is the branch if equal instruction

حالا 0A را به EA تغییر دهید



0000ED28 12 00 00 EA ?...ê <<< this means branch always
ذخیره کرده و با برنامه IDA دوباره فایل رو باز کنید و متوجه می شوید که BEQ تان به یک B تغییر کرده است. حالا فایل تغییر یافته ی POKER.APP را به داخل گوشی انتقال داده و برنامه را تست کنید.حالا برنامه کار می کنه ؟ نه!!!!!
پس فایل اصلی را دوباره سرجاش بزارید.
بعد از تست کردن یک جفت شعبه باز به جایی نرسیدیم......یعنی همه چیز خراب شد.........
حالا نا امید نشید و بزارید با کدها بیشتر درگیر بشیم در بالای یک قطعه کد که متن "CellPoker Demo:" را نشان می دهد یک "XREF" وجود دارد :



<<<<<< .text:1000ECFC loc_0_1000ECFC ; CODE XREF: sub_0_1000EC6C+40j
.
.
.
.
.
.text:1000ED28 LDR R1, =dword_0_1001C8B8 ; Load from Memory

بروی "CODE XREF: sub_0_1000EC6C+40j" راست کلیک کرده و Jump to cross reference را انتخاب و OK را کلیک کنید.شما به اینجا می رسید :



.text:1000ECAC BEQ loc_0_1000ECFC ; Branch

این همان است که قبلاً تغییر دادیم . پس باید یکی دیگر را انتخاب کنیم .پس برید بالای آن بلوک متنی تا XREF را بیابید :



text:1000EC6C sub_0_1000EC6C ; CODE XREF: sub_0_1000EBF8+64p

دوباره بروی عبارت "CODE XREF: ......" راست کلیک کرده و کرده و Jump to cross reference را انتخاب و OK را کلیک کنید. شما به اینجا می رسید :


.
text:1000EC5C BL sub_0_1000EC6C ; Branch with Link

حالا همچنان باید تست بکنیم ( تغییر "BL" به "B" یا "NOP" ) تا اتفاقی بیافتد.
بعد از پنج بار Xref jumps و تغییر کدها آن پیغام از بین می رود !!!!!


.
text:1000EAE8 BL sub_0_1000EBF8 ; Branch with Link

تموم شد یعنی ؟؟؟ نه!!!!!!!!!! با وجود اینکه پیغام انقضاء از بین رفت ولی هنوز برنامه بعد از 10 روز منقضی می شود.خب حالا باید به کدها دوباره نگاه کنیم.بیاد بیاورید که بعد از پنج بار NOP کردن XREF آن پیغام حذف شد......به کدهای چند خط بالاتر نگاه کنید :




<<<<<<.text:1000EADC CMP R0, #9 ; Set cond. codes on Op1 - Op2
<<<<<.text:1000EAE0 BHI loc_0_1000EB44 ; Branch
.text:1000EAE4 MOV R0, R6 ; Rd = Op2
.text:1000EAE8 BL sub_0_1000EBF8 ; Branch with Link
چرا برنامه عبارت R0 = 9 را تست می کنید؟ بله درسته . بعد از ده روز ( 0 = DAY1 , 9 = DAY10 ) اگر شعبه بیشتر از 9 روز بود برنامه از کار میافتد.
خب حالا بیایید کار را تمام کنیم .آفست EB5C را یادداشت کنید .برنامه IDA را بدون ذخیره بسته و سپس در برنامه Hex Editor به اولین آفست نگاه کنید.



0000EB5C 17 00 00 8A ?.... <<< this is the branch if higher instruction

را به کد زیر تغییر دهید :



0000EB5c 12 00 00 EA<<< this means mov r0,r0 or NOP


کار تمام شد. فایل تغییر داده شده poker.app را به گوشی انتقال داده و از بازی بدون محدودیت و پیغام لذت ببرید.

Amin_Eman
29-04-2007, 05:36
پست های اضافه حذف و تاپیک قفل شد!