# Native Code > برنامه نویسی موبایل > Android Studio >  آیا راهی هست که سرور شخصی من فقط با اپلیکیشن من اطلاعات رد و بدل کنه؟

## mamadlooloo

درود بر همه دوستان

خواهش میکنم اگر مطلبی در این مورد می دونید راهنمایی کنید.

من یه بازی ساختم که در اون میشه امتیاز کسب کرد و این امتیاز رو ارسال کرد به سرور .

مثلا شما امتیاز 100 رو آوردید و میخواید اون رو در جدول رکورد داران ثبت کنید.

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

خواهش میکنم راهنمایی کنید.

سپاس.

----------


## saeidpsl

با سلام آدرس سایتت رو کد کن

----------


## mamadlooloo

دوست گرامی یه خورده بیشتر توضیح بدید.
منظورتون استفاده از C++‎ هست؟

----------


## mamadlooloo

دوست گرامی یه خورده بیشتر توضیح بدید.
منظورتون استفاده از C++‎‎‎ هست؟

----------


## saeidpsl

کد کردن با ++C
http://www.mediafire.com/file/4mimnh...Decryption.rar
کد کردن با  *Zelix KlassMaster 5.5*
https://barnamenevis.org/showthread.p...=1#post2059636

----------


## saeidpsl

تو سایت stackoverflow.com یکی اینو گفته بود
We have design a ".so" file for security regarding in RESTAPI ".so" file  is native compiled file by android NDK. We have design a auth_key which is generate by ".so" file according user  "email" and "password". It's generate 265 digit key for authorization.  Means user is valid or not. and also this same algorithm is also apply  on server side to get original data from the key. I have see 99% payment  gateway is also used our own algorithm for generating auth_key in ".so"  means native file. Because any hacker cann't possible to reverse  Engineer this file to get original Algorithm code to generate auth_key
لینکش

----------


## saeidpsl

اگه با json کار میکنی بهتره از کتابخونه Gson استفاده کنی.

----------


## Nevercom

حتی اگه تو کدها هم آدرس API رو به شکلی مخفی کنید، میشه با اسنیف کردن پکت های خروجی اطلاعات ارسالی برنامه شما رو دید. مخفی کردن آدرس به هر شکلی در کدها ممکنه 2 ساعت از وقت شما رو بگیره برای پیاده سازیش، اما 30 ثانیه هم از وقت کسی که بخواد Network Call های برنامه ی شما رو ببینه، رو نمیگیره.

واقعیت این هست که هر کسی میتونه به سمت سرور شما درخواست ارسال کنه، و هر پارامتری هم که تعیین کنید قابل شبیه سازی هست.

در عوض باید API رو به شکلی تغییر بدید که امتیاز ها رو سمت سرور بر اساس مجموعه ای از پارامتر ها محاسبه کنید و محدودیت های منطقی ای بزارید تا کسب امتیاز غیر منطقی و عجیب صورت نگیره (و طرف تقلب نکنه)، و شاید اگر تقلب صورت گرفت (یعنی این محدودیت ها رو هم دور زد، شناسایی بشه) Banش کنید.

قانون کلی نوشتن API این هست که هیچوقت به کلاینت اعتماد نکنید، بعضی وقتا رعایت این مورد و جلوگیری از تقلب ساده هست و بعضی وقتا پیچیدگی بیشتری داره، اما وقتی این موضوع رو مدنظر قرار بدید میتونید کل فرآیند رو به شکلی تغییر بدید که امکان تقلب رو خیلی سخت تر کنید.

این رو هم یه نگاهی بندازید بد نیست: https://android-developers.googleblo...ing-block.html

----------


## mamadlooloo

> حتی اگه تو کدها هم آدرس API رو به شکلی مخفی کنید، میشه با اسنیف کردن پکت های خروجی اطلاعات ارسالی برنامه شما رو دید. مخفی کردن آدرس به هر شکلی در کدها ممکنه 2 ساعت از وقت شما رو بگیره برای پیاده سازیش، اما 30 ثانیه هم از وقت کسی که بخواد Network Call های برنامه ی شما رو ببینه، رو نمیگیره.
> 
> واقعیت این هست که هر کسی میتونه به سمت سرور شما درخواست ارسال کنه، و هر پارامتری هم که تعیین کنید قابل شبیه سازی هست.
> 
> در عوض باید API رو به شکلی تغییر بدید که امتیاز ها رو سمت سرور بر اساس مجموعه ای از پارامتر ها محاسبه کنید و محدودیت های منطقی ای بزارید تا کسب امتیاز غیر منطقی و عجیب صورت نگیره (و طرف تقلب نکنه)، و شاید اگر تقلب صورت گرفت (یعنی این محدودیت ها رو هم دور زد، شناسایی بشه) Banش کنید.
> 
> قانون کلی نوشتن API این هست که هیچوقت به کلاینت اعتماد نکنید، بعضی وقتا رعایت این مورد و جلوگیری از تقلب ساده هست و بعضی وقتا پیچیدگی بیشتری داره، اما وقتی این موضوع رو مدنظر قرار بدید میتونید کل فرآیند رو به شکلی تغییر بدید که امکان تقلب رو خیلی سخت تر کنید.
> 
> این رو هم یه نگاهی بندازید بد نیست: https://android-developers.googleblo...ing-block.html


