PDA

View Full Version : گفتگو: ترینر سازی



ramzdar
یک شنبه 20 شهریور 1390, 11:32 صبح
سلام دوستان عزیز

همونجور که از عنوان تاپیک برمیاد میخوایم بحث ترینر سازی با VB رو دنبال کنیم.
من خودم چیز زیادی از این کار بلد نیستم اما مهم ترین چیزی که باید در این کار بلد باشیم اینه که بتونیم به مقادیر موجود در حافظه سیستم دسترسی پیدا کنیم و اونا رو تغییر بدیم.

حالا چجوری میشه مقادیر موجود در حافظه رو به همراه آدرسشون بدست آورد؟

اگه برنامه Cheat Engine رو دیده باشین میدونین که این برنامه میاد یه مقداری رو توی حافظه جستجو میکنه و اگه مقدارش همونی بود که ما میخواستیم، اونو به همراه آدرسش توی یه لیست میذاره. این آدرس ها رو چجوری میشه بدست آورد؟

setroyd
یک شنبه 20 شهریور 1390, 15:34 عصر
شما باید بیایید مقدار متغیرهای یک aplication رو در حافظه پیدا کنی که در رم هستند اون وقت این کار شدنی هست .

ramzdar
یک شنبه 20 شهریور 1390, 15:57 عصر
خب مشکل همینه
چجوری میشه این کار رو انجام داد؟

Mr'Jamshidy
یک شنبه 20 شهریور 1390, 16:34 عصر
ببین دوست من

2 تا API هست تو ویندوز که این کار رو برات انجام میده خیلی هم ساده ست
من به محض این که این 2 تا API رو با مثال پیدا کنم برات تو همین تاپیک میزارم

Mr'Jamshidy
یک شنبه 20 شهریور 1390, 16:37 عصر
'You Need a button (Command1).
' MaRiï؟½ G. Serrano. 16/Abril/2002.-
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteString Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WriteValue Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long

Private Sub Command1_Click()
Dim str As String, MyString As String
MyString = "HELLO"
'in this case I read the memory of my own process
MsgBox "MyString= " & MyString

str = ReadMemory(Me.hWnd, StrPtr(MyString), LenB(MyString), "BYE!!")

MsgBox "Now, MyString=" & MyString & vbCr & "Old Value= " & str

End Sub
Private Function ReadMemory(hWnd As Long, Address As Long, Bytes As Long, Optional strReplaceWith As String) As String
'Runs For Not Unicode Strings (VB-Strings)
On Error Resume Next
Dim pId As Long ' Used to hold the Process Id
Dim pHandle As Long ' Holds the Process Handle
Dim bytValue As Long 'Stores the value of a byte in the memory
Dim i As Long
Dim Text As String

' Get the ProcId of the Window
GetWindowThreadProcessId hWnd, pId

' use the pId to get a handle
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pId)

If (pHandle = 0) Then
'MsgBox "Unable to open process!"
Exit Function
End If
If Address = 0 Then Exit Function

For i = 1 To Bytes Step 2
' Read Byte to Byte
ReadProcessMemory pHandle, Address + i - 1, bytValue, 1, 0&
'value now contains the long value of the byte located in [Address + i - 1] pos.
'ReadMemory is a string...

ReadMemory = ReadMemory & Chr$(bytValue)
Next
'to write numeric values you can ..(Must) use WriteValue API
If LenB(strReplaceWith) <> 0 Then
'No Unicode!!
WriteString pHandle, Address, StrPtr(strReplaceWith), LenB(strReplaceWith), 0&
End If
'Close the Handle
CloseHandle pHandle
End Function



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

محسن واژدی
یک شنبه 20 شهریور 1390, 17:16 عصر
سلام
همانگونه که در کد قرار داده شده آقای جمشیدی هم معلوم است، خواندن حافظه یک پروسه توسط ReadProcessMemory و نوشتن در حافظه توسط WriteProcessMemory انجام میشود، فعلا" توضیحاتی در مورد ReadProcessMemory مینویسم، مابقی هم انشاء الله بعدا":

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

