inject.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. # made by hazukie
  2. # date: 2024.4.13
  3. ###------配置开始------###
  4. # 为什么有 <嵌入特性>呢?
  5. # 其实就是:
  6. # 是否注入一个带有 log 打印日志功能的 hook 文件
  7. # 这样子便于我们在启动 Typora 时观察 待拦截的函数是否拦截
  8. # 注意:
  9. # 该特性默认开启,
  10. # 想要不开启的话设置 embed_mode=False
  11. # 是否开启嵌入特性
  12. embed_mode = True
  13. # 如果关闭<嵌入特性(EMBED)>,该 JS 文件将在运行时被使用
  14. NO_EMBED_HOOK_JS_PATH = "./src/hook.js"
  15. # 开启<嵌入特性>时: 待注入数据文件
  16. EMBED_HOOK_JS_PATH = "./src/hooklog.js"
  17. ### Typora 安装路径
  18. TYPORA_INSTALLED_PATH="/usr/share/typora"
  19. # 注入 JS 文件路径
  20. HOOK_JS_WRITE_PATH = TYPORA_INSTALLED_PATH+"/node/raven/hook.js"
  21. # 注入 JS 文件的待解压缩包路径
  22. INJECT_JS_DIR_ASAR_PATH =TYPORA_INSTALLED_PATH+"/resources/node_modules.asar"
  23. # 注入 JS 文件的文件夹路径
  24. INJECT_JS_DIR_PATH = TYPORA_INSTALLED_PATH+"/node"
  25. # 注入JS文件的目的文件路径
  26. INJECT_JS_PATH = TYPORA_INSTALLED_PATH+"/node/raven/index.js"
  27. ###------配置结束------###
  28. import os
  29. import sys
  30. # 判断文件是否存在
  31. # file_path: 文件名
  32. def file_exist(file_path):
  33. return os.path.exists(file_path)
  34. # 若开启<嵌入特性>,则将会使用该函数
  35. # 注入数据
  36. def embed_write_js2file():
  37. EMBED_HOOK_JS_BYTES=open(EMBED_HOOK_JS_PATH,'r+')
  38. with open(HOOK_JS_WRITE_PATH, "wb+") as f:
  39. f.write(EMBED_HOOK_JS_BYTES.read().encode())
  40. EMBED_HOOK_JS_BYTES.close()
  41. # 若关闭<嵌入特性>,则将会使用该函数
  42. def no_embed_write_js2file():
  43. NO_EMBED_HOOK_JS_BYTES = open(NO_EMBED_HOOK_JS_PATH,'r+')
  44. with open(HOOK_JS_WRITE_PATH, "wb+") as f:
  45. f.write(NO_EMBED_HOOK_JS_BYTES.read().encode())
  46. NO_EMBED_HOOK_JS_BYTES.close()
  47. # 给目的文件中追加一行 "require('./hook')",
  48. # 实现在 Typora 运行时调用注入JS文件
  49. def append_require2file():
  50. with open(INJECT_JS_PATH, "a+") as f:
  51. f.write("\nrequire('./hook')")
  52. # 打印警告日志
  53. def warning(strs):
  54. print("\033[31m%s\033[0m" % strs)
  55. # 打印日志
  56. def infos(strs):
  57. print("\033[32m%s\033[0m" % strs)
  58. if __name__ == "__main__":
  59. warning("您需要使用 sudo python inject.py 运行!")
  60. infos("Typora 安装路径: "+TYPORA_INSTALLED_PATH)
  61. if file_exist(INJECT_JS_DIR_PATH):
  62. warning('您可能已经注入过 hook 文件了!\n警告:在当前目录下发现 node 文件夹')
  63. infos('您若不确定之前是否注入过该文件的话,请手动删除当前目录下的 node 文件夹(%s)!'%INJECT_JS_DIR_PATH)
  64. sys.exit(0)
  65. if not file_exist(INJECT_JS_DIR_ASAR_PATH):
  66. warning('未找到 node_modules.asar !')
  67. warning('请将我(inject.py) 移动到 Typora 安装目录下!')
  68. sys.exit(0)
  69. infos('正在解压 node_modues.asar')
  70. rphrase='sudo node ./asar_modules/node_modules/@electron/asar/bin/asar.js extract %s %s'%(INJECT_JS_DIR_ASAR_PATH,INJECT_JS_DIR_PATH)
  71. infos(rphrase)
  72. ret=os.popen(rphrase)
  73. warning(ret.read())
  74. infos('成功解压至 node 文件夹中!')
  75. infos('正在将 hook.js 添加至 node 文件夹中...')
  76. infos('正在将依赖添加到 node/raven/index.js...')
  77. if embed_mode:
  78. embed_write_js2file()
  79. else:
  80. no_embed_write_js2file()
  81. append_require2file()
  82. infos('添加 hook.js 成功!')
  83. infos('依赖添加到 node/raven/index.js 成功!')
  84. infos('正在重新打包 node 文件夹至 node_modules.asar...')
  85. phrase='sudo node ./asar_modules/node_modules/@electron/asar/bin/asar.js pack %s %s'% (INJECT_JS_DIR_PATH,INJECT_JS_DIR_ASAR_PATH)
  86. infos(phrase)
  87. ret2=os.popen(phrase)
  88. warning(ret2.read())
  89. infos('打包完成!')