मुझे आश्चर्य है कि अगर पर्ल, पायथन या रूबी का उपयोग एक प्रोग्राम लिखने के लिए किया जा सकता है ताकि यह किसी अन्य प्रक्रिया (शायद डेटा और कोड डेटा दोनों के लिए ढेर) की याद में 0x12345678 की तलाश करे और फिर यदि यह पाया जाता है, इसे 0x00000000 में बदलें? यह Cheat Engine जैसा कुछ है, जो विंडोज पर ऐसा कुछ कर सकता है।विंडोज पर किसी अन्य प्रक्रिया की स्मृति को बदलने के लिए पर्ल, पायथन, या रूबी प्रोग्राम कैसे लिखें?
विंडोज पर किसी अन्य प्रक्रिया की स्मृति को बदलने के लिए पर्ल, पायथन, या रूबी प्रोग्राम कैसे लिखें?
उत्तर
मैं शुरू में सोचा था यह संभव नहीं था, लेकिन ब्रायन की टिप्पणी को देखने के बाद, मैं CPAN और लो खोज की है और निहारना, वहाँ Win32::Process::Memory है:
C:\> ppm install Win32::Process::Info
C:\> ppm install Win32::Process::Memory
मॉड्यूल जाहिरा तौर पर ReadProcessMemory
फ़ंक्शन का उपयोग करता: यहाँ मेरी प्रयास में से एक है :
#!/usr/bin/perl
use strict; use warnings;
use Win32;
use Win32::Process;
use Win32::Process::Memory;
my $process;
Win32::Process::Create(
$process,
'C:/opt/vim/vim72/gvim.exe',
q{},
0,
NORMAL_PRIORITY_CLASS,
q{.}
) or die ErrorReport();
my $mem = Win32::Process::Memory->new({
pid => $process->GetProcessID(),
access => 'read/query',
});
$mem->search_sub('VIM', sub {
print $mem->hexdump($_[0], 0x20), "\n";
});
sub ErrorReport{
Win32::FormatMessage(Win32::GetLastError());
}
END { $process->Kill(0) if $process }
आउटपुट:
C:\Temp> proc
0052A580 : 56 49 4D 20 2D 20 56 69 20 49 4D 70 72 6F 76 65 : VIM - Vi IMprove
0052A590 : 64 20 37 2E 32 20 28 32 30 30 38 20 41 75 67 20 : d 7.2 (2008 Aug
0052A5F0 : 56 49 4D 52 55 4E 54 49 4D 45 3A 20 22 00 : VIMRUNTIME: ".
0052A600 : 20 20 66 61 6C 6C 2D 62 61 63 6B 20 66 6F 72 20 : fall-back for
0052A610 : 24 56 : $V
प्रोसेस इंजेक्शन, देरी लोड लाइब्रेरी इत्यादि का उपयोग करने के तरीके हैं
मुझे नहीं लगता कि आप इसे सूचीबद्ध टूल से कर रहे हैं। यह सी और असेंबलर देश है और आपको वायरस लेखन क्षेत्र में ले जाना शुरू कर देता है। एक बार जब आप इसे काम पर ले जाएंगे, तो एंटी-वायरस पैकेज इसे चलाने के लिए प्रयास करेंगे और इसे अलग और अलग करेंगे। तो आप वास्तव में यह करना चाहते हैं।
गुड लक
खैर "शक्ति के साथ ज्यादा आता है ....", मज़ा हिस्सा अन्य प्रक्रिया की स्मृति के लिए उपयोग हो रही है। CheatEngine आपके पूरे ओएस को वर्चुअल मशीन के तहत चलाकर करता है जो स्मृति सुरक्षा को पराजित करने की अनुमति देता है। 'डीबगर के तहत चल रहे' मॉडल भी हैं, आम तौर पर उन्नत विशेषाधिकारों के साथ संशोधित अनुप्रयोग की बाल प्रक्रिया के रूप में लक्ष्य आवेदन शुरू करना है। इसके बारे में बहुत सारी मजेदार सामग्री के लिए Win32 API देखें।
पर्ल में, एक बार जब आप आवश्यक पहुंच प्राप्त कर लेंगे, तो आप शायद Win32::Security::Raw का उपयोग करके इसके साथ बातचीत करना चाहेंगे।
तो इसका मतलब यह है कि यदि मैं धोखा इंजन चलाता हूं और एक तृतीय पक्ष ऐप या शेयरवेयर भी चलाता हूं, तो कंप्यूटर विशेष रूप से कमजोर होता है क्योंकि पूरे कंप्यूटर में मेमोरी सुरक्षा बंद हो जाती है? (शेयरवेयर अनिवार्य रूप से आईई या फ़ायरफ़ॉक्स प्रक्रिया के कोड या डेटा को संशोधित कर सकता है) –
नहीं, यह उतना ही बुरा नहीं है जितना कि। CheatEngine एक विस्तारित ऑपरेशन सेट के माध्यम से अपना व्यवसाय करता है और हैश कुंजी के साथ इसका उपयोग प्रमाणित करता है। तो यह केवल स्मृति सुरक्षा को बंद करने के लिए सादा नहीं है, यह इसे कम से कम कुछ सुरक्षा के साथ एक तंत्र के माध्यम से छोड़ दिया जा रहा है। – chaos
ऐसा करना संभव है यदि आपने प्रक्रिया में डीबगर के रूप में अपना प्रोग्राम संलग्न किया है, तो उन भाषाओं में संभव होना चाहिए यदि उचित एपीआई के आसपास रैपर मौजूद हैं, या सीटीपीएस जैसे कुछ के माध्यम से सीधे विंडोज़ कार्यों को एक्सेस करके (पायथन के लिए)। हालांकि, अधिक निम्न स्तर की भाषा में करना आसान हो सकता है, क्योंकि उच्च स्तर वाले लोगों में आपको हाईलेवल डेटाटाइप को निम्न लोगों आदि का अनुवाद करने के तरीके से संबंधित होना होगा।
प्रक्रिया पर OpenProcess पर कॉल करके प्रारंभ करें अनुरोधित उचित पहुंच के साथ डीबग करने के लिए (आपको मशीन पर एक व्यवस्थापक होना चाहिए/पहुंच प्राप्त करने के लिए काफी उच्च विशेषाधिकार हैं)। इसके बाद आपको उस प्रक्रिया की स्मृति से पढ़ने और लिखने के लिए ReadProcessMemory और WriteProcessMemory जैसे कार्यों को कॉल करने में सक्षम होना चाहिए।
[संपादित करें] यहाँ एक समारोह की अवधारणा की एक त्वरित अजगर का सबूत है कि सफलतापूर्वक किसी अन्य प्रक्रिया के पता स्थान से स्मृति पढ़ता है:
import ctypes
import ctypes.wintypes
kernel32 = ctypes.wintypes.windll.kernel32
# Various access flag definitions:
class Access:
DELETE = 0x00010000
READ_CONTROL= 0x00020000
SYNCHRONIZE = 0x00100000
WRITE_DAC = 0x00040000
WRITE_OWNER = 0x00080000
PROCESS_VM_WRITE = 0x0020
PROCESS_VM_READ = 0x0010
PROCESS_VM_OPERATION = 0x0008
PROCESS_TERMINATE = 0x0001
PROCESS_SUSPEND_RESUME = 0x0800
PROCESS_SET_QUOTA = 0x0100
PROCESS_SET_INFORMATION = 0x0200
PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_DUP_HANDLE = 0x0040
PROCESS_CREATE_THREAD = 0x0002
PROCESS_CREATE_PROCESS = 0x0080
def read_process_mem(pid, address, size):
"""Read memory of the specified process ID."""
buf = ctypes.create_string_buffer(size)
gotBytes = ctypes.c_ulong(0)
h = kernel32.OpenProcess(Access.PROCESS_VM_READ, False, pid)
try:
if kernel32.ReadProcessMemory(h, address, buf, size, ctypes.byref(gotBytes)):
return buf
else:
# TODO: report appropriate error GetLastError
raise Exception("Failed to access process memory.")
finally:
kernel32.CloseHandle(h)
ध्यान दें कि आप निश्चित करने के लिए देखने के लिए याद में की आवश्यकता होगी चीजें - उस पते की अधिकांश जगह अप्रयुक्त होने जा रही है, सोचा कि कार्यक्रम कोड, डीएलएस इत्यादि जैसी चीजों को देखने के लिए कुछ मानक ऑफसेट हैं।
यह अविश्वसनीय रूप से अच्छा है – UberJumper
सूचीबद्ध प्रक्रियाओं में से एक में पूरी प्रक्रिया को कार्यान्वित करना संभव है लेकिन एक संकलित भाषा मेमोरी स्कैनिंग के लिए बेहतर होगी (अगर कुछ और नहीं हो तो गति विचार)। सिगस्कैन नामक एक डीएलएल (स्रोत के साथ) उपलब्ध है, जबकि एक विशिष्ट गेम के लिए तैयार किया गया है, संभवतः न्यूनतम प्रयासों के साथ आपकी आवश्यकताओं को सुइट करने के लिए संशोधित किया जा सकता है।
ब्रायन के सही उत्तर पर बिल्डिंग आपके पते को पाइथन के भीतर से प्राप्त करने के लिए एक डीएलएल का उपयोग करने का एक त्वरित और गंदा उदाहरण है। यह निश्चित रूप से डीएलएल कार्यान्वयन के लिए विशिष्ट है। "मॉड्यूल नाम" आमतौर पर डीएएल नाम होगा जैसा कि धोखा इंजन "एन्यूमेरेट डीएलएल और सिंबल" संवाद में प्रदर्शित होता है।
ब्रायन के उदाहरण के साथ दिशानिर्देश और MSDN के साथ आप आसानी से इसे अपने स्वयं के WriteProcessMemory विधि के साथ बढ़ा सकते हैं।
import win32defines
import win32process
import win32gui
from ctypes import *
SigScan = cdll.SigScan
kernel32 = windll.kernel32
addresses = {"Value1" : {"sigArg1" : "b0015ec390518b4c24088d4424005068",
"sigArg2" : 36,
"address" : None,
"size" : 32
},
"Value2" :{"sigArg1" : "3b05XXXXXXXX741285c0",
"sigArg2" : None,
"address" : None,
"size" : 32
}
}
def read_process_mem(pid, address, size):
"""Read memory of the specified process ID."""
buf = create_string_buffer(size)
gotBytes = c_ulong(0)
h = kernel32.OpenProcess(win32defines.PROCESS_VM_READ, False, pid)
try:
if kernel32.ReadProcessMemory(h, address, buf, size, byref(gotBytes)):
return buf
else:
# TODO: report appropriate error GetLastError
raise Exception("Failed to access process memory.")
finally:
kernel32.CloseHandle(h)
if __name__ == "__main__":
pid, id = None, None
## HWND
hwnd = win32gui.FindWindowEx(0, 0, 0, "Window Name here")
## pid
pid = win32process.GetWindowThreadProcessId(hwnd)[-1]
## Initialize the sigscan dll
SigScan.InitializeSigScan(pid, "Module Name")
## Find all the addresses registered
for key in addresses.keys():
addresses[key]["address"] = SigScan.SigScan(addresses[key]["sigArg1"],
addresses[key]["sigArg2"])
## Allow the scanner to clean up
SigScan.FinalizeSigScan()
for key in addresses.keys():
if addresses[key]["address"] != None:
print repr(read_process_mem(pid, addresses[key]["address"],
addresses[key]["size"]).raw)
मैंने लिखा Proc::Memory और उसके अंतर्निहित पुस्तकालय libvas इस उद्देश्य के लिए। यह सिर्फ विंडोज़ पर हुड के तहत {Read,Write}ProcessMemory
पर कॉल करता है, लेकिन यह अन्य प्लेटफार्मों का भी समर्थन करता है। उदाहरण:
my $mem = Proc::Memory->new(pid => $$);
$mem->poke(0x12345678, 'L') = 12;
- 1. मैं विंडोज़ में पाइथन में किसी अन्य प्रक्रिया की स्मृति को कैसे पढ़ सकता हूं?
- 2. किसी अन्य ऐप के stdin पर कैसे लिखें?
- 3. विंडोज 7 पर रूबी प्रोग्राम कैसे चलाएं?
- 4. फ़ाइल किसी अन्य प्रक्रिया
- 5. किसी अन्य प्रक्रिया की स्मृति के बाइनरी/हेक्स डंप कैसे बनाएं?
- 6. किसी अन्य प्रक्रिया की मेमोरी स्पेस में मान कैसे बदलें
- 7. किसी अन्य प्रक्रिया के stdout को देखकर
- 8. मैं लिनक्स में पायथन में किसी प्रक्रिया की स्मृति को कैसे पढ़ सकता हूं?
- 9. सिल्वरलाइट कंट्रोल्स को कैसे लिखें जो स्मृति
- 10. किसी अन्य (पर्ल)
- 11. किसी अन्य मॉड्यूल से मॉड्यूल चर बदलने के लिए कैसे?
- 12. एक सी या सी ++ प्रोग्राम को मेमोरी और सीपीयू चक्र भराव के रूप में कार्य करने के लिए कैसे लिखें?
- 13. क्यों विंडोज किसी अन्य उपयोगकर्ता
- 14. क्या किसी अन्य जावा प्रक्रिया में किसी अन्य जावा प्रक्रिया को मारने/रोकने के लिए एक जेवीएम में जावा प्रक्रिया के लिए संभव है?
- 15. किसी अन्य प्रक्रिया में खींचें
- 16. स्मॉलटॉक, पर्ल, पायथन और रूबी
- 17. मैं विंडोज पर किसी अन्य उपयोगकर्ता खाते के साथ एक नई प्रक्रिया कैसे बना सकता हूं?
- 18. प्रक्रिया फ़ाइल क्योंकि इसे किसी अन्य प्रक्रिया
- 19. नेट - TextWriterTraceListener, किसी अन्य प्रक्रिया
- 20. पायथन इटरेटर्स के लिए पेजर कैसे लिखें?
- 21. बाल प्रक्रिया के स्मृति उपयोग की निगरानी
- 22. पायथन, पावरशेल, या अन्य?
- 23. कॉन्फ़िगरेशन फ़ाइल को किसी अन्य प्रोग्राम
- 24. आप किसी अन्य प्रोग्राम को निष्पादित करने के लिए सी प्रोग्राम कैसे लिखते हैं?
- 25. फ़ाइलस्ट्रीम: किसी अन्य प्रक्रिया त्रुटि
- 26. प्रक्रिया क्योंकि इसे किसी अन्य प्रक्रिया
- 27. प्रोग्राम के StdOut स्ट्रीम को सीधे सी # में कैसे लिखें?
- 28. अन्य प्रोग्राम चलाने के लिए पायथन का उपयोग
- 29. अन्य प्रक्रिया
- 30. किसी अन्य इकाई से प्रक्रिया कैसे चलाएं?
वास्तव में सच नहीं है कि - उपयुक्त अनुमतियों वाले, यह (यह कैसे डिबगर काम है) यह एक सुरक्षा छेद अगर आप पहले से व्यवस्थापक कर रहे हैं नहीं है का उपयोग और एक अन्य प्रक्रियाओं स्मृति संशोधित करने के लिए संभव है। – Brian