hProcess: هندل پروسه ای که قرار است حافظه آن خوانده شود، که توسط OpenProcess ، GetCurrentProcess و ... قابل دریافت است
lpBaseAddress : آدرس مکانی از پروسه که خواندن از آنجا شروع میشود، در نوشتن این آدرس بایستی دقت شود چون اگر آدرس در دسترس باشد تابع عمل خواهد کرد در غیر اینصورت ناموفق خواهد بود، برای بدست آوردن آدرس یک متغیر آنرا در تابع StrPtr قرار میدهیم
lpBuffer : بافری که محتویات دریافت شده از آدرس را نگهداری میکند،
nSize :تعداد بایت های تعیین شده برای خواندن از پروسه تعیین شده
lpNumberOfBytesRead: اشاره گری از تعداد بایت های منتقل شده به درون بافر،

به نمونه زیر توجه کنید:

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Private Sub Command1_Click()
Dim hPrc&, bAdd&, vl&, h&, i&, j&, res$
Dim x$
x$ = "Hi My Friends"
bAdd& = StrPtr(x) - 10
hPrc& = OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId)
h = bAdd&
Do
h& = h& + 1
ReadProcessMemory hPrc&, h, vl&, 1, 0&
If vl& = Asc(Left(x, 1)) Then
j& = h&
res$ = res$ & Chr(vl&)
For i& = 1 To Len(x)
j& = j& + 2
ReadProcessMemory hPrc&, j, vl&, 1, 0&
res$ = res$ & Chr(vl&)
Next i
Exit Do
End If
Me.Caption = h
DoEvents
Loop
CloseHandle hPrc&
MsgBox "Found x$ address in " & h& & vbNewLine & "Get x$ value from the memory: " & res$
End Sub


نمونه بالا محتویات متغیر x را در حافظه برنامه جستجو میکند، البته چون این یک نمونه است ابتدا آدرس متغیر x گرفته شده و 10 تا از آن کم شده است،
خیلی پیچیده شد؛
اگر ابهامی در کد وجود داشت بفرمائید توضیح دهم

موفق باشید

ramzdar
یک شنبه 20 شهریور 1390, 20:45 عصر
چرا با هربار کلیک روی دکمه، یه آدرس جدید نشون میده؟

محسن واژدی
یک شنبه 20 شهریور 1390, 21:28 عصر
سلام علیکم
آدرس متغیر توسط StrPtr گرفته میشود، این تابع برای متغیرها حداقل یک و حداکثر سه آدرس را برمیگرداند و برای مقادیر ثابت یک آدرس را برمیگرداند

موفق باشید

ramzdar
یک شنبه 20 شهریور 1390, 21:37 عصر
میشه لطف کنید یه نمونه بذارید که امتیاز بازی PinBall رو تغییر داد

محسن واژدی
یک شنبه 20 شهریور 1390, 23:56 عصر
نمونه Trainerهای زیادی را میتوانید، در سایت www.planet-source-code.com بیابید

setroyd
دوشنبه 21 شهریور 1390, 00:25 صبح
حالا چجوری میخوای متغیرهارو لیست کنی ؟؟؟ مثلا چجوری بفهمی تو این program چه متغییرهایی تعریف شده ؟؟؟ مثلا x1 و y و sss و ........

محسن واژدی
دوشنبه 21 شهریور 1390, 10:43 صبح
حالا چجوری میخوای متغیرهارو لیست کنی ؟؟؟ مثلا چجوری بفهمی تو این program چه متغییرهایی تعریف شده ؟؟؟ مثلا x1 و y و sss و ........

سلام
تاکنون نتوانسته ام نام متغیر را بدست آوردم چون فقط محتوی متغیر در رم بارگذاری میشود،

موفق باشید

ramzdar
دوشنبه 21 شهریور 1390, 11:27 صبح
اسم متغیرها رو نمیشه پیدا کرد. فقط مقدارشون رو میشه بدست آورد.
بعد از چندبار جستجو تو لیست متغیرها میشه اونی که میخوایم پیدا کنیم

setroyd
دوشنبه 21 شهریور 1390, 12:17 عصر
اینجا ما باید مقدار رو به بایت بگیریم در حلقه و سپس + strptr متغیر کنیم حالا ما چجوری میتونیم سرچ کنیم بدون تعیین مقدار مورد نظر یعنی چجوری میتونیم یک programe رو جستجو کنیم وقتی نه lenb رو داریم نه مقدارش در رم که توسط strptr مشخص شده ؟؟ نمیشه از اول هم سرچ کرد چون خیلی سنگین میشه . اگه کدی دارید بزارید که کاملا بشه فهمید مثلا برای یکی از بازیهای ویندوز نه اینکه سورس اماده بزارید نه خودتون کد رو بنویسید و کم باشه برای خوانایی مرسی .

