سلام من میخوام با استفاده از API .یک مقدار از حافظه یک برنامه دیگه رو ویرایش کنم.ولی تا به حال با WriteProcessMemory کار نکردم.میخواستم از کسانی که با این تابع اشنای دارن یک مثال کوچیک برام بزنن.البته با توضیح کامل.نه این که فقط برنامه رو بنویسن و بگن همین.البته یک چیزای میدونم.ولی نه کامل.
ابتدا با بدست اوردن هندل پنجره برنامه بودنش رو ثابت میکنم بعد PID و Process Name و بعد فکر کنم مقدار Bufer و بعد ویرایش میکنم.ولی به صورت کد نمی توانم بعضی قسمت هاش رو مشکل دارم.شرمنده همه دوستان.
WriteProcessMemory : نوشتن اطلاعات درمحدوده فضای ادرسی پروسه دیگر
کد:
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesWritten
);
hProcess:هندل پروسه هدف که میخواهید در محدوده فضای ادرسی ان بنویسید
lpBaseAddress:Base Address محلی که میخواهید از انجا شرع به نوشتن کنید
lpBuffer:اشاره به buffer ی که اطلاعات توسط ان برای نوشتن منتقل می شود
nSize:مشخص کننده سایز اطلاعاتی که باید نوشته شوند . سایز به بایت میباشد
lpNumberOfBytesWritten:شاره به مقدار بایت نوشته شده در پروسه هدف این مقدار اختیاری می اشد
مقدار خروجی این تابع در حالت اجرای درست مقدار غیر 0 میباشد
ببخشید دوست من این چیزی که نوشتی به چه زبانی بود Delphi یا C ببین اینو من نوشتم ولی یک مشکل دارم.
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Sub Command1_Click()
Dim hwnd As Long
Dim pid As Long
Dim pHandle As Long
Dim hProcess As Long
hwnd = FindWindow(vbNullString, "world")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If
GetWindowThreadProcessId hwnd, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If
WriteProcessMemory pHandle, &H18190C8, Text1.Text, Len(Text1.Text), 0&
CloseHandle hProcess
End Sub
خوب همین طور که میبینی من یک مقدار در حافضه رو دارم تغیر میدم ادرسش هم 018190C8 این هست که در بالا امده و مقدار Text1 رو مینویسه توش البته نمیدونم چرا تا این مرحله نمیرسه.و ارور میده
Couldn't get a process handl خوب حالا مشکل از چیه که نمیتوانم تو پروسه بنویسم.در ضمن چیزی که میخواهم بنویسم حتما باید Hex باشه.
کد:
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Sub Command1_Click()
Dim hwnd As Long
Dim pid As Long
Dim pHandle As Long
Dim hProcess As Long
hwnd = FindWindow(vbNullString, "world")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If
GetWindowThreadProcessId hwnd, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If
WriteProcessMemory pHandle, &H18190C8, Text1.Text, Len(Text1.Text), 0&
CloseHandle hProcess
End Sub
اين مشگلی نداره و درست کار ميکنه
ولی فعلا که نمیشه باش پروسه رو باز کرد و درش تغیری ایجاد کرد.خوب حالا میگین چه کار کنم.
سلام
خوب هستيدد فكر كنم مشكلتون اينه كه شما داريد يك پروسس خارجي رو باز ميكنيد پس استرينگي كه ميخوايد بنويسيد يعني در واقعه بافر تون بايد از ادرس مموري پروسسي باشه كه مي خوايد توش بنويسيد يعني اينكه بافر تون بايد توسط copymem ويا virtualalocEX يك تكه از حافظه مورد نظر رو بگيري و بعد ادرس اون رو به بجاي text ات در writeprocessmemory بدي
به اميد ديدار
اونی که کم نوشتم توضیحی از MSDN بود
اگه شما میخواهین متنی رو به word ارسال کنین چرا کارو پیچیده میکنین؟این راهش نیست
شما اول باید هندل بخشی از word که متن توش تایپ میشه رو پیدا کنین که کلاسش از نوع WwG_ هست وقتی این هندل رو پیدا کردین متن خودتونو تو یه حلقه با استفاده از sendmessage و wm_char به اون ارسال میکنین
در ضمن برای استفاده از WriteProcessMemory این کار شما در حالتی هست که بخواهین بخشی از حافظه رو Overwrite کنین در غیر این صورت شما باید برای اطلاعاتی که میخواهین تو پروسه مقصد بنویسین(همون طور که جناب SaeedSMK گفتن) با استفاده از VirtualAllocEX یک مقدار فضا به اندازه چیزی که میخواهین بنویسین اختصاص بدین
سلام بر همه word منضورم ofice نیست بابا یک برنامه میخواهم یک متغیر integer رو تغیر بدم در ضمن این پروسه خارجی هست و مال یک برنامه دیگه.خوب حالا به نظر شما چه کار کنم با زبان دیگه ای بنویسم.یا برم سرم رو بزارم بمیرم.
سلام
عزيز توي نت درباره اين قسمت يعني تغيير يك تيكه از حافظه سرچ كني با كلمان كليدي writeprocessmemeory و VirtualAloctEX به نتيجه تون ميرسين و يا برنامه تون رو اپ كنيد بگيد كجاشو ميخواين تغيير بديد تا بشه كمك تون كرد
به اميد ديدار
من یه نمونه با C#.NET دارم. اگه بدردتون میخوره بگید بزارم.
من سورس رو گزاشتم.اگر میتوانی خوب کمک کن در بالا گزاشتمش.مشکل من اینه که هندل رو میگیرم PID و هم به دست میارم ولی پروسه رو نمیتوانم باز کنم که درش تغیری بدم.این پروسه طوری نیست که نشه.بازش کرد.بابا برنامه خفنی نیست.