inject.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # made by hazukie
  2. # date: 2024.4.13
  3. # JUST FOR LEARNING PURPOSES, DON'T USE THIS TO CRACK SOFTWARE.
  4. # 只是出于学习目的,请勿将其用于破解软件,否则后果自负。用户行为均与本项目作者无关!
  5. ###------配置开始------###
  6. # 为什么有 <嵌入特性>呢?
  7. # 其实就是:
  8. # 是否注入一个带有 log 打印日志功能的 hook 文件
  9. # 这样子便于我们在启动 Typora 时观察 待拦截的函数是否拦截
  10. # 注意:
  11. # 该特性默认开启,
  12. # 想要不开启的话设置 embed_mode=False
  13. # 是否开启嵌入特性
  14. embed_mode = True
  15. # 如果关闭<嵌入特性(EMBED)>,该 JS 文件将在运行时被使用
  16. NO_EMBED_HOOK_JS_PATH = "./src/hook.js"
  17. # 开启<嵌入特性>时: 待注入数据文件
  18. EMBED_HOOK_JS_PATH = "./src/hooklog.js"
  19. ### Typora 安装路径
  20. TYPORA_INSTALLED_PATH="/usr/share/typora"
  21. # 注入 JS 文件的待解压缩包路径
  22. INJECT_JS_DIR_ASAR_PATH = TYPORA_INSTALLED_PATH+"/resources/node_modules.asar"
  23. # 为安全起见,特意复制至当前目录下
  24. BUILD_DIR="./build"
  25. BACKUP_DIR='./build/backup'
  26. # 注入 JS 文件的待解压缩包路径
  27. CUR_INJECT_JS_DIR_ASAR_PATH = "./build/node_modules.asar"
  28. # 注入 JS 文件的文件夹路径
  29. INJECT_JS_DIR_PATH = BUILD_DIR+"/node"
  30. # 注入 JS 文件路径
  31. HOOK_JS_WRITE_PATH = INJECT_JS_DIR_PATH+"/raven/hook.js"
  32. # 注入JS文件的目的文件路径
  33. INJECT_JS_PATH = INJECT_JS_DIR_PATH+"/raven/index.js"
  34. ###------配置结束------###
  35. import os
  36. import sys
  37. # 判断文件是否存在
  38. # file_path: 文件名
  39. def file_exist(file_path):
  40. return os.path.exists(file_path)
  41. def file_mkdir(dpath):
  42. if not os.path.exists(dpath):
  43. os.mkdir(dpath)
  44. # 若开启<嵌入特性>,则将会使用该函数
  45. # 注入数据
  46. def embed_write_js2file():
  47. EMBED_HOOK_JS_BYTES=open(EMBED_HOOK_JS_PATH,'r+')
  48. with open(HOOK_JS_WRITE_PATH, "wb+") as f:
  49. f.write(EMBED_HOOK_JS_BYTES.read().encode())
  50. EMBED_HOOK_JS_BYTES.close()
  51. # 若关闭<嵌入特性>,则将会使用该函数
  52. def no_embed_write_js2file():
  53. NO_EMBED_HOOK_JS_BYTES = open(NO_EMBED_HOOK_JS_PATH,'r+')
  54. with open(HOOK_JS_WRITE_PATH, "wb+") as f:
  55. f.write(NO_EMBED_HOOK_JS_BYTES.read().encode())
  56. NO_EMBED_HOOK_JS_BYTES.close()
  57. # 给目的文件中追加一行 "require('./hook')",
  58. # 实现在 Typora 运行时调用注入JS文件
  59. def append_require2file():
  60. with open(INJECT_JS_PATH, "a+") as f:
  61. f.write("\nrequire('./hook')")
  62. # 打印警告日志
  63. def warning(strs):
  64. print("\033[31m%s\033[0m" % strs)
  65. # 打印日志
  66. def infos(strs):
  67. print("\033[32m%s\033[0m" % strs)
  68. if __name__ == "__main__":
  69. check_node='type node'
  70. if os.system(check_node)!=0:
  71. warning('未找到 node')
  72. sys.exit(0)
  73. else:
  74. infos('找到 node')
  75. infos("Typora 安装路径: "+TYPORA_INSTALLED_PATH)
  76. file_mkdir(BUILD_DIR)
  77. file_mkdir(BACKUP_DIR)
  78. if file_exist(INJECT_JS_DIR_PATH):
  79. warning('您可能已经注入过 hook 文件了!\n警告:在当前目录下发现 node 文件夹')
  80. infos('您若不确定之前是否注入过该文件的话,请手动删除当前目录下的 node 文件夹(%s)!'%INJECT_JS_DIR_PATH)
  81. sys.exit(0)
  82. if not file_exist(INJECT_JS_DIR_ASAR_PATH):
  83. warning('未找到 node_modules.asar !')
  84. warning('请确认 Typora 安装目录下是否正确!!')
  85. sys.exit(0)
  86. infos('正在复制%s 至 当前目录下(%s)' % (INJECT_JS_DIR_ASAR_PATH,CUR_INJECT_JS_DIR_ASAR_PATH))
  87. if os.system('sudo cp %s %s' %(INJECT_JS_DIR_ASAR_PATH,CUR_INJECT_JS_DIR_ASAR_PATH))==0:
  88. print('复制成功!')
  89. os.system('cp %s %s'%(CUR_INJECT_JS_DIR_ASAR_PATH,BACKUP_DIR))
  90. else:
  91. print('当执行 %s 时发生错误' % ('sudo cp %s %s' %(INJECT_JS_DIR_ASAR_PATH,CUR_INJECT_JS_DIR_ASAR_PATH)))
  92. sys.exit(0)
  93. infos('正在解压 node_modues.asar')
  94. rphrase='node ./asar_modules/node_modules/@electron/asar/bin/asar.js extract %s %s'%(CUR_INJECT_JS_DIR_ASAR_PATH,INJECT_JS_DIR_PATH)
  95. ret=os.popen(rphrase)
  96. warning(ret.read())
  97. infos('成功解压至 node 文件夹中!')
  98. infos('正在将 hook.js 添加至 node 文件夹中...')
  99. infos('正在将依赖添加到 node/raven/index.js...')
  100. if embed_mode:
  101. embed_write_js2file()
  102. else:
  103. no_embed_write_js2file()
  104. append_require2file()
  105. infos('添加 hook.js 成功!')
  106. infos('依赖添加到 node/raven/index.js 成功!')
  107. infos('正在重新打包 node 文件夹至 node_modules.asar...')
  108. phrase='rm %s;node ./asar_modules/node_modules/@electron/asar/bin/asar.js pack %s %s'% (CUR_INJECT_JS_DIR_ASAR_PATH,INJECT_JS_DIR_PATH,CUR_INJECT_JS_DIR_ASAR_PATH)
  109. ret2=os.popen(phrase)
  110. warning(ret2.read())
  111. infos('打包完成!')
  112. warning("###### 正在将 $CUR_INJECT_ASAR_PATH 移动至 $INJECT_JS_DIR_ASAR_PATH ######")
  113. do_cp_p='sudo cp %s %s'%(CUR_INJECT_JS_DIR_ASAR_PATH,INJECT_JS_DIR_ASAR_PATH)
  114. do_cp_ret=os.popen(do_cp_p)
  115. warning(do_cp_ret.read())
  116. warning("若执行当前脚本后不能正常打开软件的话,则请执行以下命令还原:")
  117. warning("\tcp ./build/backup/node_modules.asar %s\n" %(INJECT_JS_DIR_ASAR_PATH))
  118. infos("您的序列号为:")
  119. infos("\tLSGDW2-6M43UN-KHKH2A-D6FDJF")
  120. infos("\tD9KYN9-MCCL2F-59LFPC-NK2CPX\n")
  121. warning("如果激活失败,恐怕您还得安装 rust 环境并使用 license-gen/target/debug/license-gen 生成新的序列号")