ramzdar
دوشنبه 21 شهریور 1390, 13:42 عصر
مقدارش رو که داریم
مقدارش همون مقداریه که داره توی امتیازات نمایش میده

setroyd
دوشنبه 21 شهریور 1390, 23:36 عصر
عزیز من دارم میگم شما strptr رو میگیری محل قرار گیری در رم رو به شما نشون میده مثلا 9459607 که شما با lenb این مقدار رو ادامه میدی چون مقدار رشته صابت هست و شما داری درسته تا اینجا ؟ حالا من میگم ما نه محل اول قرار گیری در رم رو دارم و نه طول رشته رو حالا برای به دست اوردن چیکار کنیم گفتم اگه نظری دارید مثال بزنید توضیح ندید .

ramzdar
سه شنبه 22 شهریور 1390, 11:07 صبح
جناب mohsenvj اگه میشه در مورد نوشتن مقادیر که گفتین توضیح میدین توضیح بدین

محسن واژدی
چهارشنبه 23 شهریور 1390, 16:37 عصر
متاسفانه به این صورت که جناب setroyd میفرمایند تاکنون به نتیجه ای نرسیده ام

setroyd
چهارشنبه 23 شهریور 1390, 16:47 عصر
محسن جان منم فکر میکنم شدنی نیست !!! ببین کاری نمیشه کرد که هندل رو جاش رو در ram بگه ؟ مثلا بگه این هندل یا پروسس در مثلا 9378467 رم قرار دارد که ما از اونجا شروع به سرچ کنیم در متقیرها و در حلقه تعیین کنیم که اگه به فلان جا رسید مثلا به اسم saeed اونجا exit do بده این کار راحته پیدا کردنش با vb میشه کرد ولی مهم اینه که جای پروسس رو در رم بشه فهمید ؟

محسن واژدی
چهارشنبه 23 شهریور 1390, 17:11 عصر
آدرس پایه یک پروسه رو میتوانیم با VirtualQueryEx بگیریم، که برای پروسه خودمون میشود:


Option Explicit
Private Type MEMORY_BASIC_INFORMATION
BaseAddress As Long
AllocationBase As Long
AllocationProtect As Long
RegionSize As Long
State As Long
Protect As Long
lType As Long
End Type
Private Const PROCESS_ALL_ACCESS& = &H1F0FFF
Dim MBInfo As MEMORY_BASIC_INFORMATION

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function VirtualQueryEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim hPrc&
hPrc& = OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId)
VirtualQueryEx hPrc&, 0&, MBInfo, 50
MsgBox MBInfo.BaseAddress
End Sub

موفق باشید

setroyd
چهارشنبه 23 شهریور 1390, 17:35 عصر
ببین منظورم از ادرس اینه که شما وقتی ادرس رو میگیری محل قرار گیریش در رم رو میگیری اونوقت شروع میکنی دونه به دونه اضافه کردن بهش ولی این اون ادرس نیست فکر میکنم !

برنامه در رم مگه متغیر نیست یعنی در هر اجرا در یک جا بارگزاری نمیشه یا ثابت میمونه ؟ مثلا یک بار میشه 233457 و یک بار 5567679 یا نه همش در یکجاس ؟

ولی شما وقتی با strptr میگیری مقدار های متفاوتی میده به شما که زمین تا اسمون با این کد فرق داره !!!

محسن واژدی
چهارشنبه 23 شهریور 1390, 21:42 عصر
برنامه در رم مگه متغیر نیست یعنی در هر اجرا در یک جا بارگزاری نمیشه یا ثابت میمونه ؟ مثلا یک بار میشه 233457 و یک بار 5567679 یا نه همش در یکجاس ؟

سلام
نه، base-memory برنامه متغیر است و در هربار اجرا تغییر میکند



ولی شما وقتی با strptr میگیری مقدار های متفاوتی میده به شما که زمین تا اسمون با این کد فرق داره !!!

بله، همانگونه که قبلا" هم عرض شد، در متغیرها تفاوت مقدار مابین یک تا سه آدرس است، که این تغییر آدرس فقط در زمان طراحی اتفاق می افتد (این میتونه بخاطر وی بی باشه)، و در برنامه کمپایل شده آدرس دریافت شده ثابت است

موفق باشید