क्या मैं इस स्क्रिप्ट का उपयोग किसी निष्पादन योग्य को ठीक से करने के लिए कर सकता हूँ?


2

मुझे हाल ही में एक टेक्स्ट-रिप्लेसमेंट स्क्रिप्ट के साथ कुछ मदद मिली थी और सोचा कि क्या इसे पैचिंग उद्देश्यों के लिए इस्तेमाल किया जा सकता है। मैं आमतौर पर एचएक्सडी का उपयोग करता हूं , और सोचा कि यदि यह अनिवार्य रूप से एक गौरवशाली नोटपैड है, तो पाठ संपादक और हेक्स संपादक में एक निष्पादन योग्य संपादन के बीच क्या अंतर है? मैंने अपने सिद्धांत का परीक्षण करने का फैसला किया और स्क्रिप्ट को परीक्षण में डाल दिया, जबकि यह निर्दिष्ट तारों को बदल सकता है , यह निष्पादन योग्य में जानकारी जोड़ता है।

मुझे यहाँ क्या फेंकता है कि यदि इसका उपयोग टेक्स्ट डॉक्यूमेंट में टेक्स्ट को बदलने के लिए किया जाता है, तो यह केवल स्ट्रिंग्स को बदल देता है और डॉक्यूमेंट में बाइट्स नहीं जोड़ता है जब तक कि नया स्ट्रिंग पिछले वाले से अधिक लंबा न हो। मेरा मानना ​​है कि यह इसलिए है क्योंकि स्क्रिप्ट पाठ दस्तावेज़ों को संपादित करने के लिए डिज़ाइन की गई है और इस वजह से हेडर को संशोधित करता है। मैंने पहले और बाद की तुलना करने के लिए एचएक्सडी का उपयोग किया और यकीन है कि हेडर को संशोधित किया गया है। इस समय मेरे पास स्क्रिप्ट है:

@echo off
setlocal enableextensions disabledelayedexpansion

set search=OutDir=Old String
set replace=OutDir=New String
set textFile=Document.txt

:PowerShell
SET PSScript=%temp%\~tmpStrRplc.ps1
ECHO (Get-Content "%~dp0%textFile%").replace("%search%", "%replace%") ^| Set-Content "%~dp0%textFile%">"%PSScript%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
EXIT

(मेरे द्वारा प्रतिस्थापित किए जा सकने वाले तार समान आकार के होते हैं, इसलिए निष्पादन योग्य आकार अनलॉक हो जाएगा, और स्ट्रिंग भ्रष्टाचार का उपयोग नहीं किया जा रहा है।)

मैं यह नोट करना चाहूंगा कि मैं PowerShell में नया हूं, इसलिए मैं अभी भी सीख रहा हूं कि यह कैसे काम करता है। मैंने %~dp0%textFile%चर देखा । यदि मैं इस चर की सही ढंग से व्याख्या कर रहा हूं, तो यह PowerShell स्क्रिप्ट को एक पाठ दस्तावेज़ के रूप में संशोधित की जाने वाली परिभाषित फ़ाइल को संभालने के लिए कहता है । इस तर्क के साथ जा रहा है (यदि यह सही है) , क्या एक समान चर है जो या तो प्रारूप को अनदेखा करेगा या एक निष्पादन योग्य के रूप में इनपुट फ़ाइल को संभाल सकता है? मेरी स्क्रिप्ट जो मैं परिभाषित करता हूं, उसे बदलने में सक्षम है, लेकिन निष्पादन योग्य को तोड़ता है, क्या मेरी स्क्रिप्ट संभव है?


नहीं। सामान्य मामले में, आप पाठ संपादक के साथ निष्पादन योग्य "पैच" नहीं कर सकते। एक्ज़िबेबल्स देखभाल जहां अधिकांश बाइट्स को तैनात किया जाता है और पॉइंटर्स को समायोजित किए बिना उन्हें इधर-उधर घुमाया जाता है, अनपेक्षित प्रभावों का परिणाम होता है। यदि आप भाग्यशाली हैं तो यह सीधे दुर्घटनाग्रस्त हो जाएगा; यदि नहीं तो यह किसी भी चीज के बारे में कर सकता है। आप किसी अज्ञात निष्पादन में संग्रहीत पाठ के प्रारूप के बारे में कुछ भी नहीं मान सकते हैं और न ही इसे संशोधित करने के लिए क्या आवश्यक है।
बॉब

