EXETOOLS FORUM  

Go Back   EXETOOLS FORUM > General > Community Tools

Notices

Reply
 
Thread Tools Display Modes
  #1  
Old 10-22-2018, 19:26
Elesty Elesty is offline
Friend
 
Join Date: Feb 2017
Posts: 9
Rept. Given: 0
Rept. Rcvd 0 Times in 0 Posts
Thanks Given: 9
Thanks Rcvd at 8 Times in 3 Posts
Elesty Reputation: 0
MD5 replace tool

Hi,

I just wrote a quick tool to patch all occurrences of a file inside a program folder (no matter the file name) given an MD5 checksum.
It is useful when the original files may have different names and are present in multiple sub directories.

Usage:
python replace.py FOLDER MD5_SUM CRACKED_FILE_PATH

Example:
python replace.py 098f6bcd4621d373cade4e832627b4f6 c:\mysoftware license.dll

Where:
-> 098f6bcd4621d373cade4e832627b4f6: is the MD5 of the original files to be replaced by the cracked file. You can get the MD5 checksum by using powershell with the function Get-FileHash -alg md5 ORIGINAL_FILE
-> c:\mysoftware is the folder of the software
-> license.dll is the path to the cracked file

You can also edit the file and set DEBUG_MODE=True to only print the occurrence of the files instead of replacing them.

Compiled version is also available attached.


Code:
import os
import sys
import hashlib
import shutil

DEBUG_MODE=False

if len(sys.argv) < 4:
  print("Usage: python replace.py FOLDER MD5_SUM FILE_PATH_TO_REPLACE_BY")
  sys.exit(-1)

g_path = sys.argv[1]
md5_to_find = sys.argv[2]
to_replace_by = sys.argv[3]

if not os.path.isfile(to_replace_by):
  print("Error: the path of the file to replace by does not exists")
  sys.exit(-1)

def md5sum(fname):
  try:
    hash_md5 = hashlib.md5()
    with open(fname, "rb") as f:
      for chunk in iter(lambda: f.read(4096), b""):
        hash_md5.update(chunk)
    return hash_md5.hexdigest()
  except:
    pass
  return "ERROR"

for root, directories, filenames in os.walk(g_path):
  for filename in filenames:
    full_path = os.path.join(root, filename)
    checksum = md5sum(full_path)
    #print(full_path, md5sum(full_path))
    if not DEBUG_MODE and checksum == md5_to_find:
      print("Replacing [%s] by [%s]" % (full_path, to_replace_by))
      shutil.copy(to_replace_by, full_path)
    elif checksum == md5_to_find:
      print("Should replace [%s] by [%s]" %  (full_path, to_replace_by))
Attached Files
File Type: 7z replace.7z (4.81 MB, 30 views)
Reply With Quote
  #2  
Old 10-23-2018, 20:21
tigerfish tigerfish is offline
Friend
 
Join Date: Dec 2017
Posts: 2
Rept. Given: 0
Rept. Rcvd 0 Times in 0 Posts
Thanks Given: 2
Thanks Rcvd at 0 Times in 0 Posts
tigerfish Reputation: 0
can it be uploaded to other site? thx
Reply With Quote
  #3  
Old 10-26-2018, 18:11
chants chants is offline
Friend
 
Join Date: Jul 2016
Posts: 198
Rept. Given: 0
Rept. Rcvd 9 Times in 8 Posts
Thanks Given: 147
Thanks Rcvd at 188 Times in 98 Posts
chants Reputation: 9
Probably you would include the file size as a pre-filter before filtering based on MD5 checksum. Otherwise this is the sort of inelegance that grinds away hard drives especially when huge files might be in that same directory. Since MD5 requires disk reading and is generally thereby expensive, it should not be treated so lightly. It should only be done when absolutely needed. Hence file size hint.
Reply With Quote
The Following User Says Thank You to chants For This Useful Post:
Elesty (11-05-2018)
  #4  
Old 10-29-2018, 01:52
ranadharm ranadharm is offline
Friend
 
Join Date: May 2012
Posts: 56
Rept. Given: 7
Rept. Rcvd 18 Times in 6 Posts
Thanks Given: 7
Thanks Rcvd at 9 Times in 7 Posts
ranadharm Reputation: 18
any chance to upload elsewhere ?
Reply With Quote
  #5  
Old 11-05-2018, 00:58
Elesty Elesty is offline
Friend
 
Join Date: Feb 2017
Posts: 9
Rept. Given: 0
Rept. Rcvd 0 Times in 0 Posts
Thanks Given: 9
Thanks Rcvd at 8 Times in 3 Posts
Elesty Reputation: 0
@chants: Thank you for your feedbacks

Version 2 with the following changelog:
-> Added a 4th optional argument MAX_FILE_SIZE_IN_MB, the md5 wont be computed is the file size in MB is larger than the MAX_FILE_SIZE_IN_MB specified.
-> If the 4th argument is not specified, all files md5 will be computed.

Code:
import os
import sys
import hashlib
import shutil

DEBUG_MODE=False

def get_filesize_mb(file_path):
  size_b = os.path.getsize(file_path)
  return size_b / 1048576 

def md5sum(fname):
  try:
    hash_md5 = hashlib.md5()
    with open(fname, "rb") as f:
      for chunk in iter(lambda: f.read(4096), b""):
        hash_md5.update(chunk)
    return hash_md5.hexdigest()
  except:
    pass
  return "ERROR"

if len(sys.argv) < 4:
  print("Usage: python replace.py FOLDER MD5_SUM_TO_FIND FILE_PATH_TO_REPLACE_BY [MAX_FILE_SIZE_IN_MB]")
  sys.exit(-1)

g_path = sys.argv[1]
md5_to_find = sys.argv[2].lower()
to_replace_by = sys.argv[3]

max_file_size = None
if len(sys.argv) >= 5:
  max_file_size = int(sys.argv[4])
  print("Maximum file size to check is %s MB" % sys.argv[4])

if not os.path.isfile(to_replace_by):
  print("Error: the path of the file to replace by does not exists")
  sys.exit(-1)

if __name__ == '__main__':
  for root, directories, filenames in os.walk(g_path):
    for filename in filenames:
      full_path = os.path.join(root, filename)
      fsize = get_filesize_mb(full_path)
      if max_file_size and get_filesize_mb(full_path) > max_file_size:
        # The current file size is too big, skipping it
        print("Skipping file [%s] with size %sMB" % (full_path, str(fsize)))
        continue
      # No maximum filesize specified, processing all files
      if max_file_size is None:
        checksum = md5sum(full_path)
        #print(full_path, md5sum(full_path))
        if not DEBUG_MODE and checksum == md5_to_find:
          print("Replacing [%s] by [%s]" % (full_path, to_replace_by))
          shutil.copy(to_replace_by, full_path)
        elif checksum == md5_to_find:
          print("Should replace [%s] by [%s]" %  (full_path, to_replace_by))
Attached Files
File Type: 7z replacer_v2.7z (4.81 MB, 3 views)

Last edited by Elesty; 11-05-2018 at 01:04.
Reply With Quote
The Following User Says Thank You to Elesty For This Useful Post:
uel888 (11-08-2018)
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



All times are GMT +8. The time now is 10:55.


ICP05004977
Always Your Best Friend: Aaron, JMI, ahmadmansoor, ZeNiX