سپاس از شما دوست گرامی

یه مشکلی هست، اون هم اینکه : در مستندات این منبعی که معرفی کردید ، نوشته باید از Google Api استفاده کنید.

Please use the Google Developers Console https://console.developers.google.com 
 to create a project, enable the Android Device Verification API, generate an API key
and add it here.

private static final String URL = "https://www.googleapis.com/androidcheck/v1/attestations/verify?key=" + API_KEY

برای استفاده از این API فکر میکنم باید اپلیکیشن رو روی Google Play منتشر کنم.
کافه بازار خودمون همچین چیزی نداره؟

----------


## mamadlooloo

> اگه با json کار میکنی بهتره از کتابخونه Gson استفاده کنی.


سپاس از راهنمایی شما.

----------


## mamadlooloo

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

----------


## saeidpsl

مثلا بانک صادرات از برنامه مثل *Zelix KlassMaster 5.5* استفاده کرده آدرس وب سرویسش کد شده 

دنیای خطرناکی شده

----------


## mamadlooloo

> مثلا بانک صادرات از برنامه مثل *Zelix KlassMaster 5.5* استفاده کرده آدرس وب سرویسش کد شده


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

اگه اینطور باشه که دوستمون گفتن ، آیا کد کردن آدرس سرور معنی داره؟

----------


## Nevercom

> سپاس از شما دوست گرامی
> 
> یه مشکلی هست، اون هم اینکه : در مستندات این منبعی که معرفی کردید ، نوشته باید از Google Api استفاده کنید.
> 
> Please use the Google Developers Console https://console.developers.google.com 
>  to create a project, enable the Android Device Verification API, generate an API key
> and add it here.
> 
> private static final String URL = "https://www.googleapis.com/androidcheck/v1/attestations/verify?key=" + API_KEY
> ...


نه، هیچ محدودیتی در محل انتشار برنامه ندارید. تا جایی که خاطرم هست ایرادش اینه که کاملاً رایگان نیست و در حالت رایگان تعداد API Request های محدودی دارید (روزانه 10٫000 درخواست)

البته من از این سرویس استفاده نکردم، اما چون تو بلاگ توسعه دهنده‌گان گوگل خونده بودم مطلب رو، معرفیش کردم.

----------


## saeidpsl

> یه خورده از نحوه کارش لطفا بگید.
> در بالا دوستمون Nevercom گفتن که :(" میشه با اسنیف کردن پکت های خروجی اطلاعات ارسالی برنامه شما رو دید. ")
> 
> اگه اینطور باشه که دوستمون گفتن ، آیا کد کردن آدرس سرور معنی داره؟


کد کردن آدرس سرور 50% کار رو سختر می کنه همه که بلد نیستن اسنیف کنن . _کار_ از _محکم‌کاری_ عیب نمی‌کند

----------


## mamadlooloo

دوستان php کارمون
دوستان هکر کلاه سفیدمون
دوستان باسوادمون
دوستان باتجربه

کسی ایده ای نداره؟ هیچی؟؟؟

----------


## maarek

خب میتونی از یه Token استفاده کنی که مثلا یه کدی هست که از طریق اس ام اس میاد یا یه هدر خاصی طراحی کن که فقط به درخواست هایی جواب بده که این هدر دارن...
یا اصلا ببین بقیه بازی ها چطوری کار میکنن یه کم تحلیل کن

----------


## saeidpsl

از اول همه ssl رو فعال کن دلیل



بعد میتونی داده کامل میفرستی رو کد کنی مثلا
این بدون کد کردنه
test.com/test.php?user=ali&pass=1234&score=1000
حالا ما همه دیتا رو کد میکنیم از یور بگیر تا اسکور اینجور میشه
test.com/test.php?data=4324dDFGDERESER3545FGHFGH
همچین چیزی مثل بالا درست میشه سمت اندروید
بعد سمت php باید بخش data رو از کد در بیاری
نتیجه این چیزی هست که بهت نشون میده
user=ali&pass=1234&score=1000
برای کد کردن سمت اندروید از  ++C استفاده کن که کسی نتونه کد تو decompile کنه همون الگوریتمی که برا کد کردن در ++c هست برا سمت سرور هم همون جور پیاده کن

یه روش دیگه مثلا الگوریتمی بنویس که طبق  ساعت و تاریخ  و یه  کد ایمنی همون وقت یه کد بهت بده بعد در سرور همین تکرار میشه میگه اگه کد ایمنی + زمان + تاریخ بشه مثلا =1234 هست اگه کد فرستاده شده سمت یوزر همین باشه اجازه ذخیر بهش بده .
*تاپیک جالبی شده .*

----------


## mamadlooloo

> یا اصلا ببین بقیه بازی ها چطوری کار میکنن یه کم تحلیل کن


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

----------


## saeidpsl

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


20 دقیقه کار داره !

----------


## mamadlooloo