मुझे पता है कि बाइट्स को अधिलेखित किया जाना चाहिए, एक निष्पादन योग्य में स्थानांतरित नहीं किया गया। मेरे मामले में मैं जो स्ट्रिंग्स बदल रहा हूं, वे उनके पूर्ववर्तियों के आकार के समान हैं। मेरा उदाहरण इसे प्रतिबिंबित नहीं करता है इसलिए मैं इसे संशोधित करूंगा। फिर भी, मुझे समझ नहीं आ रहा है कि मैं बाइनरी को भ्रष्ट किए बिना नोटपैड ++ में स्ट्रिंग को कैसे बदल सकता हूं। जब तक नोटपैड ++ "फॉरमेट अवेयर" है, मैं नहीं देखता कि स्ट्रिंग्स को कैसे रिप्लेस करना असंभव है। क्या यहाँ कुछ और है जो मुझे याद आ रहा है?
श्री मेंडेली

1
भ्रष्टाचार से बचने के लिए, EXE फ़ाइल के शीर्षलेख में एक चेक-योग है: यदि आपको फ़ाइल में कुछ भी बदलना है तो इसे अपडेट करना होगा। इसके अलावा, किसी भी पाठ-आधारित स्ट्रिंग प्रतिस्थापन एक बाइनरी फ़ाइल को भ्रष्ट करने के लिए उत्तरदायी है, क्योंकि अशक्त बाइट्स को स्ट्रिंग सीमांकक के रूप में उपयोग किया जाता है, इसलिए आपको एक बाइनरी संपादक का उपयोग करने की आवश्यकता है, लेकिन मुझे किसी के बारे में पता नहीं है जो बैच ऑपरेशन की अनुमति देता है।
AFH

@AFH को जानकर अच्छा लगा, मैंने अशक्त बाइट्स को ध्यान में नहीं रखा।
श्री मेंडेली

एक बेहतर उत्तर यह हो सकता है कि आउटपुट डायरेक्टरी को एक सांकेतिक लिंक में बदल दें, जो आप चाहते हैं उस डायरेक्टरी की ओर इशारा करते हुए, और बायनेरिज़ को अकेला छोड़ दें।
AFH

जवाबों:


1

हाल ही में मैंने देखा एक उदाहरण से लिया गया:

# Description: set your.exe resolution 0 to any x/y specified
# By knowning the offset for these values hard coded in your 
# executable
# - None of this is real world... example only


Set-Location(Split-Path $MyInvocation.MyCommand.Path)

# Prompt resolution

$resolutionX = Read-Host -Prompt "Width"
$resolutionY = Read-Host -Prompt "Height"
# Resolution Z is just hard coded as 32

# Patch bytes

$bytes  = [System.IO.File]::ReadAllBytes("your.exe")

# Arbitrary locations and values for example

$offsetX = 0x0039CA70
$offsetY = $offsetX + 4
$offsetZ = $offsetY + 4

$resolutionX = [BitConverter]::GetBytes([Int16]$resolutionX)
$resolutionY = [BitConverter]::GetBytes([Int16]$resolutionY)
$resolutionZ = [BitConverter]::GetBytes([Int16]32)

# SMASH your new values into the exe

$bytes[$offsetX] = $resolutionX[0]
$bytes[$offsetX+1] = $resolutionX[1]
$bytes[$offsetY] = $resolutionY[0]
$bytes[$offsetY+1] = $resolutionY[1]
$bytes[$offsetZ] = $resolutionZ[0]

# And save the result

[System.IO.File]::WriteAllBytes("your.exe", $bytes)



Read-Host -Prompt "Press Enter to exit"

कुछ स्पष्टीकरण का स्वागत है।
टोटो 13

धन्यवाद विलार्ड @isaac । यह है बहुत ही दिलचस्प है, मैं मैं इसके साथ क्या कर सकते हैं देखेंगे। क्या आप मूल स्रोत प्रदान कर सकते हैं जो इससे लिया गया था?
श्री मेंडेली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.