سلام به همه
من قصد دارم مسیری را که یک برنامه دارد از آن استفاده میکند و در رم کامپیوتر درج شده است را پیدا کنم
برنامه نرم افزار الکول 120 درصد است
پروسه این برنامه را با نرم افزار winhex باز کردم و به قسمت primary memory رفتم
مسیر مانند زیر در بین کدهای هگز قابل تشخیص است
من چگونه میتوان آن تکه را که نهایتا به آدرس پوشه plugins اشاره دارد بطورت استرینگ بگیرم؟ همون قسمتی که دورش را کادر کشیدم؟
ممنون میشم راهنمایی کنید دوستان؟
شما باید محتویات پروسه رو dump کنین و داخلش دنبال متن مورد نظرتون بگردین یا مستقیم داخل فضای پروسه با استفاده از تابع ReadProcessMemory دنبال متن مورد نظرتون باشین
(۰۷-بهمن-۱۳۸۸, ۱۱:۱۸:۲۰)lord_viper نوشته است: [ -> ]شما باید محتویات پروسه رو dump کنین و داخلش دنبال متن مورد نظرتون بگردین یا مستقیم داخل فضای پروسه با استفاده از تابع ReadProcessMemory دنبال متن مورد نظرتون باشین
سلام
با تشکر از شما
میشه پارامتر های این api را توضیح بدید که هرکدام چی هست و از کجا باید بدستشون آورد. (مثلا هندل پروسه را از کجا بگیرم)
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
هندل پروسه رو با تابع OpenProcess
lpbaseAddress:ادرس محل شروع
lpbufer:ادرس محلی که اطلاعات باید در ان قرار گیرد(مثلا یک ارایه از char)
size که همان طول ارایه شماست یا طولی که در نظر دارید خوانده بشه
lpnumberofbytewriten هم حجم اطلاعاتی هست که خوانده شده هست که یک متغییر از نوع integer بهش پاس میدن
همین
سلام
من بعد از چند روز کار و درگیری امروز باز روی برنامم کار کردم و به یه مشکل برخورد کردم
اون اینه که من الان میتونم به حافظه مورد استفاده برنامه الکول که هدف من هست دسترسی پیدا کنم و آن رو بخونم. حالا باید دنبال نام ه یکی دو فایل بگردم و مسیر ذخیره شدن آنها را استربگ بگیرم
مشکلم اینه که نمیدونم چجوری این کار زا انجام بدم ! :(
تنها چیزی که به ذهنم رسید این بود که یه حلقه for next بنویسم و 16 تا 16 تا برم جلو و با تابع instr دنبال نام فایل های مورد نظرم بگردم
ولی مانند عکسی در در اولین پست گذاشتم افستها در مبنای هگزا دسیمال هست و حلقه کار نمیکنه و متغیری که افست شروع حلقه را معین میکنه باع اررور میشه! کامپایلر ایراد میگیره که type mismach
چکار کنم به نظر شما که حلقه مطابق افست ها بره جلو؟ کد نمونه هم در پایین میزارم
کد:
For i = 0 To 1050 Step 16
ReadProcessMemory pHandle, hex(i), buf, 20, 0&
Text4.Text = buf
If InStr(Text4.Text, "extra.dll") <> 0 Then
i = 1050
End If
Next i
CloseHandle pHandle
جون جدتون هر کی بلده کمک کنه! گیرم بخدا
type mismatch رو به کدوم ارگومان گیر میده؟
احتمالا به (hex(i ادرس رو به صورت Integer وارد کنین در ضمن کدتونو کامل بزارین تا بهتر بشه نظر داد
با جون جد مردم چه کار داری!!
اينو امتحان کن
کد:
Dim Buffer As String, DATLen As Long, I As Long
Buffer = Space(250000)
For I = 0 To 30
Call ReadProcessMemory(Handle, I * 290000, Buffer, 290000, DATLen)
If DATLen > 0 Then
If InStr(Buffer, "extra.dll") > 0 Then
Text4.Text = Replace(Buffer, Chr(0), " ")
Exit For
End If
End If
Next
بجای استفاده از textbox از متغير استفاده کن تأثير زيادی تو سرعت داره
(۱۵-بهمن-۱۳۸۸, ۲۰:۴۲:۰۳)lord_viper نوشته است: [ -> ]type mismatch رو به کدوم ارگومان گیر میده؟
احتمالا به (hex(i ادرس رو به صورت Integer وارد کنین در ضمن کدتونو کامل بزارین تا بهتر بشه نظر داد
بله همون HEX(i) خطا را ایجاد میکنه
کد نمونه که درست کار میکنه و به افست استایک اشاره داره در زیر میزارم.
افست مثال هست &H74760400
کد:
Dim hwnd As Long
Dim pid As Long
Dim pHandle As Long
Dim hProcess As Long
Dim buf As String * 16
hwnd = FindWindow(vbNullString, "alcohol 120%")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If
Text1.Text = hwnd & " " & Hex(hwnd)
GetWindowThreadProcessId hwnd, pid
Text2.Text = pid & " " & Hex(pid)
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If
Text3.Text = pHandle & " " & Hex(pHandle)
ReadProcessMemory pHandle, &H74760400, buf, 17, 0&
CloseHandle pHandle
Text4.Text = buf
حالا میخوام آدرس افست ها داینامیک بشه طبق اصلوبی که در تصویری که در پست 1 در ستون افست ها میبینید
توسط روالی مانند حلقه آدرسها طوری جایگزین آدرس ثابت بشن اینطوری
کد:
&H10000
&H10010
&H10020
&H10030
الی آخر.
(۱۵-بهمن-۱۳۸۸, ۲۰:۴۵:۲۱)CRazYFULL نوشته است: [ -> ]با جون جد مردم چه کار داری!!
اينو امتحان کن
[code]
.
.
.
.
.
بجای استفاده از textbox از متغير استفاده کن تأثير زيادی تو سرعت داره
دوست عزیز مقدار I * 290000 داره به آدرسی اشاره میکنه که ظاهرا وجود نداره و هیچ چیز جز رشته بلندی از فضای خالی برگشت داده نمیشه
با F8 نگاه کردم کمی هم دستکاری کردم باز نشد
(۱۶-بهمن-۱۳۸۸, ۱۳:۰۲:۵۶)sylvester نوشته است: [ -> ]دوست عزیز مقدار I * 290000 داره به آدرسی اشاره میکنه که ظاهرا وجود نداره و هیچ چیز جز رشته بلندی از فضای خالی برگشت داده نمیشه
با F8 نگاه کردم کمی هم دستکاری کردم باز نشد
ميتونی مقدار فضا رو کم کنی، اما هرچه مقدار فضا بيشتر باشه مقدار بيشتری رشته از حافظه بر ميگردنه و تعداد حلقه ها کمتر ميشه و خيلی سريع تر به نتيجه ميرسه
معلومه که در اوايل حلقه مقدار Null بر ميگردنه چون ما مقدار فضا بيشتری از مقدار واقعيی برای خوندن اختصاص داديم
(۱۶-بهمن-۱۳۸۸, ۱۸:۴۷:۰۸)CRazYFULL نوشته است: [ -> ] (۱۶-بهمن-۱۳۸۸, ۱۳:۰۲:۵۶)sylvester نوشته است: [ -> ]دوست عزیز مقدار I * 290000 داره به آدرسی اشاره میکنه که ظاهرا وجود نداره و هیچ چیز جز رشته بلندی از فضای خالی برگشت داده نمیشه
با F8 نگاه کردم کمی هم دستکاری کردم باز نشد
ميتونی مقدار فضا رو کم کنی، اما هرچه مقدار فضا بيشتر باشه مقدار بيشتری رشته از حافظه بر ميگردنه و تعداد حلقه ها کمتر ميشه و خيلی سريع تر به نتيجه ميرسه
معلومه که در اوايل حلقه مقدار Null بر ميگردنه چون ما مقدار فضا بيشتری از مقدار واقعيی برای خوندن اختصاص داديم
سلام
مقدار i * 29000 یک عدد دسیمال درست میکنه. حتی اگر بافر را 20 کنیم مقدار خواندن هم 19 کنیم باز چیزی بر نمیگرده. یه تستی بگیرین متوجه موضوع میشید
آرگونمان ByVal lpBaseAddress As Any حتما باید عدد هگزا دسیمال باشه نه دسیمال تا درست کار کنه
اصلا صورت مسئله را بسیار ساده میکنم.
شما فقط اگر یک جنریتور بتونید درست کنید (با حلقه یا در چیز ه دیگری) که بتونه اعداد 8 بیتی مانند آنچه در زیر ستون offset در تصویر ضمیمه شده در پست 1 درست کنه کار تمومه :) فقط عدد درست بشه و بس
مثلا ار 0 تا 120 این درست بشه که با فاصله 16 تا 16 تا هست
00010000
00010010
00010020
00010030
00010040
00010050
00010060
00010070
00010080
00010090
000100A0
000100B0
000100C0
000100D0
000100F0
00010100
00010110
00010120