> از اول همه ssl رو فعال کن
> 
> بعد میتونی داده کامل میفرستی رو کد کنی مثلا
> این بدون کد کردنه
> test.com/test.php?user=ali&pass=1234&score=1000
> حالا ما همه دیتا رو کد میکنیم از یور بگیر تا اسکور اینجور میشه
> test.com/test.php?data=4324dDFGDERESER3545FGHFGH
> همچین چیزی مثل بالا درست میشه سمت اندروید
> بعد سمت php باید بخش data رو از کد در بیاری
> ...


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

----------


## mamadlooloo

> 20 دقیقه کار داره !


شوربختانه دانش من در این مورد کم هست.
لطفا بیشتر توضیح بدید چطور؟

----------


## saeidpsl

کد رو مینویسم به زودی خعلی کار میشه کرد
مثلا 
test.com/test.php?data=4324dDFGDERESER3545FGHFGH
یه زمان تاریخ هم اضافه میکنی اینجوری
date=2017-07-30 15:20:40
وقتی میخوای دیتا به وب سرویس بفرستی یه تایم از سرور بگیره ممکنه زمان اندروید دست کاری شده اینجوری
test.com/time.php
اینجور چیزی 
بعد سمت سرور  time رو میگیری بعد مثلا  اگه زمان از 60 ثانیه بیشتر گذشته  اجازه ورود نده یعنی زمان ارسال شده و زمان خود سرور میسنجه اگه از 50 ثانیه یا هر زمانی که خودت میخوای بگزره اجازه ورود نده 
خعلی کارهای دیگه هم میشه کرد. :شیطان:

----------


## mamadlooloo

> کد رو مینویسم به زودی خعلی کار میشه کرد
> مثلا 
> test.com/test.php?data=4324dDFGDERESER3545FGHFGH
> یه زمان تاریخ هم اضافه میکنی اینجوری
> date=2017-07-30 15:20:40
> وقتی میخوای دیتا به وب سرویس بفرستی یه تایم از سرور بگیره ممکنه زمان اندروید دست کاری شده اینجوری
> test.com/time.php
> اینجور چیزی 
> بعد سمت سرور  time رو میگیری بعد مثلا  اگه زمان از 60 ثانیه بیشتر گذشته  اجازه ورود نده یعنی زمان ارسال شده و زمان خود سرور میسنجه اگه از 50 ثانیه یا هر زمانی که خودت میخوای بگزره اجازه ورود نده 
> خعلی کارهای دیگه هم میشه کرد.


مشکل اصلا سر زمان نیست دوست خوبم.
مشکل سر اینه که : شما فرض کن من پروتکل HTTPS دارم و فایل های SSL certificateداخل اپلیکیشن هستن. اگر مهندسی معکوس انجام بشه و به فایل های SSL certificate دسترسی پیدا کنیم ، امکان داره هکر بیاد و با استفاده از این certificate داده خودش رو بفرسته سمت سرور ؟؟؟

اپلیکیشن زودفود رو اگه مهندسی معکوس کنید تمام فایل های SSL certificate در دسترس هستن.

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

این پرسشم برمیگرده به اینکه در مورد HTTPS زیاد نمیدونم شوربختانه.

----------


## saeidpsl

HTTPS برای امنیت سایت خودته 
اینجا مهمه که data=4324dDFGDERESER3545FGHFGH کد شده اینو نمیتونه کاریش کرد 
امنیت هر چه بیشتر بهتره

----------


## saeidpsl

کسی نظری نداره؟

----------


## mamadlooloo

> کسی نظری نداره؟


دوستانی که در مورد موضوع تاپیک آگاهی دارن، خواهشمندم دیدگاه خودشون رو بگن.

----------


## saeidpsl

حتی اگه در ++C آدرس کد نشده استفاده کنی با HEX کردن فایل so میشه آدرس رو به راحتی پیدا کرد باید هر آدرس مهم اول کد کنی.

----------


## saeidpsl

اینجور باید انجام بدیم

----------


## mamadlooloo

> حتی اگه در ++C آدرس کد نشده استفاده کنی با HEX کردن فایل so میشه آدرس رو به راحتی پیدا کرد باید هر آدرس مهم اول کد کنی.


دقیقا همینطوره

نباید یک رشته رو در سی++ به کار برد. بلکه باید رشته رو تبدیل به Byte Array کرد.

----------


## saeidpsl

یه برنامه نوشتم تا  کار با اسنیف رو تست کنم وقتی رو دکمه Sent زدم یه ثانیه  آدرس لینک پیدا کرد[امنیت در حد جیبوتی!].به زودی رو کد کردن لینک کار می کنم  و  نتیجه + کد ها رو گزارش میدم.

----------


## tux-world

سلام. دستتون درد نکنه آقا سعید در مورد این اسم تابع یه توضیح میخواستم:

Java_com_saeidpsl_EncryptionDecryption_EncryptUtil  _encrypt

این جاوا کام بعد اسم شما اومده. این به چه شکله. بخواییم اسمش رو عوض کنیم مثلا از سعید به مهدی فقط باید اون سعید عوض شه؟ جاوا آندرلاین کام چیه؟

----------


## saeidpsl

> سلام. دستتون درد نکنه آقا سعید در مورد این اسم تابع یه توضیح میخواستم:
> 
> Java_com_saeidpsl_EncryptionDecryption_EncryptUtil  _encrypt
> 
> این جاوا کام بعد اسم شما اومده. این به چه شکله. بخواییم اسمش رو عوض کنیم مثلا از سعید به مهدی فقط باید اون سعید عوض شه؟ جاوا آندرلاین کام چیه؟


