سلام،
بایت کدهای j2ME زیرمجموعه ای از j2SE هستند بنابراین می تونید از ابزارهای Decompile در J2SE برای این کار استفاده کنید. بهترین decompiler رایگان موجود JAD هست. یک ورژن اون با نام DJ Java Decompiler پوسته ی گرافیکی براش قرار داده و یک مرحله تصحیح کد هم روی سورس حاصل انجام می ده. البته پولی هست و ک ر ک هم اینجا پیدا می کنید. وقتی کدی رو Decompile می کنید ممکن هست که کاملا درست نباشه که عموما شامل دستورهای goto، لیبل ها، break و exception ها می شه. در واقع این ها قسمت هایی از کد هستند که obfuscate شدن و برنامه نتونسته به فرم استاندارد برشون گردونه.
برای رهایی از این مشکل چند تا راه پیشنهاد می کنم:
1- فقط کلاس هایی که لازم دارید رو Decompile کنید و بعد jar فایل که حاوی فایل .class بقیه ی فایل ها هست رو به پروژه تون اضافه کنید.
2- اگر می خوایین فارسی سازی کنید و ... فقط کافی هست رفتار چندتا تابع رو عوض کنید، مثلا به جای Graphics.drawString تابع drawBitMapFont بذارید که خودتون ساختید. در این موارد از function mapping استفاده کنید که ابزارهایی برای این کار هستند.
3- اگر این قسمت های مشکل دار کد رو بخونید بعد از کمی کار می تونید خودتون به فرم استاندارد تبدیلشون کنید.
دیروز 2 تا برنامه رو ک ر ک کردم:
mGaurd که یک نرم افزار free هست و key رو هم خودش می ده! سیستم کدگذاریش بسیار ساده بود و مشکل اساسی که داشت که خودش درون خودش key رو می ساخت و با مقداری که کاربر بهش داده بود مقایسه می کرد، خوب منم فقط اون تابع رو برداشتم اوردم بیرون که کلید درست کنه اینجا می تونید سورس تابعش رو ببینید. این تابع مثال خوبی هست که چه جوری از IMEI کد فعال سازی درست کنیم.
TinyLine2D یک لایبرری برای کارهای گرافیکی موبایل استفاده می شه. پیچیدگی های خیلی زیادی داشت ولی قسمت زیادیش مربوط به Hash کردن دیتایی می شد که اصلا ربطی به کد ورودی نداشت و نتیجه این کار یک رشته ای از اعداد می شد که همواره یکی بود. و بعد این رشته رو با کدی که شما داده بودید XOR می کرد و یک جوری مخلوطشون می کرد و در نهایت اگر حاصل 0 می شد یعنی key درست هست و در غیر این صورت غلط بود. نکته ی مثبتی که داشت این بود که هیچ جایی از برنامه به دست خودش کد صحیح رو درست نکرد و این باعث می شد که درست کردن k e y G e n براش سخت بشه ولی تشخیص درستی و غلطی کد چون به مقدار نهایی بستگی داشت خیلی راحت ک. ر. ک می شد. لایبرری ک ر ک شده + سورس کد TinyLine2D.java بعد ازکامنت گذاری هم براتون گذاشتم در این ورژن برای اینکه کد فعال سازی رو بدید دیگه لازم نیست تابع init رو صدا کنید و watermark هم دیگه چاپ نمی شه.
و اگر می خوایین برای برنامه تون قفل بذارید:
1 - چون می خوایین از برای هر گوشی یک کد مستقل وجود داشته باشه پس باید کارتون رو از IMEI گوشی شروع کنید.
2- این کد رو خوب hash(پخش) که مثلا اگر IMEI یه رقم عوض شد مقدار key تون کلی عوض بشه(XOR موجود دوست داشتنی هست!)
3- هیچ وقت درون برنامه تون کلید رو درست نکنید چون خیلی راحت براش k e y G e n می نویسن(مثل مثال اول) و ک. ر. ک کردنش خیلی راحت هست.
4- از قوائدهای خاص ریاضی استفاده کنید، مثلا جمع دو تاعدد فرد می شه یه عدد زوج، می شه که جمع دو تا عدد مثبت بشه منفی(تو کامپیوتر می شه.)، یا اگر یک عدد رو دو بار با یه چیزی XOR کنی می شه خودش یا خواص اعداد اول. این ها باعث می شن ک. ر. ک ر نتونه از روند تایید یا رد کد فعال سازی سر در بیاره.
5- اگر فقط از IMEI استفاده کنید تقریبا در 5 دقیقه ک. ر. ک می شید (مثل نرم افزارهای پارس آسان افزار!) شیوه ی کار هم اینه که اگر شما کد فعال سازی برای IMEI گوشی A رو بدونید، کافی تا تابعی که IMEI رو بر می گردونه رو عوض کنید که همیشه A بر گردونه. جالب بدونید چنین بلایی سر Windows Vista هم اومد. برای جلوگیری از این کار از متغییرهای تصادفی مثل زمان و اعداد random برای hashing استفاده کنید.البته به این سادگی که گفتم نیست.
6- به جای parameter passing های معمول در توابع مربوط به تایید کد فعال سازی از Class member variables استفاده کنید، مثلا تمام متغییرهای حساس به کلید رو در یک کلاس نگه داری کنید و بقیه ی توابع در همه ی کلاس ها بطور مستقیم بخوننشون. اینجوری رد گیری استفاده از این متغییرها در کلاس های دیگه خیلی سخت تر می شه.
7- مواظب چیزی که در RecordStore ذخیره می کنید باشید. چون همه می دونن که این تنها منبع ممکن هست که شما در بارهای بعدی می فهمید که کد فعال سازی قبلا وارد شده و مستقیم وارد برنامه می شید. پس چیزی که اونجا می می نویسید حتی اگر یک کد پیچیده ولی مستقل از IMEI گوشی باشه اگر من اول برنامه 2 خط اضافه کنم که این مقدار رو تو RecordStore بنویسه خوب همه گی خوشحال می شیم.
در هر حال ک. ر. ک کردن کد گوشی خیلی سخت نیست بنابراین بهتره:
8- محدودیت ایجاد کنید: مثلا فایل jar رو در اختیار کسایی قرار بدید که نرم افزار رو خریدن حتی بهتره به اون ها هم ندید مثلا براش نصب کنید و بگید هر وقت خواستی بیا دوباره برات نصب کنم مثل روش های دانلود با GPRS و نصب مستقیم.
9- آپدیت کنید: ایران خودرو بازی در نیارید! هر چند وقت یک بار ورژن جدید درست کنید و به بازار بدید این کار باعث می شه ک ر ک ر ها فرصت کمتری داشته باشن و چون همیشه شما یک قدم جلوترید با وجود ورژن ک ر ک شده کاربران ورژن جدید رو از شما می خرن.
10- نرم افزار Free بدید: راه های زیادی برای کسب در آمد از یک نرم افزار Free و پرکاربرد وجود داره.
موفق باشید.