remandochka 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- remandochka-0.0.1/PKG-INFO +131 -0
- remandochka-0.0.1/README.md +123 -0
- remandochka-0.0.1/pyproject.toml +13 -0
- remandochka-0.0.1/remandochka/__init__.py +25 -0
- remandochka-0.0.1/remandochka.egg-info/PKG-INFO +131 -0
- remandochka-0.0.1/remandochka.egg-info/SOURCES.txt +26 -0
- remandochka-0.0.1/remandochka.egg-info/dependency_links.txt +1 -0
- remandochka-0.0.1/remandochka.egg-info/top_level.txt +2 -0
- remandochka-0.0.1/rm/__init__.py +85 -0
- remandochka-0.0.1/rm/bypass/__init__.py +8 -0
- remandochka-0.0.1/rm/bypass/bypass.py +57 -0
- remandochka-0.0.1/rm/bypass/engine.py +194 -0
- remandochka-0.0.1/rm/bypass/routines/__init__.py +12 -0
- remandochka-0.0.1/rm/bypass/routines/base.py +121 -0
- remandochka-0.0.1/rm/bypass/routines/constructor_trap.py +103 -0
- remandochka-0.0.1/rm/bypass/routines/final_devirtualized.py +67 -0
- remandochka-0.0.1/rm/bypass/routines/inlined_method.py +75 -0
- remandochka-0.0.1/rm/bypass/rules.jsonl +1 -0
- remandochka-0.0.1/rm/bypass/rules.kdl +35 -0
- remandochka-0.0.1/rm/kdl/__init__.py +25 -0
- remandochka-0.0.1/rm/kdl/document.py +71 -0
- remandochka-0.0.1/rm/kdl/exceptions.py +19 -0
- remandochka-0.0.1/rm/kdl/formatter.py +100 -0
- remandochka-0.0.1/rm/kdl/node.py +150 -0
- remandochka-0.0.1/rm/kdl/parser.py +532 -0
- remandochka-0.0.1/rm/reflection/__init__.py +129 -0
- remandochka-0.0.1/setup.cfg +4 -0
- remandochka-0.0.1/setup.py +16 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: remandochka
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: RM (ReMandochka) — Высокопроизводительная библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма для плагинов exteraGram
|
|
5
|
+
Author: swagnonher
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
|
|
9
|
+
# RM (ReMandochka) v0.0.1 — Библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма
|
|
10
|
+
### (PyPI: `ReMandochka` | Python import: `import rm`)
|
|
11
|
+
|
|
12
|
+
**ReMandochka (RM)** — инструментальная библиотека для разработчиков плагинов **exteraGram**, решающая проблемы с защитами, барьерами Android Runtime (ART), компилятора R8, предоставляющая встроенный ультра-быстрый парсер документов **KDL v2 (2.0.0)** и безопасную Java-рефлексию.
|
|
13
|
+
|
|
14
|
+
- **PyPI**: `ReMandochka` (установка: `pip install ReMandochka`).
|
|
15
|
+
- **Импорт в плагинах**: `import rm` (краткое имя для удобства написания кода) или `import remandochka`.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ⚡ Моментальный KDL v2/v1 парсер (`rm.kdl`)
|
|
20
|
+
|
|
21
|
+
Пакет содержит оптимизированный парсер новейшей спецификации **KDL 2.0.0** с поддержкой:
|
|
22
|
+
- Всех современных конструкций KDL v2 (`#true`, `#false`, `#null`, `#inf`, `#-inf`, `#nan`, шестнадцатеричные `0x...`, восьмеричные `0o...`, двоичные `0b...`, децимальные числа с экспонентой и разделителями `_`).
|
|
23
|
+
- Многострочных строк `""" ... """` и `#""" ... """#` с автоматическим дедентированием по спецификации KDL v2.
|
|
24
|
+
- Сырых строк `#"..."#`, `##"..."##`.
|
|
25
|
+
- Эскейп-последовательностей (`\n`, `\r`, `\t`, `\s`, `\u{1F600}`, whitespace escapes `\`).
|
|
26
|
+
- Комментариев `//`, вложенных блочных комментариев `/* /* ... */ */` и слешдаш-комментариев `/-` (для нод, аргументов, свойств и дочерних блоков).
|
|
27
|
+
- Типовых аннотаций `(type)node` и `(type)value`.
|
|
28
|
+
- Обратной совместимости с KDL v1 (`true`, `false`, `null`, `r"..."`).
|
|
29
|
+
|
|
30
|
+
### Скорость парсинга
|
|
31
|
+
Парсинг типового конфигурационного блока плагина занимает **~100 микросекунд** (0.0001 сек) на чистом Python 3.11 без внешних бинарных зависимостей, обеспечивая 100% совместимость с Android Chaquopy (`py3-none-any.whl`).
|
|
32
|
+
|
|
33
|
+
### Использование KDL в коде:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import rm
|
|
37
|
+
|
|
38
|
+
# 1. Быстрый парсинг KDL-строки
|
|
39
|
+
doc = rm.parse_kdl("""
|
|
40
|
+
package name="ReMandochka" version="0.0.1" {
|
|
41
|
+
flags active=#true debug=#false test=#null
|
|
42
|
+
numbers hex=0xDEAD_BEEF dec=1_000_000
|
|
43
|
+
multiline \"\"\"
|
|
44
|
+
Привет, мир!
|
|
45
|
+
Вторая строка с отступом.
|
|
46
|
+
\"\"\"
|
|
47
|
+
raw #"C:\\Path\\Without\\Escapes"#
|
|
48
|
+
(role)node (u8)255 (date)"2026-10-26"
|
|
49
|
+
}
|
|
50
|
+
""")
|
|
51
|
+
|
|
52
|
+
# 2. Доступ к узлам и свойствам
|
|
53
|
+
pkg = doc["package"]
|
|
54
|
+
print(pkg["name"]) # "ReMandochka"
|
|
55
|
+
print(pkg.get("version")) # "0.0.1"
|
|
56
|
+
|
|
57
|
+
flags = pkg.child("flags")
|
|
58
|
+
print(flags["active"]) # True
|
|
59
|
+
|
|
60
|
+
# 3. Конвертация в словарь
|
|
61
|
+
data_dict = doc.to_dict()
|
|
62
|
+
|
|
63
|
+
# 4. Сериализация обратно в KDL
|
|
64
|
+
kdl_text = rm.dumps_kdl(doc)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🛡️ Модуль обхода блокировок ART/R8 (`rm.Bypass`)
|
|
70
|
+
|
|
71
|
+
Архитектура типизирована по физическим барьерам ART/R8 и поддерживает моментальный прием правил конфигурации прямо из KDL-строк:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
from base_plugin import BasePlugin, MethodHook
|
|
75
|
+
import rm
|
|
76
|
+
|
|
77
|
+
class MyPlugin(BasePlugin):
|
|
78
|
+
def on_plugin_load(self):
|
|
79
|
+
self.bypass = rm.Bypass(self)
|
|
80
|
+
|
|
81
|
+
# Можно передать правила напрямую в KDL формате!
|
|
82
|
+
self.bypass.apply_kdl("""
|
|
83
|
+
class "InstallPluginBottomSheet" full_name="com.exteragram.messenger.plugins.ui.components.InstallPluginBottomSheet" {
|
|
84
|
+
method "<init>" routine="constructor_trap" {
|
|
85
|
+
pre_caller class="com.exteragram.messenger.plugins.PythonPluginsEngine" method="showInstallDialog"
|
|
86
|
+
post_lifecycle class="org.telegram.ui.ActionBar.BottomSheet" method="show" filter="InstallPluginBottomSheet"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
""")
|
|
90
|
+
|
|
91
|
+
@self.bypass.hook("InstallPluginBottomSheet", "<init>")
|
|
92
|
+
class CtorHook(MethodHook):
|
|
93
|
+
def before_hooked_method(self, param):
|
|
94
|
+
# param.args[2] — PluginInstallParams
|
|
95
|
+
param.args[2].setTrusted(True)
|
|
96
|
+
|
|
97
|
+
def after_hooked_method(self, param):
|
|
98
|
+
sheet = param.thisObject # живой экземпляр шторки
|
|
99
|
+
|
|
100
|
+
@self.bypass.hook("InstallPluginBottomSheet", "applyButtonState")
|
|
101
|
+
class ButtonHook(MethodHook):
|
|
102
|
+
def after_hooked_method(self, param):
|
|
103
|
+
sheet = param.thisObject
|
|
104
|
+
# кастомизация кнопки
|
|
105
|
+
|
|
106
|
+
self.bypass.install()
|
|
107
|
+
|
|
108
|
+
def on_plugin_unload(self):
|
|
109
|
+
self.bypass.uninstall()
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 🔇 Интеллектуальное логирование (Zero Log Spam)
|
|
115
|
+
|
|
116
|
+
Библиотека не засоряет логи приложения:
|
|
117
|
+
* Логи выводятся **ТОЛЬКО** тогда, когда в настройках плагин-системы включен **Режим разработчика (`rm.is_dev_mode() == True`)**.
|
|
118
|
+
* При выключенном режиме разработчика библиотека работает в режиме **полной тишины**.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 📦 Спецификация для плагинов exteraGram
|
|
123
|
+
|
|
124
|
+
- В файлах `.plugin`:
|
|
125
|
+
```python
|
|
126
|
+
__requirements__ = ["ReMandochka 0.0.1"]
|
|
127
|
+
```
|
|
128
|
+
- В архивах `.elyx` (`metainfo.json`):
|
|
129
|
+
```json
|
|
130
|
+
"requirements": "ReMandochka 0.0.1"
|
|
131
|
+
```
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# RM (ReMandochka) v0.0.1 — Библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма
|
|
2
|
+
### (PyPI: `ReMandochka` | Python import: `import rm`)
|
|
3
|
+
|
|
4
|
+
**ReMandochka (RM)** — инструментальная библиотека для разработчиков плагинов **exteraGram**, решающая проблемы с защитами, барьерами Android Runtime (ART), компилятора R8, предоставляющая встроенный ультра-быстрый парсер документов **KDL v2 (2.0.0)** и безопасную Java-рефлексию.
|
|
5
|
+
|
|
6
|
+
- **PyPI**: `ReMandochka` (установка: `pip install ReMandochka`).
|
|
7
|
+
- **Импорт в плагинах**: `import rm` (краткое имя для удобства написания кода) или `import remandochka`.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## ⚡ Моментальный KDL v2/v1 парсер (`rm.kdl`)
|
|
12
|
+
|
|
13
|
+
Пакет содержит оптимизированный парсер новейшей спецификации **KDL 2.0.0** с поддержкой:
|
|
14
|
+
- Всех современных конструкций KDL v2 (`#true`, `#false`, `#null`, `#inf`, `#-inf`, `#nan`, шестнадцатеричные `0x...`, восьмеричные `0o...`, двоичные `0b...`, децимальные числа с экспонентой и разделителями `_`).
|
|
15
|
+
- Многострочных строк `""" ... """` и `#""" ... """#` с автоматическим дедентированием по спецификации KDL v2.
|
|
16
|
+
- Сырых строк `#"..."#`, `##"..."##`.
|
|
17
|
+
- Эскейп-последовательностей (`\n`, `\r`, `\t`, `\s`, `\u{1F600}`, whitespace escapes `\`).
|
|
18
|
+
- Комментариев `//`, вложенных блочных комментариев `/* /* ... */ */` и слешдаш-комментариев `/-` (для нод, аргументов, свойств и дочерних блоков).
|
|
19
|
+
- Типовых аннотаций `(type)node` и `(type)value`.
|
|
20
|
+
- Обратной совместимости с KDL v1 (`true`, `false`, `null`, `r"..."`).
|
|
21
|
+
|
|
22
|
+
### Скорость парсинга
|
|
23
|
+
Парсинг типового конфигурационного блока плагина занимает **~100 микросекунд** (0.0001 сек) на чистом Python 3.11 без внешних бинарных зависимостей, обеспечивая 100% совместимость с Android Chaquopy (`py3-none-any.whl`).
|
|
24
|
+
|
|
25
|
+
### Использование KDL в коде:
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
import rm
|
|
29
|
+
|
|
30
|
+
# 1. Быстрый парсинг KDL-строки
|
|
31
|
+
doc = rm.parse_kdl("""
|
|
32
|
+
package name="ReMandochka" version="0.0.1" {
|
|
33
|
+
flags active=#true debug=#false test=#null
|
|
34
|
+
numbers hex=0xDEAD_BEEF dec=1_000_000
|
|
35
|
+
multiline \"\"\"
|
|
36
|
+
Привет, мир!
|
|
37
|
+
Вторая строка с отступом.
|
|
38
|
+
\"\"\"
|
|
39
|
+
raw #"C:\\Path\\Without\\Escapes"#
|
|
40
|
+
(role)node (u8)255 (date)"2026-10-26"
|
|
41
|
+
}
|
|
42
|
+
""")
|
|
43
|
+
|
|
44
|
+
# 2. Доступ к узлам и свойствам
|
|
45
|
+
pkg = doc["package"]
|
|
46
|
+
print(pkg["name"]) # "ReMandochka"
|
|
47
|
+
print(pkg.get("version")) # "0.0.1"
|
|
48
|
+
|
|
49
|
+
flags = pkg.child("flags")
|
|
50
|
+
print(flags["active"]) # True
|
|
51
|
+
|
|
52
|
+
# 3. Конвертация в словарь
|
|
53
|
+
data_dict = doc.to_dict()
|
|
54
|
+
|
|
55
|
+
# 4. Сериализация обратно в KDL
|
|
56
|
+
kdl_text = rm.dumps_kdl(doc)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 🛡️ Модуль обхода блокировок ART/R8 (`rm.Bypass`)
|
|
62
|
+
|
|
63
|
+
Архитектура типизирована по физическим барьерам ART/R8 и поддерживает моментальный прием правил конфигурации прямо из KDL-строк:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from base_plugin import BasePlugin, MethodHook
|
|
67
|
+
import rm
|
|
68
|
+
|
|
69
|
+
class MyPlugin(BasePlugin):
|
|
70
|
+
def on_plugin_load(self):
|
|
71
|
+
self.bypass = rm.Bypass(self)
|
|
72
|
+
|
|
73
|
+
# Можно передать правила напрямую в KDL формате!
|
|
74
|
+
self.bypass.apply_kdl("""
|
|
75
|
+
class "InstallPluginBottomSheet" full_name="com.exteragram.messenger.plugins.ui.components.InstallPluginBottomSheet" {
|
|
76
|
+
method "<init>" routine="constructor_trap" {
|
|
77
|
+
pre_caller class="com.exteragram.messenger.plugins.PythonPluginsEngine" method="showInstallDialog"
|
|
78
|
+
post_lifecycle class="org.telegram.ui.ActionBar.BottomSheet" method="show" filter="InstallPluginBottomSheet"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
""")
|
|
82
|
+
|
|
83
|
+
@self.bypass.hook("InstallPluginBottomSheet", "<init>")
|
|
84
|
+
class CtorHook(MethodHook):
|
|
85
|
+
def before_hooked_method(self, param):
|
|
86
|
+
# param.args[2] — PluginInstallParams
|
|
87
|
+
param.args[2].setTrusted(True)
|
|
88
|
+
|
|
89
|
+
def after_hooked_method(self, param):
|
|
90
|
+
sheet = param.thisObject # живой экземпляр шторки
|
|
91
|
+
|
|
92
|
+
@self.bypass.hook("InstallPluginBottomSheet", "applyButtonState")
|
|
93
|
+
class ButtonHook(MethodHook):
|
|
94
|
+
def after_hooked_method(self, param):
|
|
95
|
+
sheet = param.thisObject
|
|
96
|
+
# кастомизация кнопки
|
|
97
|
+
|
|
98
|
+
self.bypass.install()
|
|
99
|
+
|
|
100
|
+
def on_plugin_unload(self):
|
|
101
|
+
self.bypass.uninstall()
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 🔇 Интеллектуальное логирование (Zero Log Spam)
|
|
107
|
+
|
|
108
|
+
Библиотека не засоряет логи приложения:
|
|
109
|
+
* Логи выводятся **ТОЛЬКО** тогда, когда в настройках плагин-системы включен **Режим разработчика (`rm.is_dev_mode() == True`)**.
|
|
110
|
+
* При выключенном режиме разработчика библиотека работает в режиме **полной тишины**.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 📦 Спецификация для плагинов exteraGram
|
|
115
|
+
|
|
116
|
+
- В файлах `.plugin`:
|
|
117
|
+
```python
|
|
118
|
+
__requirements__ = ["ReMandochka 0.0.1"]
|
|
119
|
+
```
|
|
120
|
+
- В архивах `.elyx` (`metainfo.json`):
|
|
121
|
+
```json
|
|
122
|
+
"requirements": "ReMandochka 0.0.1"
|
|
123
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "remandochka"
|
|
7
|
+
version = "0.0.1"
|
|
8
|
+
description = "RM (ReMandochka) — Высокопроизводительная библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма для плагинов exteraGram"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
authors = [
|
|
12
|
+
{ name = "swagnonher" }
|
|
13
|
+
]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ReMandochka (RM) — PyPI package alias for `rm`.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from rm import *
|
|
6
|
+
from rm import (
|
|
7
|
+
__version__,
|
|
8
|
+
bypass,
|
|
9
|
+
kdl,
|
|
10
|
+
reflection,
|
|
11
|
+
parse_kdl,
|
|
12
|
+
dumps_kdl,
|
|
13
|
+
loads_kdl,
|
|
14
|
+
is_dev_mode,
|
|
15
|
+
dev_log,
|
|
16
|
+
get_app_version,
|
|
17
|
+
Bypass,
|
|
18
|
+
get_field,
|
|
19
|
+
set_field,
|
|
20
|
+
get_java_class,
|
|
21
|
+
Document,
|
|
22
|
+
Node,
|
|
23
|
+
TaggedValue,
|
|
24
|
+
KDLParseError,
|
|
25
|
+
)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: remandochka
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: RM (ReMandochka) — Высокопроизводительная библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма для плагинов exteraGram
|
|
5
|
+
Author: swagnonher
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
|
|
9
|
+
# RM (ReMandochka) v0.0.1 — Библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма
|
|
10
|
+
### (PyPI: `ReMandochka` | Python import: `import rm`)
|
|
11
|
+
|
|
12
|
+
**ReMandochka (RM)** — инструментальная библиотека для разработчиков плагинов **exteraGram**, решающая проблемы с защитами, барьерами Android Runtime (ART), компилятора R8, предоставляющая встроенный ультра-быстрый парсер документов **KDL v2 (2.0.0)** и безопасную Java-рефлексию.
|
|
13
|
+
|
|
14
|
+
- **PyPI**: `ReMandochka` (установка: `pip install ReMandochka`).
|
|
15
|
+
- **Импорт в плагинах**: `import rm` (краткое имя для удобства написания кода) или `import remandochka`.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ⚡ Моментальный KDL v2/v1 парсер (`rm.kdl`)
|
|
20
|
+
|
|
21
|
+
Пакет содержит оптимизированный парсер новейшей спецификации **KDL 2.0.0** с поддержкой:
|
|
22
|
+
- Всех современных конструкций KDL v2 (`#true`, `#false`, `#null`, `#inf`, `#-inf`, `#nan`, шестнадцатеричные `0x...`, восьмеричные `0o...`, двоичные `0b...`, децимальные числа с экспонентой и разделителями `_`).
|
|
23
|
+
- Многострочных строк `""" ... """` и `#""" ... """#` с автоматическим дедентированием по спецификации KDL v2.
|
|
24
|
+
- Сырых строк `#"..."#`, `##"..."##`.
|
|
25
|
+
- Эскейп-последовательностей (`\n`, `\r`, `\t`, `\s`, `\u{1F600}`, whitespace escapes `\`).
|
|
26
|
+
- Комментариев `//`, вложенных блочных комментариев `/* /* ... */ */` и слешдаш-комментариев `/-` (для нод, аргументов, свойств и дочерних блоков).
|
|
27
|
+
- Типовых аннотаций `(type)node` и `(type)value`.
|
|
28
|
+
- Обратной совместимости с KDL v1 (`true`, `false`, `null`, `r"..."`).
|
|
29
|
+
|
|
30
|
+
### Скорость парсинга
|
|
31
|
+
Парсинг типового конфигурационного блока плагина занимает **~100 микросекунд** (0.0001 сек) на чистом Python 3.11 без внешних бинарных зависимостей, обеспечивая 100% совместимость с Android Chaquopy (`py3-none-any.whl`).
|
|
32
|
+
|
|
33
|
+
### Использование KDL в коде:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import rm
|
|
37
|
+
|
|
38
|
+
# 1. Быстрый парсинг KDL-строки
|
|
39
|
+
doc = rm.parse_kdl("""
|
|
40
|
+
package name="ReMandochka" version="0.0.1" {
|
|
41
|
+
flags active=#true debug=#false test=#null
|
|
42
|
+
numbers hex=0xDEAD_BEEF dec=1_000_000
|
|
43
|
+
multiline \"\"\"
|
|
44
|
+
Привет, мир!
|
|
45
|
+
Вторая строка с отступом.
|
|
46
|
+
\"\"\"
|
|
47
|
+
raw #"C:\\Path\\Without\\Escapes"#
|
|
48
|
+
(role)node (u8)255 (date)"2026-10-26"
|
|
49
|
+
}
|
|
50
|
+
""")
|
|
51
|
+
|
|
52
|
+
# 2. Доступ к узлам и свойствам
|
|
53
|
+
pkg = doc["package"]
|
|
54
|
+
print(pkg["name"]) # "ReMandochka"
|
|
55
|
+
print(pkg.get("version")) # "0.0.1"
|
|
56
|
+
|
|
57
|
+
flags = pkg.child("flags")
|
|
58
|
+
print(flags["active"]) # True
|
|
59
|
+
|
|
60
|
+
# 3. Конвертация в словарь
|
|
61
|
+
data_dict = doc.to_dict()
|
|
62
|
+
|
|
63
|
+
# 4. Сериализация обратно в KDL
|
|
64
|
+
kdl_text = rm.dumps_kdl(doc)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🛡️ Модуль обхода блокировок ART/R8 (`rm.Bypass`)
|
|
70
|
+
|
|
71
|
+
Архитектура типизирована по физическим барьерам ART/R8 и поддерживает моментальный прием правил конфигурации прямо из KDL-строк:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
from base_plugin import BasePlugin, MethodHook
|
|
75
|
+
import rm
|
|
76
|
+
|
|
77
|
+
class MyPlugin(BasePlugin):
|
|
78
|
+
def on_plugin_load(self):
|
|
79
|
+
self.bypass = rm.Bypass(self)
|
|
80
|
+
|
|
81
|
+
# Можно передать правила напрямую в KDL формате!
|
|
82
|
+
self.bypass.apply_kdl("""
|
|
83
|
+
class "InstallPluginBottomSheet" full_name="com.exteragram.messenger.plugins.ui.components.InstallPluginBottomSheet" {
|
|
84
|
+
method "<init>" routine="constructor_trap" {
|
|
85
|
+
pre_caller class="com.exteragram.messenger.plugins.PythonPluginsEngine" method="showInstallDialog"
|
|
86
|
+
post_lifecycle class="org.telegram.ui.ActionBar.BottomSheet" method="show" filter="InstallPluginBottomSheet"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
""")
|
|
90
|
+
|
|
91
|
+
@self.bypass.hook("InstallPluginBottomSheet", "<init>")
|
|
92
|
+
class CtorHook(MethodHook):
|
|
93
|
+
def before_hooked_method(self, param):
|
|
94
|
+
# param.args[2] — PluginInstallParams
|
|
95
|
+
param.args[2].setTrusted(True)
|
|
96
|
+
|
|
97
|
+
def after_hooked_method(self, param):
|
|
98
|
+
sheet = param.thisObject # живой экземпляр шторки
|
|
99
|
+
|
|
100
|
+
@self.bypass.hook("InstallPluginBottomSheet", "applyButtonState")
|
|
101
|
+
class ButtonHook(MethodHook):
|
|
102
|
+
def after_hooked_method(self, param):
|
|
103
|
+
sheet = param.thisObject
|
|
104
|
+
# кастомизация кнопки
|
|
105
|
+
|
|
106
|
+
self.bypass.install()
|
|
107
|
+
|
|
108
|
+
def on_plugin_unload(self):
|
|
109
|
+
self.bypass.uninstall()
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 🔇 Интеллектуальное логирование (Zero Log Spam)
|
|
115
|
+
|
|
116
|
+
Библиотека не засоряет логи приложения:
|
|
117
|
+
* Логи выводятся **ТОЛЬКО** тогда, когда в настройках плагин-системы включен **Режим разработчика (`rm.is_dev_mode() == True`)**.
|
|
118
|
+
* При выключенном режиме разработчика библиотека работает в режиме **полной тишины**.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 📦 Спецификация для плагинов exteraGram
|
|
123
|
+
|
|
124
|
+
- В файлах `.plugin`:
|
|
125
|
+
```python
|
|
126
|
+
__requirements__ = ["ReMandochka 0.0.1"]
|
|
127
|
+
```
|
|
128
|
+
- В архивах `.elyx` (`metainfo.json`):
|
|
129
|
+
```json
|
|
130
|
+
"requirements": "ReMandochka 0.0.1"
|
|
131
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
setup.py
|
|
4
|
+
remandochka/__init__.py
|
|
5
|
+
remandochka.egg-info/PKG-INFO
|
|
6
|
+
remandochka.egg-info/SOURCES.txt
|
|
7
|
+
remandochka.egg-info/dependency_links.txt
|
|
8
|
+
remandochka.egg-info/top_level.txt
|
|
9
|
+
rm/__init__.py
|
|
10
|
+
rm/bypass/__init__.py
|
|
11
|
+
rm/bypass/bypass.py
|
|
12
|
+
rm/bypass/engine.py
|
|
13
|
+
rm/bypass/rules.jsonl
|
|
14
|
+
rm/bypass/rules.kdl
|
|
15
|
+
rm/bypass/routines/__init__.py
|
|
16
|
+
rm/bypass/routines/base.py
|
|
17
|
+
rm/bypass/routines/constructor_trap.py
|
|
18
|
+
rm/bypass/routines/final_devirtualized.py
|
|
19
|
+
rm/bypass/routines/inlined_method.py
|
|
20
|
+
rm/kdl/__init__.py
|
|
21
|
+
rm/kdl/document.py
|
|
22
|
+
rm/kdl/exceptions.py
|
|
23
|
+
rm/kdl/formatter.py
|
|
24
|
+
rm/kdl/node.py
|
|
25
|
+
rm/kdl/parser.py
|
|
26
|
+
rm/reflection/__init__.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RM (ReMandochka) — Инструментальная библиотека для разработчиков плагинов exteraGram:
|
|
3
|
+
- Обход барьеров ART/R8 и хукинг (rm.bypass, rm.Bypass)
|
|
4
|
+
- Моментальный парсер KDL v2/v1 (rm.kdl, rm.parse_kdl)
|
|
5
|
+
- Безопасная Java-рефлексия с автоприведением типов (rm.reflection)
|
|
6
|
+
- Zero-Spam логирование и определение окружения (rm.is_dev_mode, rm.get_app_version, rm.dev_log)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
from hook_utils import find_class
|
|
11
|
+
except ImportError:
|
|
12
|
+
def find_class(_):
|
|
13
|
+
return None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def is_dev_mode() -> bool:
|
|
17
|
+
"""Проверяет режим разработчика плагинов в настройках exteraGram."""
|
|
18
|
+
try:
|
|
19
|
+
c = find_class("com.exteragram.messenger.ExteraConfig")
|
|
20
|
+
return bool(c.getPluginsDevMode()) if c and hasattr(c, "getPluginsDevMode") else False
|
|
21
|
+
except Exception:
|
|
22
|
+
return False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def dev_log(plugin, msg: str):
|
|
26
|
+
"""Zero Log Spam: логирует ТОЛЬКО при включенном режиме разработчика."""
|
|
27
|
+
if is_dev_mode():
|
|
28
|
+
t = f"[RM] {msg}"
|
|
29
|
+
if plugin and hasattr(plugin, "log"):
|
|
30
|
+
try:
|
|
31
|
+
return plugin.log(t)
|
|
32
|
+
except Exception:
|
|
33
|
+
pass
|
|
34
|
+
print(t)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_app_version() -> str:
|
|
38
|
+
"""Определяет версию клиента exteraGram."""
|
|
39
|
+
try:
|
|
40
|
+
bv = find_class("org.telegram.messenger.BuildVars")
|
|
41
|
+
if bv and hasattr(bv, "BUILD_VERSION_STRING"):
|
|
42
|
+
return str(bv.BUILD_VERSION_STRING)
|
|
43
|
+
except Exception:
|
|
44
|
+
pass
|
|
45
|
+
return "13.1.1"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
__version__ = "0.0.1"
|
|
49
|
+
|
|
50
|
+
from . import bypass, kdl, reflection
|
|
51
|
+
from .bypass import Bypass, ProtectionEngine
|
|
52
|
+
from .kdl import Document, KDLParseError, Node, TaggedValue, dump, dumps, load, loads, parse
|
|
53
|
+
from .reflection import get_field, get_java_class, set_field
|
|
54
|
+
|
|
55
|
+
# Top-level convenience functions
|
|
56
|
+
parse_kdl = parse
|
|
57
|
+
dumps_kdl = dumps
|
|
58
|
+
loads_kdl = loads
|
|
59
|
+
|
|
60
|
+
__all__ = [
|
|
61
|
+
"__version__",
|
|
62
|
+
"is_dev_mode",
|
|
63
|
+
"dev_log",
|
|
64
|
+
"get_app_version",
|
|
65
|
+
"bypass",
|
|
66
|
+
"Bypass",
|
|
67
|
+
"ProtectionEngine",
|
|
68
|
+
"kdl",
|
|
69
|
+
"reflection",
|
|
70
|
+
"get_java_class",
|
|
71
|
+
"get_field",
|
|
72
|
+
"set_field",
|
|
73
|
+
"Document",
|
|
74
|
+
"Node",
|
|
75
|
+
"TaggedValue",
|
|
76
|
+
"KDLParseError",
|
|
77
|
+
"parse",
|
|
78
|
+
"loads",
|
|
79
|
+
"load",
|
|
80
|
+
"dumps",
|
|
81
|
+
"dump",
|
|
82
|
+
"parse_kdl",
|
|
83
|
+
"dumps_kdl",
|
|
84
|
+
"loads_kdl",
|
|
85
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RM (ReMandochka) Bypass: Developer-facing hook interface with KDL support.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Any, Optional, Union
|
|
6
|
+
from .engine import ProtectionEngine
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Bypass:
|
|
10
|
+
"""
|
|
11
|
+
Обход защиты хуков RM (ReMandochka).
|
|
12
|
+
Предоставляет чистый, простой и ультра-быстрый API для плагин-мейкеров.
|
|
13
|
+
Поддерживает моментальную загрузку конфигураций и правил в формате KDL v2.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, plugin_instance, rules_path: Optional[str] = None):
|
|
17
|
+
self.plugin = plugin_instance
|
|
18
|
+
self.engine = ProtectionEngine(plugin_instance, rules_path)
|
|
19
|
+
|
|
20
|
+
def apply_kdl(self, kdl_text: str):
|
|
21
|
+
"""
|
|
22
|
+
Моментально парсит и применяет конфигурацию правил обхода из KDL-строки.
|
|
23
|
+
"""
|
|
24
|
+
self.engine.load_kdl_rules(kdl_text)
|
|
25
|
+
return self
|
|
26
|
+
|
|
27
|
+
def hook_method(self, target_class: Union[str, Any], method_name: str, hook_handler: Any):
|
|
28
|
+
"""
|
|
29
|
+
Регистрирует хук на метод или конструктор любого защищенного класса.
|
|
30
|
+
"""
|
|
31
|
+
cname = target_class if isinstance(target_class, str) else target_class.__name__
|
|
32
|
+
self.engine.register_hook(cname, method_name, hook_handler)
|
|
33
|
+
return self
|
|
34
|
+
|
|
35
|
+
def hook(self, target_class: Union[str, Any], method_name: str):
|
|
36
|
+
"""
|
|
37
|
+
Декоратор для классов MethodHook / MethodReplacement.
|
|
38
|
+
|
|
39
|
+
Пример:
|
|
40
|
+
@bypass.hook("InstallPluginBottomSheet", "startAnalysis")
|
|
41
|
+
class MyHook(MethodHook):
|
|
42
|
+
def before_hooked_method(self, param):
|
|
43
|
+
param.returnEarly = True
|
|
44
|
+
"""
|
|
45
|
+
def decorator(cls_or_instance):
|
|
46
|
+
instance = cls_or_instance() if isinstance(cls_or_instance, type) else cls_or_instance
|
|
47
|
+
self.hook_method(target_class, method_name, instance)
|
|
48
|
+
return cls_or_instance
|
|
49
|
+
return decorator
|
|
50
|
+
|
|
51
|
+
def install(self) -> bool:
|
|
52
|
+
"""Активирует движок обхода защит."""
|
|
53
|
+
return self.engine.activate()
|
|
54
|
+
|
|
55
|
+
def uninstall(self):
|
|
56
|
+
"""Снимает все хуки."""
|
|
57
|
+
self.engine.deactivate()
|