سلام خواهش می کنم
اره میشه عوض کرد
اسم package

com_saeidpsl_EncryptionDecryption

اینم اسم class

EncryptUtil

اخرش هم اسم String هستش

----------


## saeidpsl

تو github  بهترش هم گیر میاد.

----------


## tux-world

> سلام خواهش می کنم
> اره میشه عوض کرد
> اسم package
> 
> com_saeidpsl_EncryptionDecryption
> 
> اینم اسم class
> 
> EncryptUtil
> ...



نمیدونم کجا دارم اشتباه میکنم. من این com_saeidpsl_EncryptionDecryption رو تغییر دادم به اسم پکیج خودم  ir.pishguy.myapppro

که شد ir.pishguy.myapppro_EncryptUtil_encrypt

حالا اومدم تو گردل این رو گذاشتم:


        ndk{
            moduleName "saeidpsl_encrypt"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }



به چیز دیگه ای هم دست نزدم و فقط جاگذاری کردم. خطای زیر رو میده بهم:

Error:Could not find method ndk() for arguments [build_5uzhq3pbpydx849xi6yzjyck8$_run_closure1$_clo  sure6@4efa66cf] on object of type com.android.build.gradle.AppExtension.

----------


## tux-world

درست شد. اشتباه از من بود.   الان خطای زیر رو میده:

  Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++‎‎‎‎‎‎ files but it is not using a supported native build system.   

Consider using CMake or ndk-build integration with the stable Android Gradle plugin:    
https://developer.android.com/studio...tive-code.html   or use the experimental plugin:   
 https://developer.android.com/studio...al-plugin.html.

----------


## tux-world

> درست شد. اشتباه از من بود.   الان خطای زیر رو میده:


من CMake و LLDB رو نصب کردم ولی هنوز نمیتونم کامپایل کنم

----------


## saeidpsl

حالا ببین جواب میده لینکش.
فایل build.gradle ادرس commandLine عوض کن.

----------


## h3lper

سلام یک راهش اینه که یک پسورد داشته باشی و هر بار برای ثبت رکورد ، درخواستی رو به سرور ارسال کنی که پسورد رو هم داخل درخواست داشته باشه، در سمت سرور هم پسورد رو بررسی میکنی که در صورت درست بودن رکورد ثبت بشه و در غیر این صورت ثبت نمیشه.
-با فعال کردن ProGuard  از کد برنامتون محافظت کنید.
-برای ارسال اطلاعت در صورت امکان از متد POST استفاده کنید و اطلاعات رو قبل از ارسال رمزنگاری کنید.

----------


## tux-world

> حالا ببین جواب میده لینکش.
> فایل build.gradle ادرس commandLine عوض کن.


این فایل شما راحت کامپایل میشه و کار میکنه مشکلی نداره ولی روی اپی که خودم نوشتم خطا میده. حالا با کش و قوس فراوان رسیدم به این خطا:


Error:(115) *** Android NDK: Aborting    .  Stop.
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: Error while executing process /Users/mahdi/Desktop/Home/Packages/AndroidSdk/ndk-bundle/ndk-build with arguments {
NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/mahdi/Desktop/Home/Projects/Android/MYAPP/app/build/intermediates/ndk/debug/Android.mk APP_PLATFORM=android-25 NDK_OUT=/Users/mahdi/Desktop/Home/Projects/Android/MYAPP/app/build/intermediates/ndk/debug/obj NDK_LIBS_OUT=/Users/mahdi/Desktop/Home/Projects/Android/MYAPP/app/build/intermediates/ndk/debug/lib APP_ABI=armeabi-v7a,armeabi,x86}

----------


## saeidpsl

اگه اسم فایل c. عوض کردی  تو فایل Android.mk هم باید اسمشو عوض کنی
اینو ببین  
و اگه با لینوکسی کار میکنی ndk-build.cmd به ndk-build تغییر بده.

----------


## tux-world

نه من مک کار میکنم و اسم فایل رو هم تو پروژه خودم تغییر ندادم. فقط پکیج رو تغییر دادم از نام توابعی که داخل اون فایل سی هستن. من اصلا این فایل Android.mk رو ندارم تو پوشه های پروژه. و اینکه مسیر و همه چیز پروژه خودم شبیه پروژه شماست. این ndk-build رو هم تو پژوه پیدا نمیکنم محتوای build.gradle اینه:

ndk.dir=/Users/mahdi/Desktop/Home/Packages/AndroidSdk/ndk-bundle
sdk.dir=/Users/mahdi/Desktop/Home/Packages/AndroidSdk

اسم پکیج اینطورریه:
ir_pishguy_MYAPPPRO_EncryptUtil_decrypt

تو همون اسم توابع داخل فایل c



تو این فایل setup-app-platfowm.mk گیر میکنه

----------


## saeidpsl

ممکنه با مک یه جور دیگه هست.مک کار نکردم

----------


## tux-world

مک با لینوکس تفاوتی نداره: میدونید این خطا چیه؟

