Advertisement
Guest User

inject.py

a guest
Jul 10th, 2013
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.62 KB | None | 0 0
  1. f = open('feria.lsr', 'rb')
  2. x = f.read()
  3. f.close()
  4.  
  5. # Position of the strings data segment
  6. pos = x[0x2c] | x[0x2d]<<8 | x[0x2e]<<16 | x[0x2f]<<24
  7. # Length of the original segment
  8. l = x[pos] | x[pos+1]<<8 | x[pos+2]<<16 | x[pos+3]<<24
  9. # Number of 0-separated strings that should follow this number
  10. num = x[pos+4] | x[pos+5]<<8 | x[pos+6]<<16 | x[pos+7]<<24
  11.  
  12. f = open('feria.txt', 'rb')
  13. # Strip for newlines being added by text editors
  14. y = f.read().strip()
  15. f.close()
  16.  
  17. s = y.split(b'\r\n|\r\n')
  18. if len(s) != num:
  19.   print("Warning: expected %d strings, got %d!" %(num, len(s)))
  20.  
  21. # Re-encode all strings
  22. for i in range(len(s)):
  23.   j = s[i]
  24.   try:
  25.     j = j.decode('utf-8')
  26.   except:
  27.     print("Could not read item %d ('%s') as UTF-8" % (i, s[i]))
  28.     exit()
  29.   try:
  30.     j = j.encode('shift-jis')
  31.   except:
  32.     print("Could not encode item %d ('%s') as Shift-JIS" % (i, s[i]))
  33.     exit()
  34.   s[i] = j + b'\0'
  35.  
  36. s = b''.join(s)
  37. newLen = len(s)
  38. offset = newLen - l
  39.  
  40. # Add the offset to known data pointers that point to data after strings
  41. # 0x30 up to (and excluding) 0x64 are 32-bit integers pointing to
  42. # locations after the strings.
  43. b = list(x[:pos+8])
  44. for i in range(0x30, 0x64, 4):
  45.   v = b[i] | b[i+1]<<8 | b[i+2]<<16 | b[i+3]<<24
  46.   v += offset
  47.   b[i] = v & 0xff
  48.   b[i+1] = (v & 0xff00) >> 8
  49.   b[i+2] = (v & 0xff0000) >> 16
  50.   b[i+3] = (v & 0xff000000) >> 24
  51.  
  52. b[pos] = newLen & 0xff
  53. b[pos+1] = (newLen & 0xff00) >> 8
  54. b[pos+2] = (newLen & 0xff0000) >> 16
  55. b[pos+3] = (newLen & 0xff000000) >> 24
  56.  
  57. header = bytes(b)
  58. footer = x[pos+l+8:]
  59.  
  60. f = open('feria_injected.lsr', 'wb')
  61. f.write(header + s + footer)
  62. f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement