mirror of
https://github.com/Mas0nShi/typoraCracker.git
synced 2023-07-10 13:41:20 +08:00
Compare commits
30 Commits
auto-analy
...
1.2.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c984fd06c0 | ||
|
|
b8f870e55f | ||
|
|
4d635ec11f | ||
|
|
2d106c7e48 | ||
|
|
8f070902e0 | ||
|
|
f9bb673a51 | ||
|
|
8ee3a91b18 | ||
|
|
c262491d67 | ||
|
|
2ff0a25c1f | ||
|
|
785b3bcd49 | ||
|
|
40a95424b0 | ||
|
|
cd28ff03d9 | ||
|
|
7aaba1739a | ||
|
|
7d73c08257 | ||
|
|
d2fd9f12bf | ||
|
|
142367e963 | ||
|
|
7e1916e8e9 | ||
|
|
fe77785833 | ||
|
|
53a9057a2c | ||
|
|
1df0199b91 | ||
|
|
9b298bc024 | ||
|
|
029a4a344f | ||
|
|
3e690f077d | ||
|
|
5c518c7ab8 | ||
|
|
fc578afd40 | ||
|
|
4b3cfee43f | ||
|
|
9369288989 | ||
|
|
d90f36ba80 | ||
|
|
6c5039c632 | ||
|
|
f44e9355fb |
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
- OS: [e.g. Ubuntu]
|
||||||
|
- Version [e.g. 1.1.2]
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
135
.github/workflows/manual.yml
vendored
Normal file
135
.github/workflows/manual.yml
vendored
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
# This is a basic workflow that is manually triggered
|
||||||
|
|
||||||
|
name: Manual workflow
|
||||||
|
|
||||||
|
# Controls when the action will run. Workflow runs when manually triggered using the UI
|
||||||
|
# or API.
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '23 21 * * 1'
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "greet"
|
||||||
|
check_version:
|
||||||
|
name: check the latest version
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
outputs:
|
||||||
|
RELEASE_VERSION: ${{ steps.getLatestRelease.outputs.RELEASE_VERSION }}
|
||||||
|
LATEST_VERSION: ${{ steps.checkVersion.outputs.LATEST_VERSION }}
|
||||||
|
steps:
|
||||||
|
- name: Get Latest Release
|
||||||
|
id: getLatestRelease
|
||||||
|
uses: actions/github-script@v3.1.0
|
||||||
|
with:
|
||||||
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
script: |
|
||||||
|
const releaseResponse = await github.repos.getLatestRelease({
|
||||||
|
owner: 'Mas0nShi',
|
||||||
|
repo: 'typoraCracker',
|
||||||
|
})
|
||||||
|
const {
|
||||||
|
data: { tag_name: ver }
|
||||||
|
} = releaseResponse;
|
||||||
|
core.setOutput('RELEASE_VERSION', ver);
|
||||||
|
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: '3.8' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||||
|
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||||
|
- name: install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && DEBIAN_FRONTEND=noninteractive sudo apt-get install innoextract -y
|
||||||
|
python3 -m pip install loguru
|
||||||
|
|
||||||
|
- name: Check Latest Version
|
||||||
|
id: checkVersion
|
||||||
|
run: |
|
||||||
|
python3 auto-analysis/check_version.py
|
||||||
|
output="$(cat auto-analysis/win/x64/LATEST_VERSION)"
|
||||||
|
echo "$output"
|
||||||
|
echo "::set-output name=LATEST_VERSION::$output"
|
||||||
|
|
||||||
|
create_release:
|
||||||
|
needs: check_version
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
if: needs.check_version.outputs.RELEASE_VERSION != needs.check_version.outputs.LATEST_VERSION
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- run: echo '${{ needs.check_version.outputs.LATEST_VERSION }}'
|
||||||
|
|
||||||
|
- name: Create Runner Release
|
||||||
|
uses: actions/create-release@v1
|
||||||
|
id: createRelease
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||||
|
with:
|
||||||
|
tag_name: '${{ needs.check_version.outputs.LATEST_VERSION }}'
|
||||||
|
release_name: '${{ needs.check_version.outputs.LATEST_VERSION }}'
|
||||||
|
prerelease: false
|
||||||
|
|
||||||
|
|
||||||
|
patch_file:
|
||||||
|
needs: [check_version, create_release]
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
if: needs.check_version.outputs.RELEASE_VERSION != needs.check_version.outputs.LATEST_VERSION
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: '3.8' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||||
|
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||||
|
- name: install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && DEBIAN_FRONTEND=noninteractive sudo apt-get install innoextract cmake -y
|
||||||
|
python3 -m pip install r2pipe loguru
|
||||||
|
|
||||||
|
- name: build radare2
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
git clone https://github.com/radareorg/radare2
|
||||||
|
radare2/sys/install.sh
|
||||||
|
|
||||||
|
- name: patch version
|
||||||
|
|
||||||
|
run: |
|
||||||
|
python3 auto-analysis/patch.py
|
||||||
|
tar -zcvf auto-analysis/win/x64/build/typoraCracker.tar.gz auto-analysis/win/x64/build/*
|
||||||
|
|
||||||
|
- name: Check release version
|
||||||
|
id: checkReleaseVersion
|
||||||
|
uses: actions/github-script@v3.1.0
|
||||||
|
with:
|
||||||
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
script: |
|
||||||
|
try {
|
||||||
|
const releaseVersion = '${{ needs.check_version.outputs.LATEST_VERSION }}'
|
||||||
|
const releaseResponse = await github.repos.getReleaseByTag({
|
||||||
|
owner: 'Mas0nShi',
|
||||||
|
repo: 'typoraCracker',
|
||||||
|
tag: releaseVersion
|
||||||
|
})
|
||||||
|
const {
|
||||||
|
data: { id: releaseId, html_url: htmlUrl, upload_url: uploadUrl }
|
||||||
|
} = releaseResponse;
|
||||||
|
core.setOutput('id', releaseId);
|
||||||
|
core.setOutput('html_url', htmlUrl);
|
||||||
|
core.setOutput('upload_url', uploadUrl);
|
||||||
|
core.setOutput('version', releaseVersion);
|
||||||
|
} catch (e) {
|
||||||
|
core.setFailed(e.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Upload win x64 typora.py for typoraCracker
|
||||||
|
uses: actions/upload-release-asset@v1.0.2
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
upload_url: '${{ steps.checkReleaseVersion.outputs.upload_url }}'
|
||||||
|
asset_path: '${{ github.workspace }}/auto-analysis/win/x64/build/typoraCracker.tar.gz'
|
||||||
|
asset_name: 'typoraCracker-${{ needs.check_version.outputs.LATEST_VERSION }}-win-x64.tar.gz'
|
||||||
|
asset_content_type: application/x-tgz
|
||||||
|
|
||||||
30
README.md
30
README.md
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||

|

|
||||||

|

|
||||||
[](https://github.com/Mas0nShi/typoraCracker/actions/workflows/manual.yml)
|
|
||||||
|
|
||||||
A extract & decryption and pack & encryption tools for typora.
|
A extract & decryption and pack & encryption tools for typora.
|
||||||
|
|
||||||
@@ -21,28 +20,17 @@ ANY PROBLEMS ARISING FROM THIS WILL BE BORNE BY THE USER (YOU).
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Supports Version 1.0.0 - 1.2.0 [(old archive)](https://github.com/Mas0nShi/typoraCracker/tree/backup-raw)
|
- Supports Version 1.0.0+ (At least for now.)
|
||||||
- Supports Version 1.2.+ [(Experimental archive)](https://github.com/Mas0nShi/typoraCracker/tree/master)
|
- tested fine in Windows, Ubuntu
|
||||||
|
|
||||||
## Support List
|
|
||||||
2022.4.4: Experimental support for automatic binary analysis to generate scripts. (v1.2.+)
|
|
||||||
|
|
||||||
| OS / ARCH | x86 | x64 | arm64 |
|
|
||||||
|:---------:|:---:|:---:|:-----:|
|
|
||||||
| win | ✅ | ✅ | ❌ |
|
|
||||||
| linux | ❌ | ❌ | ❌ |
|
|
||||||
| macOS | ❌ | ❌ | ❌ |
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
1. download in [Release Pages](https://github.com/Mas0nShi/typoraCracker/releases)
|
|
||||||
2. unzip
|
1. `pip install -r requirements.txt`
|
||||||
3. `pip install -r requirements.txt`
|
2. `python typora.py --help`
|
||||||
4. `python typora.py --help`
|
3. read and use.
|
||||||
5. read and use.
|
4. do something.
|
||||||
6. do something.
|
5. pack and replace app.asar.
|
||||||
7. pack and replace app.asar.
|
6. enjoy it.
|
||||||
8. enjoy it.
|
|
||||||
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|||||||
28
README_CN.md
28
README_CN.md
@@ -15,30 +15,18 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- 版本 1.0.0 - 1.2.0 [(使用旧的存档)](https://github.com/Mas0nShi/typoraCracker/tree/backup-raw)
|
|
||||||
- 版本 1.2.+ [(使用测试存档)](https://github.com/Mas0nShi/typoraCracker/tree/master)
|
|
||||||
|
|
||||||
|
|
||||||
## Support List
|
|
||||||
2022.4.4: 支持自动化分析二进制文件并生成脚本(测试性功能 v1.2.+)
|
|
||||||
|
|
||||||
| OS / ARCH | x86 | x64 | arm64 |
|
|
||||||
|:---------:|:---:|:---:|:-----:|
|
|
||||||
| win | ✅ | ✅ | ❌ |
|
|
||||||
| linux | ❌ | ❌ | ❌ |
|
|
||||||
| macOS | ❌ | ❌ | ❌ |
|
|
||||||
|
|
||||||
|
- 支持版本1.0.0以上(至少现在是这样)
|
||||||
|
- 测试通过平台:Win/Ubuntu
|
||||||
|
|
||||||
## 食用方式
|
## 食用方式
|
||||||
|
|
||||||
1. 前往[Release Pages](https://github.com/Mas0nShi/typoraCracker/releases) 下载对应版本
|
1. `pip install -r requirements.txt`
|
||||||
2. 解压
|
2. `python typora.py --help`
|
||||||
3. 安装依赖:`pip install -r requirements.txt`
|
3. 阅读帮助文档及使用。
|
||||||
4. 使用说明:`python typora.py --help`
|
4. 做你想做的事。
|
||||||
5. 使用。
|
5. 打包并替换原目录下的 app.asar。
|
||||||
6. 做你想做的事。
|
6. 享受成果。
|
||||||
7. 打包并替换原目录下的 app.asar。
|
|
||||||
8. 享受成果。
|
|
||||||
|
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
|
|||||||
@@ -1,23 +1,22 @@
|
|||||||
from utils import get_version, download_file, extract_file, log
|
from utils import get_version, download_file, extract_file, log, DOWNLOAD_LINK
|
||||||
from config import DOWNLOAD_LINK
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
BASE_DIR = os.path.dirname(__file__)
|
BASE_DIR = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
|
||||||
def run_version(download_os, download_arch):
|
def win_x64_version():
|
||||||
from_url = DOWNLOAD_LINK[download_os][download_arch]
|
url = DOWNLOAD_LINK["win"]["x64"]
|
||||||
to_dir = os.path.join(BASE_DIR, f"{download_os}/{download_arch}")
|
dir = os.path.join(BASE_DIR, "win/x64")
|
||||||
|
|
||||||
download_path = os.path.join(to_dir, os.path.basename(from_url))
|
download_path = os.path.join(dir, os.path.basename(url))
|
||||||
download_file(from_url, download_path)
|
download_file(url, download_path)
|
||||||
extract_file(download_path, to_dir)
|
extract_file(download_path, dir)
|
||||||
version = get_version(to_dir)
|
version = get_version(dir)
|
||||||
open(os.path.join(to_dir, "LATEST_VERSION"), "w").write(version)
|
|
||||||
log.success(f"{download_os}-{download_arch} the latest version is {version}")
|
open(os.path.join(dir, "LATEST_VERSION"), "w").write(version)
|
||||||
|
log.success(version)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
run_version("win", "x64")
|
win_x64_version()
|
||||||
# run_version("win", "x86")
|
|
||||||
# run_version("linux", "x64")
|
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
# -*- coding:utf-8 -*-
|
|
||||||
"""
|
|
||||||
@Author: Mas0n
|
|
||||||
@File: config.py
|
|
||||||
@Time: 2022/4/4 19:50
|
|
||||||
@Desc: It's all about getting better.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
DOWNLOAD_LINK = {
|
|
||||||
"win": {
|
|
||||||
"x86": "https://typora.io/windows/typora-setup-ia32.exe",
|
|
||||||
"x64": "https://typora.io/windows/typora-setup-x64.exe",
|
|
||||||
"arm64": "https://typora.io/windows/typora-setup-arm64.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"x64": "https://download.typora.io/linux/Typora-linux-x64.tar.gz",
|
|
||||||
"arm64": "https://download.typora.io/linux/Typora-linux-arm64.tar.gz",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# -*- coding:utf-8 -*-
|
|
||||||
"""
|
|
||||||
@Author: Mas0n
|
|
||||||
@Name: typora_linux_x64_analysis
|
|
||||||
@Time: 2022/4/4 19:48
|
|
||||||
@Desc: It's all about getting better.
|
|
||||||
"""
|
|
||||||
import json
|
|
||||||
import r2pipe
|
|
||||||
|
|
||||||
|
|
||||||
def get_aes_key_and_iv(file_path):
|
|
||||||
r = r2pipe.open(file_path)
|
|
||||||
|
|
||||||
r.cmd("aaa")
|
|
||||||
regex = r.cmdj("axtj @@ str.base64")
|
|
||||||
assert len(regex) == 1
|
|
||||||
|
|
||||||
func = regex[0]["fcn_name"]
|
|
||||||
r.cmd(f"s {func}")
|
|
||||||
asm = r.cmdj("pdfj")['ops']
|
|
||||||
assert len(asm) != 0
|
|
||||||
|
|
||||||
if 'str.dip3' in json.dumps(asm):
|
|
||||||
r.cmd('s str.dip3 - 32')
|
|
||||||
data = r.cmdj('xj 48')
|
|
||||||
key = bytearray(data[0:32])
|
|
||||||
iv = bytearray(data[32:48])
|
|
||||||
else:
|
|
||||||
raise "need rewrite scripts for linux x64"
|
|
||||||
|
|
||||||
return key, iv
|
|
||||||
@@ -8,7 +8,5 @@
|
|||||||
import utils
|
import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.win_x86_run()
|
|
||||||
utils.win_x64_run()
|
utils.win_x64_run()
|
||||||
utils.linux_x64_run()
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,27 @@
|
|||||||
@Desc: It's all about getting better.
|
@Desc: It's all about getting better.
|
||||||
"""
|
"""
|
||||||
from loguru import logger as log
|
from loguru import logger as log
|
||||||
from config import DOWNLOAD_LINK
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# innoextract
|
||||||
|
#
|
||||||
BASE_DIR = os.path.dirname(__file__)
|
BASE_DIR = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
DOWNLOAD_LINK = {
|
||||||
|
"win": {
|
||||||
|
"x86": "https://typora.io/windows/typora-setup-ia32.exe",
|
||||||
|
"x64": "https://typora.io/windows/typora-setup-x64.exe",
|
||||||
|
"arm": "https://typora.io/windows/typora-setup-arm64.exe",
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"x64": "https://download.typora.io/linux/Typora-linux-x64.tar.gz",
|
||||||
|
"arm": "https://download.typora.io/linux/Typora-linux-arm64.tar.gz",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_version(to_path):
|
def get_version(to_path):
|
||||||
package_file_path = os.path.join(to_path, "app/resources/package.json")
|
package_file_path = os.path.join(to_path, "app/resources/package.json")
|
||||||
@@ -44,7 +57,10 @@ def patch_file(_key, _iv, to_dir):
|
|||||||
open(patch_file_path, "w").write(content)
|
open(patch_file_path, "w").write(content)
|
||||||
|
|
||||||
|
|
||||||
def scheduler(func, basedir, link):
|
def win_x64_run():
|
||||||
|
from win.x64 import analysis
|
||||||
|
basedir = os.path.join(BASE_DIR, "win/x64")
|
||||||
|
link = DOWNLOAD_LINK["win"]["x64"]
|
||||||
|
|
||||||
download_path = os.path.join(basedir, os.path.basename(link))
|
download_path = os.path.join(basedir, os.path.basename(link))
|
||||||
log.info(f"downloading from {link}")
|
log.info(f"downloading from {link}")
|
||||||
@@ -55,35 +71,24 @@ def scheduler(func, basedir, link):
|
|||||||
log.info("preparation stage completed")
|
log.info("preparation stage completed")
|
||||||
main_node_path = os.path.join(basedir, "app/resources/app.asar.unpacked/main.node")
|
main_node_path = os.path.join(basedir, "app/resources/app.asar.unpacked/main.node")
|
||||||
log.info("auto analysis start")
|
log.info("auto analysis start")
|
||||||
key, iv = func.get_aes_key_and_iv(main_node_path)
|
key, iv = analysis.get_aes_key_and_iv(main_node_path)
|
||||||
log.success("analysis done")
|
log.success("analysis done")
|
||||||
|
|
||||||
patch_file(key.hex(), iv.hex(), basedir)
|
patch_file(key.hex(), iv.hex(), basedir)
|
||||||
log.success("patch done")
|
log.success("patch done")
|
||||||
|
|
||||||
|
|
||||||
def win_x64_run():
|
|
||||||
from win.x64 import analysis
|
|
||||||
dirs = os.path.join(BASE_DIR, "win/x64")
|
|
||||||
url = DOWNLOAD_LINK["win"]["x64"]
|
|
||||||
scheduler(func=analysis, basedir=dirs, link=url)
|
|
||||||
|
|
||||||
|
|
||||||
def win_x86_run():
|
|
||||||
from win.x86 import analysis
|
|
||||||
dirs = os.path.join(BASE_DIR, "win/x86")
|
|
||||||
url = DOWNLOAD_LINK["win"]["x86"]
|
|
||||||
scheduler(func=analysis, basedir=dirs, link=url)
|
|
||||||
|
|
||||||
|
|
||||||
def linux_x64_run():
|
|
||||||
from linux.x64 import analysis
|
|
||||||
dirs = os.path.join(BASE_DIR, "linux/x64")
|
|
||||||
url = DOWNLOAD_LINK["linux"]["x64"]
|
|
||||||
scheduler(func=analysis, basedir=dirs, link=url)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
win_x86_run()
|
|
||||||
win_x64_run()
|
win_x64_run()
|
||||||
linux_x64_run()
|
|
||||||
|
# hashString = open("LATEST_VERSION", "r").read()
|
||||||
|
# if hashString == "":
|
||||||
|
# log.info("not history for typora version")
|
||||||
|
# exit()
|
||||||
|
|
||||||
|
# basedir = os.path.dirname(__file__)
|
||||||
|
# for h1 in DOWNLOAD_LINK.keys():
|
||||||
|
# h1dir = os.path.join(basedir, h1)
|
||||||
|
# for h2 in DOWNLOAD_LINK.get(h1).keys():
|
||||||
|
# h2dir = os.path.join(h1dir, h2)
|
||||||
|
# print(h2dir)
|
||||||
|
|||||||
@@ -9,30 +9,29 @@ import struct
|
|||||||
import r2pipe
|
import r2pipe
|
||||||
|
|
||||||
|
|
||||||
def regex_key_iv(asm_obj):
|
|
||||||
asm_regex = []
|
|
||||||
for body in asm_obj:
|
|
||||||
if "=[4]" in body["esil"] and body['type'] == 'mov':
|
|
||||||
opcode, value = body["disasm"].split(", ")
|
|
||||||
if "0x" in value:
|
|
||||||
asm_regex.append({"opcode": opcode, "value": value})
|
|
||||||
return asm_regex
|
|
||||||
|
|
||||||
|
|
||||||
def get_aes_key_and_iv(file_path):
|
def get_aes_key_and_iv(file_path):
|
||||||
r = r2pipe.open(file_path)
|
r = r2pipe.open(file_path)
|
||||||
|
# auto analysis
|
||||||
r.cmd("aaa")
|
r.cmd("aaa")
|
||||||
|
# string "base64" x-cross reference
|
||||||
regex = r.cmdj("axtj @@ str.base64")
|
regex = r.cmdj("axtj @@ str.base64")
|
||||||
assert len(regex) == 1
|
assert len(regex) == 1
|
||||||
|
|
||||||
func = regex[0]["fcn_name"]
|
func = regex[0]["fcn_name"]
|
||||||
|
# disasm func
|
||||||
r.cmd(f"s {func}")
|
r.cmd(f"s {func}")
|
||||||
asm = r.cmdj("pdfj")['ops']
|
asm = r.cmdj("pdfj")['ops']
|
||||||
assert len(asm) != 0
|
assert len(asm) != 0
|
||||||
|
|
||||||
asm_regex = regex_key_iv(asm)
|
asm_regex = []
|
||||||
|
for body in asm:
|
||||||
|
if "=[4]" in body["esil"] and body['type'] == 'mov':
|
||||||
|
opcode, value = body["disasm"].split(", ")
|
||||||
|
asm_regex.append({"opcode": opcode, "value": value})
|
||||||
|
|
||||||
assert len(asm_regex) == 12
|
assert len(asm_regex) == 12
|
||||||
|
|
||||||
iv = struct.pack("<4L", *[int(asm_regex[i]['value'], 16) for i in range(4)])
|
iv = struct.pack("<4L", *[int(asm_regex[i]['value'], 16) for i in range(4)])
|
||||||
key = struct.pack("<8L", *[int(asm_regex[i]['value'], 16) for i in range(4, 12)])
|
key = struct.pack("<8L", *[int(asm_regex[i]['value'], 16) for i in range(4, 12)])
|
||||||
|
# print(key, iv)
|
||||||
return key, iv
|
return key, iv
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# -*- coding:utf-8 -*-
|
|
||||||
"""
|
|
||||||
@Author: Mas0n
|
|
||||||
@Name: typora_win_x86_analysis
|
|
||||||
@Time: 2022/4/3 18:36
|
|
||||||
@Desc: It's all about getting better.
|
|
||||||
"""
|
|
||||||
import struct
|
|
||||||
import r2pipe
|
|
||||||
|
|
||||||
|
|
||||||
def regex_key_iv(asm_obj):
|
|
||||||
asm_regex = []
|
|
||||||
for body in asm_obj:
|
|
||||||
if "=[4]" in body["esil"] and body['type'] == 'mov':
|
|
||||||
opcode, value = body["disasm"].split(", ")
|
|
||||||
if "0x" in value:
|
|
||||||
asm_regex.append({"opcode": opcode, "value": value})
|
|
||||||
return asm_regex
|
|
||||||
|
|
||||||
|
|
||||||
def get_aes_key_and_iv(file_path):
|
|
||||||
r = r2pipe.open(file_path)
|
|
||||||
r.cmd("aaa")
|
|
||||||
regex = r.cmdj("axtj @@ str.base64")
|
|
||||||
assert len(regex) == 1
|
|
||||||
|
|
||||||
func = regex[0]["fcn_name"]
|
|
||||||
r.cmd(f"s {func}")
|
|
||||||
asm = r.cmdj("pdfj")['ops']
|
|
||||||
assert len(asm) != 0
|
|
||||||
|
|
||||||
asm_regex = regex_key_iv(asm)
|
|
||||||
|
|
||||||
iv = struct.pack("<4L", *[int(asm_regex[i]['value'], 16) for i in range(4)])
|
|
||||||
|
|
||||||
# find the set key func
|
|
||||||
call_regex = [i for i in asm if i['size'] == 5 and i['type'] == 'call']
|
|
||||||
r.cmd(f"s {call_regex[1]['jump']}")
|
|
||||||
asm = r.cmdj("pdfj")["ops"]
|
|
||||||
asm_regex = regex_key_iv(asm)
|
|
||||||
assert len(asm_regex) == 8
|
|
||||||
|
|
||||||
key = struct.pack("<8L", *[int(asm_regex[i]['value'], 16) for i in range(8)])
|
|
||||||
return key, iv
|
|
||||||
Reference in New Issue
Block a user