رو پروژه شما هیچ مشکلی ندارم آخه. عجیبه:

Error:(115) *** Android NDK: Aborting    .  Stop.   Error:Execution failed for task ':app:compileDebugNdk'.   com.android.ide.common.process.ProcessException: Error while executing  process  /Users/mahdi/Desktop/Home/Packages/AndroidSdk/ndk-bundle/ndk-build with  arguments {NDK_PROJECT_PATH=null  APP_BUILD_SCRIPT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/Android.mk  APP_PLATFORM=android-25  NDK_OUT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/obj   NDK_LIBS_OUT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/lib  APP_ABI=armeabi-v7a,armeabi,x86}

----------


## tux-world

میتونم بهتون تیم بدم ببینید؟

----------


## saeidpsl

gradle رو جدید کن
 classpath 'com.android.tools.build:gradle:2.1.2'

----------


## tux-world

آخرین نسخشو دارم

classpath 'com.android.tools.build:gradle:2.3.3'

----------


## tux-world

مشکل از اینه که باید من این رو باید لینک کنم به گردل. روی پروژه فعلی مراحل فرق میکنه. شما آشنایید با اونها؟

----------


## negative60

همونطور که عرض کردن تنها راه ایمن اینه امتیاز دهی‌ در سمت سرور انجام بشه 
به عنوان مثال میز بازی دو نفر هست و امتیاز میز ۵۰، بعد از پایان بازی سرور باید برنده و بازنده رو تشخیص بده و امتیاز رو برای برنده به ثبت برسونه

----------


## mamadlooloo

> مشکل از اینه که باید من این رو باید لینک کنم به گردل. روی پروژه فعلی مراحل فرق میکنه. شما آشنایید با اونها؟


درود بر همه دوستان

ای کاش این موضوع رو در یک تاپیک جدا مطرح میکردید.

اینکار مانند اینه که بریم نانوایی سنگک بگیم : ("آقا لطفا 10 تا بربری به من بدید.")

سپاس از شما.

----------


## mamadlooloo

> همونطور که عرض کردن تنها راه ایمن اینه امتیاز دهی‌ در سمت سرور انجام بشه 
> به عنوان مثال میز بازی دو نفر هست و امتیاز میز ۵۰، بعد از پایان بازی سرور باید برنده و بازنده رو تشخیص بده و امتیاز رو برای برنده به ثبت برسونه


دوست من ، بازی دو تنه نیست.

تنها یک تن بازی رو انجام میده و امتیاز کسب شده ارسال میشه به سرور.

همینک دیدگاهتون چیه؟ چه ترفندی به ذهنتون میرسه؟

----------------------------------------------------------------------------------------

نفر = واژه ای صد در صد عربی

تن = پارسی را پاس بداریم

----------


## saeidpsl

> مشکل از اینه که باید من این رو باید لینک کنم به گردل. روی پروژه فعلی مراحل فرق میکنه. شما آشنایید با اونها؟


build.gradle پروژه خودت و build.gradle مال من برسی کن میدونم مشکل فقط اونجاست.
دوست عزیز اگه نشد پیغام خصوصی بده نمیخوام موضوع تاپیک عوض بشه.

----------


## mamadlooloo

> سلام یک راهش اینه که یک پسورد داشته باشی و هر بار برای ثبت رکورد ، درخواستی رو به سرور ارسال کنی که پسورد رو هم داخل درخواست داشته باشه، در سمت سرور هم پسورد رو بررسی میکنی که در صورت درست بودن رکورد ثبت بشه و در غیر این صورت ثبت نمیشه.
> -با فعال کردن ProGuard  از کد برنامتون محافظت کنید.
> -برای ارسال اطلاعت در صورت امکان از متد POST استفاده کنید و اطلاعات رو قبل از ارسال رمزنگاری کنید.


راه حل خوبیه ، ولی :

ایجاد رمز ورود تازه، دوای درد نمیتونه باشه.

فرض کنید هکر در برنامه ثبت نام کرده و برای دریافت رمز ورود هم مشکلی نداره. میتونه هر بار که خواست این درخواست رو از سرور داشته باشه.

مشکل سر اینه که یه امضا خاصی درون اپلیکیشن باشه و سرور تنها با این امضا خاص کار کنه. یه امضا مهر و موم شده. یا یه چیزی که تا اکنون به ذهنم نرسیده.

----------


## mamadlooloo

> build.gradle پروژه خودت و build.gradle مال من برسی کن میدونم مشکل فقط اونجاست.
> دوست عزیز اگه نشد پیغام خصوصی بده نمیخوام موضوع تاپیک عوض بشه.


سپاس از شما.


---------------------------------------------------------------------------

معنای واژه سپاس چیست؟       3 + پاس ---> پاس داشتن 3 چیز

پاس 1 ---> پندار نیک
پاس 2 ---> گفتار نیک
پاس 3 ---> کردار نیک

----------


## saeidpsl

سلام خدمت همه
تونستم یه راه پیدا کنم 
تو عکس زیر تست زدم که اول سیو کردم بعد میگه با موفقعیت امتیاز سیو شد بعد دکمه چک هک یعنی همون لینک که ارسال شده رو دوباره میفرسته ولی میزنه این در خواست تکرای هست و از 10 ثاینه بگذره باز چک کنه timeout نشون میده.



در اصل چه کار میکنه اول یه strtotime("now") کد شده رو از سرور میگیره بعد تو  اندروید از کد بیرون میاد اون زمان رو همراه با داده ها کد میشه میفرسته به سرور  و تو دیتابیس تو تیبل request اون strtotime و ایدی یور سیو میشه که اگه اون هکر لینک رو دوباره زد بزنه نشون میده این درخواست قبلا ثبت شده و اگه دوباره زد و از 10 ثانیه گذشته باشه میزنه timeout . آدرس مثلا اینجوریه : http://192.168.1.1/webservice?data=5415435d90a48dcec4fef9eb
تمام فایل ها

   Zelix KlassMaster  برای Obfuscator کردن جاوا به کار میره 


    data پروژه جاواست که شامل APP_encryption میشه برنامه برای کد کردن و از کد در آوردن و MCrypt کلاس برای کد کردنه

 data هم شامل آدرس ها میشه مثلا هر چیزی خواستید اضافه کنید اول کد کنید بعد.
       ادرس است     list.put("ip", "http://test.com/");
        اینم اسم فایل  وبسرویسون   list.put("file", "webservice.php?");
          اینم ادرسی که امتیاز سیو میشه حتما از تگ استفاده کنید مثل [dat]  list.put("save_score", "action=save_score&user=[us]&pass=[ps]&score=[sc]&date=[dat]&key=71377499144");
        اینم مال ادرسی که تاریخ و زمان ازش بگیرید    list.put("get_time", "action=get_date&key=71377499144");
url encryption پروژه اندروید استودیو 
تگها اینجا به کار میره                    save_score = save_score.replace("[us]", "test");
                    save_score = save_score.replace("[ps]", "1234");
                    save_score = save_score.replace("[sc]", "200");
                    save_score = save_score.replace("[dat]", date);

برای ساختن فایل jar



بعد با  Zelix KlassMaster  فایل جار  رو Obfuscator کنید بعد فایل جار رو به فولدر url encryption\app\libs انتقال بدید.

_ســوال داشتیــد در خدمتـــم_....

----------


## saeidpsl

یه test بزنید

----------


## mamadlooloo

> یه test بزنید


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

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

شما فرض کن یه هکر اومده و اپلیکیشن ما رو مهندسی معکوس کرده و از تمام رمز و راز اون آگاه شده.
در واقع کد strtotimenow که از سمت سرور میاد توسط یه کلیدی که درون اپلیکیشن ما هست باز میشه.
این کلید رو توسط سی++ محافظت میکنیم.
اگه هکر از محتویات این فایل سی++ آگاه بشه و کلید ما رو به دست بیاره ، میتونه به راحتی strtotimenow اومده از سمت سرور رو باز کنه و داده خودش رو بفرسته به سرور.

چه راه حلی دارید ؟؟؟

----------


## saeidpsl

> درود بر شما دوست خوبم که تا این اندازه به من یاری رسوندید و پیگیر بودید.
> ای کاش همه افراد به کارشون همین اندازه علاقه داشته باشن.
> 
> میخوام یکم همدیگه رو به چالش بکشیم. هدفم سازندست. در واقع میخوام از طرح خودتون دفاع کنید.
> 
> شما فرض کن یه هکر اومده و اپلیکیشن ما رو مهندسی معکوس کرده و از تمام رمز و راز اون آگاه شده.
> در واقع کد strtotimenow که از سمت سرور میاد توسط یه کلیدی که درون اپلیکیشن ما هست باز میشه.
> این کلید رو توسط سی++ محافظت میکنیم.
> اگه هکر از محتویات این فایل سی++ آگاه بشه و کلید ما رو به دست بیاره ، میتونه به راحتی strtotimenow اومده از سمت سرور رو باز کنه و داده خودش رو بفرسته به سرور.
> ...




هدف  و ظرح شما عالیه.
کلید + لینک ها تو یه  فایل ذخیره jar هستش که بعد با  Zelix KlassMaster  فایل جار  رو  Obfuscator مبهم میشه و داخل  فولدر url encryption\app\libs قرار میگیره.
اینجور میشه کسی نمیتونه  برشگردونه خعلی خعلی خعلی خعی خعلی سخته و کارش از سی++  هم بهتره.
البته با سی++  هم میشه انجام دارد.
strtotimenow هم هک کنه چیزهای دیگه رو چه جور پیدا میکنه با این روش کد شده لینک ایده که داری برای خودت میشه درست کنی  strtotimenow یه روش هست.1000 روش دیگه هم هست
دوستان عزیز یه نظری بدید لطفا!

----------


## mz6488

سلام
یه روشی سراغ دارم ولی تا حالا ازش استفاده نکردم.میشه در کنار اینها ازش استفاده کرد.شما میتونید امضای نرم افزار رو توی سرور ذخیره ش کنید.بعد سمت اندروید امضا رو به پارامترها اضافه کنید.سمت سرور هم امضای دریافتی رو با امضایی که سرور ذخیره شده رو چک میکنه.اگه مطابقت نداشت خطا بده.از طرفی میتونید اجرای کد php رو از طریق کتابخونه mobile detect محدود کنید طوری که کدهای شما فقط بتونه سمت موبایل اجرا بشه

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures[0];

----------


## negative60

> در اصل چه کار میکنه اول یه strtotime("now") کد شده رو از سرور میگیره بعد تو اندروید از کد بیرون میاد اون زمان رو همراه با داده ها کد میشه میفرسته به سرور و تو دیتابیس تو تیبل request اون strtotime و ایدی یور سیو میشه که اگه اون هکر لینک رو دوباره زد بزنه نشون میده این درخواست قبلا ثبت شده و اگه دوباره زد و از 10 ثانیه گذشته باشه میزنه timeout . آدرس مثلا اینجوریه : http://192.168.1.1/webservice?data=5...0a48dcec4fef9eb


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




> دوست من ، بازی دو تنه نیست.
> تنها یک تن بازی رو انجام میده و امتیاز کسب شده ارسال میشه به سرور.
> همینک دیدگاهتون چیه؟ چه ترفندی به ذهنتون میرسه؟


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

برای اینکه منظور منو متوجه بشید براتون یک مثال کلی میزنم؛ فرض میکنیم بازی تخته نرد رو میخواهیم طوری بنویسیم که غیر قابل تقلب باشه, کلاینت درخواست شروع بازی رو به سرور ارسال میکنه, سرور شروع کننده بازی رو به صورت تصادفی مشخص میکنه و به کلاینت ها ارسال میکنه , بازی کنی که به عنوان شروع کننده بازی مشخص شده درخواست انداختن تاس میکنه سرور دو عدد تصادفی برای اون بازیکن ارسال میکنه و کلاینت فقط جای خونه هایی که میتونه حرکت کنه رو مشخص میکنه و به سرور اطلاع میده... یعنی در واقع در سمت سرور هم یک میز مجازی ساخته شده که سرور میدونه مهره های بازیکن ها تو چه موقعیتی قرار دارند و نوبت چه بازیکنی هست و چون از موقعیت مهره ها باخبره میدونه چه بازیکنی میتونه فقط چه حرکت هایی رو انجام بده و در آخر هم میتونه پایان بازی رو تشخیص بده و امتیاز رو برای برنده به ثبت برسونه

----------


## saeidpsl

> این روش فقط از ریپلی اتک جلوگیری میکنه, شما  فرض کن روش انکریپت و دیکریپت توسط چیتر به دست بیاد طرف دیگه حتی به اپ اندروید هم احتیاج نداره خودش میز میسازه و برای خودش امتیاز دلخواهاش رو  به ثبت میرسونه


کسی تا حالا ندیدم بتونه Zelix KlassMaster رو کداش رو برگردنه اینم بدون تعداد اندکی هستن که دیگه بتونه اون کاره باشه بعدشم انجور آدما دنبال هک برنامه کوچیک نمیرن.

----------


## saeidpsl

> سلام
> یه روشی سراغ دارم ولی تا حالا ازش استفاده نکردم.میشه در کنار اینها ازش استفاده کرد.شما میتونید امضای نرم افزار رو توی سرور ذخیره ش کنید.بعد سمت اندروید امضا رو به پارامترها اضافه کنید.سمت سرور هم امضای دریافتی رو با امضایی که سرور ذخیره شده رو چک میکنه.اگه مطابقت نداشت خطا بده.از طرفی میتونید اجرای کد php رو از طریق کتابخونه mobile detect محدود کنید طوری که کدهای شما فقط بتونه سمت موبایل اجرا بشه
> 
> Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures[0];


امضای نرم افزار هک میشه.mobile detect برای این موضوع بی فایده هست.

----------


## mamadlooloo

> امضای نرم افزار هک میشه.mobile detect برای این موضوع بی فایده هست.


اگه امضای نرم افزار به سرور فرستاده نشه، باز هم برنامه هایی مثل لاکی پچر میتونن امضا برنامه من رو هک کنن و استفاده کنن ؟؟؟

mobile detect تا یه اندازه ای میشه گفت یاری میرسونه ، نمیشه گفت 100 درصد کار نمیکنه. اگه هکر بتونه از طریق کامپیوتر کاری کنه که سرور اون سیستم عامل رو اندروید بشناسه ، حرف شما کاملا درسته.

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

دیدگاهتون چیه دوستان ؟؟؟ درست میگم یا اشتباه میکنم ؟؟؟

----------


## negative60

> کسی تا حالا ندیدم بتونه Zelix KlassMaster رو کداش رو برگردنه اینم بدون تعداد اندکی هستن که دیگه بتونه اون کاره باشه بعدشم انجور آدما دنبال هک برنامه کوچیک نمیرن.


اینکه شما کسی‌ رو ندیدید و چون برنامه کوچکی هست کسی‌ وقتش رو برای تحلیل برنامه‌ هدر نمیده باعث امن شدن برنامه نمی‌شه! این حرف درست نیست که چون من تا حالا کسی‌ رو ندیدم پس این راه حل درستی هست

----------


## saeidpsl

> اینکه شما کسی‌ رو ندیدید و چون برنامه کوچکی هست کسی‌ وقتش رو برای تحلیل برنامه‌ هدر نمیده باعث امن شدن برنامه نمی‌شه! این حرف درست نیست که چون من تا حالا کسی‌ رو ندیدم پس این راه حل درستی هست


من مثال زدم . از امنیت Zelix KlassMaster کاملا _مطمئن _ هستم. شما از کجا میدونید که امنیت نداره ؟ حتی بانک صادرات هم داره ازش استفاده میکنه.

----------


## saeidpsl

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

----------


## Nevercom

این رو ببینید: https://android-developers.googleblo...m-android.html

دقیقاً در همین مورد صحبت کرده که چطور در سمت Back-end اطمینان حاصل کنیم که درخواست از سمت App ما میاد و نه جای دیگه.

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

----------


## saeidpsl

سلام به همه
یه روش جدید پیدا کردم
اونم اینه که داده هایی که خعلی مهمه سمت اندروید  کد میشه بعد تو یک فایل تکس سیو میکنه بعد zipش میکنه و _روش پسورد میزاره و به وب سرویس ارسال میکنه اونجا هم کار برعکس میشه زیپ رو از حالت فشرده بیرون میاد و فایل داده رو میخونه . تو بخش اندروید هم پسورد زیپ مبهم میشه به کمک Zelix KlassMaster یا هر برنامه دیگه.
دانلود
_ نظر یادتون نره!

----------


## mamadlooloo

> نظر یادتون نره!


درود بر شما

سپاس از تلاش شما. خواهش میکنم در مورد کدها و نحوه عملکرد هر فایل بیشتر توضیح بدید.  بخصوص خط 7 و 46 از فایل webservice.php که یک سری عبارت نامشخص داره.

----------


## saeidpsl

> درود بر شما
> 
> سپاس از تلاش شما. خواهش میکنم در مورد کدها و نحوه عملکرد هر فایل بیشتر توضیح بدید.  بخصوص خط 7 و 46 از فایل webservice.php که یک سری عبارت نامشخص داره.


اون بخش مال وقتی هست که هکر رشته کد شده دستکاری میکنه و رشته کد شده  _ناقص  باشه و_  کامل decryption نمیشه اجازه ادامه کار رو نمیده.
 هر جاش مشکل داشتی پیام خصوصی بده در خدمتم.

----------


## saeidpsl

با سلام خدمت همه یه کتابخونه پیدا کردم که حتی با برنامه Fiddler لینک ها پیدا نمبشه یعنی وقتی یه درخواست به وب سرویس ارسال میکنی یا برعکس لینک سایت حتی با اسنیف لینک دیده نمیشه  ! :متعجب: 

compile *'com.loopj.android:android-async-http:1.4.9'
*compile *'cz.msebera.android:httpclient:4.3.6'*



RequestParams paramss = *new* RequestParams();
paramss.put(*"user"*, *"saeid"*); 

HttpRequest aa =*new* HttpRequest();
aa._get_(*"http://192.168.1.10/json.php"*, paramss, *new* AsyncHttpResponseHandler() {
@Override
*public void* onSuccess(*int* statusCode, Header[] headers, *byte*[] responseBody) {

*try* {
            String str = IOUtils._toString_(responseBody, *"UTF-8"*);
            Toast._makeText_(getApplicationContext(),str, Toast.*LENGTH_SHORT*).show();


        } *catch* (IOException e) {
            e.printStackTrace();
        } 
    }
@Override
*public void* onFailure(*int* statusCode, Header[] headers, *byte*[] responseBody, Throwable error) {

    }
});


*class* HttpRequest {
*public static* AsyncHttpClient _syncHttpClient_= *new* SyncHttpClient();
*public static* AsyncHttpClient _asyncHttpClient_ = *new* AsyncHttpClient();

*public static void* setCookieStore(PersistentCookieStore cookieStore) {
_getClient_().setCookieStore(cookieStore);
    }
*public static void* get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
_getClient_().get(url, params, responseHandler);
    }
*public static void* post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
_getClient_().post(url, params, responseHandler);
    }
*private static* AsyncHttpClient getClient()
    {
*if* (Looper._myLooper_() == *null*)
*return* _syncHttpClient_;
*return* _asyncHttpClient_;
    }
}

----------


## Danial_abdi

فرض کنید سرور خانه شما است . در به سمت داخل باز میشود . باید در را از سمت داخل محافظت کرد نه از بیرون. درخواست از هر راهی و هر در و پنجره ایی میاد مهم اینه از داخل سیستم محکم باشد. شما نمیتوانید همه گوشی های موبایل را امن کنید اما میتوانید سیستم خود را امن کنید.
من پیشنهاد میکنم توکن در هنگام لاگین به اپ فرستاده شود و همه درخواستهای اپ با توکن باشد. سمت سرور هم توکن اعتبارسنجی شود و همینطور بعد از یک مدت غیر فعال بود توکن remove شود.
من از یک دیدگاه لاجیک نگاه کردم . شاید راهکارهای فنی متفاوت و یا حتی متضاد با نظر من باشد.
دنیای خیلی بدی شده بدون اسلحه بیرون نرید  :لبخند گشاده!:

----------


## mamadlooloo

سپاس از همه دوستان

اگر روش های دیگری هم دارید، خواهش میکنم راهنمایی کنید.

پاینده باشید

----------

