..
94
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,94 +0,0 @@
|
|||||||
name: 🐞 报告Bug点我
|
|
||||||
description: 报告问题的模板
|
|
||||||
labels: [pending triage]
|
|
||||||
body:
|
|
||||||
- type: checkboxes
|
|
||||||
id: checkboxes_validations
|
|
||||||
attributes:
|
|
||||||
label: 检查事项
|
|
||||||
description: 请检查以下事项
|
|
||||||
options:
|
|
||||||
- label: 已确保 InjectLib 更新到最新版本
|
|
||||||
required: true
|
|
||||||
- label: 已确保软件版本为 InjectLib 支持范围
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: bug-description
|
|
||||||
attributes:
|
|
||||||
label: 描述问题
|
|
||||||
description: |
|
|
||||||
对错误内容的清晰简洁的描述,如:“测试发现 xxx 无法激活(版本为 vx.x.x)”。
|
|
||||||
placeholder: Bug description
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: reproduction
|
|
||||||
attributes:
|
|
||||||
label: 最小复现
|
|
||||||
description: 需要[**最小复现**](https://stackoverflow.com/help/minimal-reproducible-example),否则问题可能会被关闭,恕不另行通知。 [**为什么以及如何?**](https://antfu.me/posts/why-reproductives-are-required)
|
|
||||||
placeholder: |
|
|
||||||
打开上述软件,输入xxxx后,点击xxxx,软件发生闪退/崩溃。
|
|
||||||
许可证信息示例如下:
|
|
||||||
```
|
|
||||||
xxx
|
|
||||||
```
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: checkboxes
|
|
||||||
id: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: 系统情况
|
|
||||||
description: 根据实际情况勾选以下内容
|
|
||||||
options:
|
|
||||||
- label: SIP 开着还是关着?
|
|
||||||
- label: 是否为黑苹果(如果是黑苹果,请回答在下方标注为黑苹果的问题)
|
|
||||||
- label: 黑苹果是否amfi_getout_of_my_way开了?或者操作过amfi相关属性和amfi相关quirk?
|
|
||||||
- type: textarea
|
|
||||||
id: system-info
|
|
||||||
attributes:
|
|
||||||
label: 系统信息
|
|
||||||
description: 描述你的系统信息
|
|
||||||
render: Shell
|
|
||||||
placeholder: |
|
|
||||||
OS: macOS xxx
|
|
||||||
CPU: xxx
|
|
||||||
Memory: xx GB
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: if-modify-nvram
|
|
||||||
attributes:
|
|
||||||
label: 是否修改了nvram的内核启动参数(黑苹果)
|
|
||||||
description: 如果你修改了nvram,请提供更多信息
|
|
||||||
placeholder: |
|
|
||||||
我使用了xxxx -v alc-layout-id=xx等
|
|
||||||
- type: textarea
|
|
||||||
id: if-use-oc-patcher
|
|
||||||
attributes:
|
|
||||||
label: 是否使用了需要修改系统文件的工具(黑苹果)
|
|
||||||
description: 如果你使用了OpenCore LegecyPatcher等需要修改系统文件的工具,请提供更多信息
|
|
||||||
placeholder: |
|
|
||||||
我用了xxx,且关闭了xxx
|
|
||||||
- type: textarea
|
|
||||||
id: expected-behavior
|
|
||||||
attributes:
|
|
||||||
label: 期望行为
|
|
||||||
description: 你期望的正确行为是什么?
|
|
||||||
placeholder: Expected behavior
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: additional-info
|
|
||||||
attributes:
|
|
||||||
label: 额外信息
|
|
||||||
description: 有什么额外的信息需要提供吗?
|
|
||||||
placeholder: |
|
|
||||||
我已经尝试了xxx,但是没有效果
|
|
||||||
我还发现了xxx
|
|
||||||
- type: textarea
|
|
||||||
id: log
|
|
||||||
attributes:
|
|
||||||
label: Crash Log
|
|
||||||
description: 上传你的崩溃日志
|
|
||||||
placeholder: |
|
|
||||||
把文件拖拉进来即可上传
|
|
||||||
22
.gitignore
vendored
@@ -1,22 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
*.iml
|
|
||||||
.idea
|
|
||||||
.vscode
|
|
||||||
.ruby-lsp
|
|
||||||
IACPLHttpTransferClient
|
|
||||||
Diff*.py
|
|
||||||
tool/GiftGot.py
|
|
||||||
config_pd.json
|
|
||||||
tool/pd*.sh
|
|
||||||
tool/没脑子和不高兴
|
|
||||||
tool/Parallels_原始人_起洞.command
|
|
||||||
tool/Gift*
|
|
||||||
__pycache__
|
|
||||||
*.pyc
|
|
||||||
*.pyo
|
|
||||||
*.pyd
|
|
||||||
*.pyw
|
|
||||||
*.pyz
|
|
||||||
*.bak
|
|
||||||
*.db
|
|
||||||
cache
|
|
||||||
@@ -1,312 +0,0 @@
|
|||||||
define([
|
|
||||||
"exports",
|
|
||||||
"./../modules/viewmanager/baseview.js",
|
|
||||||
"./../modules/emby-elements/emby-input/emby-input.js",
|
|
||||||
"./../modules/emby-elements/emby-button/emby-button.js",
|
|
||||||
"./../modules/emby-elements/emby-collapse/emby-collapse.js",
|
|
||||||
"./../modules/common/globalize.js",
|
|
||||||
"./../modules/loading/loading.js",
|
|
||||||
"./../modules/registrationservices/registrationservices.js",
|
|
||||||
"./../modules/common/dialogs/confirm.js",
|
|
||||||
"./../modules/emby-apiclient/connectionmanager.js",
|
|
||||||
], function (
|
|
||||||
_exports,
|
|
||||||
_baseview,
|
|
||||||
_embyInput,
|
|
||||||
_embyButton,
|
|
||||||
_embyCollapse,
|
|
||||||
_globalize,
|
|
||||||
_loading,
|
|
||||||
_registrationservices,
|
|
||||||
_confirm,
|
|
||||||
_connectionmanager
|
|
||||||
) {
|
|
||||||
function load(page) {
|
|
||||||
var apiClient;
|
|
||||||
_loading.default.show(),
|
|
||||||
(apiClient = ApiClient)
|
|
||||||
.getJSON(apiClient.getUrl("Plugins/SecurityInfo"))
|
|
||||||
.then(function (info) {
|
|
||||||
info.IsMBSupporter = true;
|
|
||||||
(page.querySelector(".txtSupporterKey").value =
|
|
||||||
info.SupporterKey || ""),
|
|
||||||
info.SupporterKey && !info.IsMBSupporter
|
|
||||||
? (page
|
|
||||||
.querySelector(".txtSupporterKey")
|
|
||||||
.classList.add("invalidEntry"),
|
|
||||||
page.querySelector(".notSupporter").classList.remove("hide"))
|
|
||||||
: (page
|
|
||||||
.querySelector(".txtSupporterKey")
|
|
||||||
.classList.remove("invalidEntry"),
|
|
||||||
page.querySelector(".notSupporter").classList.add("hide")),
|
|
||||||
info.IsMBSupporter
|
|
||||||
? (page
|
|
||||||
.querySelector(".supporterContainer")
|
|
||||||
.classList.add("hide"),
|
|
||||||
(function (key) {
|
|
||||||
key = "key=" + key + "&serverId=" + ApiClient.serverId();
|
|
||||||
return new Promise((resolve) =>
|
|
||||||
resolve({
|
|
||||||
deviceStatus: 0,
|
|
||||||
planType: "超级会员",
|
|
||||||
subscriptions: [
|
|
||||||
{
|
|
||||||
autoRenew: true,
|
|
||||||
store: "秋城落叶",
|
|
||||||
feature: "all",
|
|
||||||
planType: "超级会员",
|
|
||||||
expDate: "且会员资格永远不会失效",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
);
|
|
||||||
})(info.SupporterKey).then(function (statusInfo) {
|
|
||||||
if (statusInfo) {
|
|
||||||
var statusLine,
|
|
||||||
indicator = page.querySelector(
|
|
||||||
".status-indicator .listItemIcon"
|
|
||||||
),
|
|
||||||
extendedPlans = page.querySelector(".extended-plans");
|
|
||||||
switch (
|
|
||||||
((extendedPlans.innerHTML = _globalize.default.translate(
|
|
||||||
"MessagePremiereExtendedPlans",
|
|
||||||
'<a is="emby-linkbutton" class="button-link" href="https://emby.media/premiere-ext.html" target="_blank">',
|
|
||||||
"</a>"
|
|
||||||
)),
|
|
||||||
statusInfo.deviceStatus)
|
|
||||||
) {
|
|
||||||
case 2:
|
|
||||||
(statusLine = _globalize.default.translate(
|
|
||||||
"MessagePremiereStatusOver",
|
|
||||||
statusInfo.planType
|
|
||||||
)),
|
|
||||||
indicator.classList.add("expiredBackground"),
|
|
||||||
indicator.classList.remove("nearExpiredBackground"),
|
|
||||||
(indicator.innerHTML = ""),
|
|
||||||
indicator.classList.add("autortl"),
|
|
||||||
extendedPlans.classList.remove("hide");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
(statusLine = _globalize.default.translate(
|
|
||||||
"MessagePremiereStatusClose",
|
|
||||||
statusInfo.planType
|
|
||||||
)),
|
|
||||||
indicator.classList.remove("expiredBackground"),
|
|
||||||
indicator.classList.add("nearExpiredBackground"),
|
|
||||||
(indicator.innerHTML = ""),
|
|
||||||
indicator.classList.add("autortl"),
|
|
||||||
extendedPlans.classList.remove("hide");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
(statusLine = _globalize.default.translate(
|
|
||||||
"MessagePremiereStatusGood",
|
|
||||||
statusInfo.planType
|
|
||||||
)),
|
|
||||||
indicator.classList.remove("expiredBackground"),
|
|
||||||
indicator.classList.remove("nearExpiredBackground"),
|
|
||||||
(indicator.innerHTML = ""),
|
|
||||||
indicator.classList.remove("autortl"),
|
|
||||||
extendedPlans.classList.add("hide");
|
|
||||||
}
|
|
||||||
page.querySelector(".premiere-status").innerHTML =
|
|
||||||
statusLine;
|
|
||||||
var subsElement = page.querySelector(".premiere-subs");
|
|
||||||
statusInfo.subscriptions &&
|
|
||||||
0 < statusInfo.subscriptions.length
|
|
||||||
? ((page.querySelector(
|
|
||||||
".premiere-subs-content"
|
|
||||||
).innerHTML =
|
|
||||||
((subs = statusInfo.subscriptions),
|
|
||||||
(key = info.SupporterKey),
|
|
||||||
subs.map(function (item) {
|
|
||||||
var itemHtml = "",
|
|
||||||
makeLink =
|
|
||||||
item.autoRenew && "Stripe" === item.store,
|
|
||||||
tagName = makeLink ? "button" : "div";
|
|
||||||
return (
|
|
||||||
itemHtml +
|
|
||||||
(("button" == tagName
|
|
||||||
? '<button type="button"'
|
|
||||||
: "<div") +
|
|
||||||
' class="listItem listItem-button listItem-border' +
|
|
||||||
(makeLink ? " lnkSubscription" : "") +
|
|
||||||
'" data-feature="' +
|
|
||||||
item.feature +
|
|
||||||
'" data-key="' +
|
|
||||||
key +
|
|
||||||
'">') +
|
|
||||||
'<i class="listItemIcon md-icon autortl"></i>' +
|
|
||||||
'<div class="listItemBody two-line">' +
|
|
||||||
'<div class="listItemBodyText">' +
|
|
||||||
_globalize.default.translate(
|
|
||||||
"ListItemPremiereSub",
|
|
||||||
item.planType,
|
|
||||||
item.expDate,
|
|
||||||
item.store
|
|
||||||
) +
|
|
||||||
"</div>" +
|
|
||||||
'<div class="listItemBodyText listItemBodyText-secondary">' +
|
|
||||||
_globalize.default.translate(
|
|
||||||
"Stripe" === item.store
|
|
||||||
? item.autoRenew
|
|
||||||
? "LabelClickToCancel"
|
|
||||||
: "LabelAlreadyCancelled"
|
|
||||||
: "LabelCancelInfo",
|
|
||||||
item.store
|
|
||||||
) +
|
|
||||||
"</div>" +
|
|
||||||
"</div>" +
|
|
||||||
("</" + tagName + ">")
|
|
||||||
);
|
|
||||||
}))),
|
|
||||||
(subs = page.querySelector(".lnkSubscription")) &&
|
|
||||||
subs.addEventListener("click", cancelSub),
|
|
||||||
subsElement.classList.remove("hide"))
|
|
||||||
: subsElement.classList.add("hide"),
|
|
||||||
page
|
|
||||||
.querySelector(".isSupporter")
|
|
||||||
.classList.remove("hide");
|
|
||||||
}
|
|
||||||
var subs, key;
|
|
||||||
}))
|
|
||||||
: (page
|
|
||||||
.querySelector(".supporterContainer")
|
|
||||||
.classList.remove("hide"),
|
|
||||||
page.querySelector(".isSupporter").classList.add("hide")),
|
|
||||||
_loading.default.hide();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function cancelSub(e) {
|
|
||||||
console.log("Cancel ");
|
|
||||||
var feature = this.getAttribute("data-feature"),
|
|
||||||
key = this.getAttribute("data-key");
|
|
||||||
(0, _confirm.default)({
|
|
||||||
title: _globalize.default.translate("HeaderCancelSub"),
|
|
||||||
text: _globalize.default.translate("MessageConfirmSubCancel"),
|
|
||||||
confirmText: _globalize.default.translate("ButtonCancelSub"),
|
|
||||||
cancelText: _globalize.default.translate("ButtonDontCancelSub"),
|
|
||||||
primary: "cancel",
|
|
||||||
}).then(function () {
|
|
||||||
console.log("after confirm"),
|
|
||||||
fetch("http://127.0.0.1:3000/admin/service/stripe/requestSubCancel", {
|
|
||||||
method: "POST",
|
|
||||||
body: "key=" + key + "&feature=" + feature,
|
|
||||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
||||||
}).then(
|
|
||||||
function (response) {
|
|
||||||
alertText({
|
|
||||||
text: _globalize.default.translate("MessageSubCancelReqSent"),
|
|
||||||
title: _globalize.default.translate("HeaderConfirmation"),
|
|
||||||
});
|
|
||||||
},
|
|
||||||
function (response) {
|
|
||||||
alertText({
|
|
||||||
text: _globalize.default.translate(
|
|
||||||
"MessageSubCancelError",
|
|
||||||
"cancel@emby.media"
|
|
||||||
),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function retrieveSupporterKey(e) {
|
|
||||||
_loading.default.show();
|
|
||||||
var email = this.querySelector(".txtEmail").value,
|
|
||||||
url =
|
|
||||||
"http://127.0.0.1:3000/admin/service/supporter/retrievekey?email=" +
|
|
||||||
email;
|
|
||||||
return (
|
|
||||||
console.log(url),
|
|
||||||
fetch(url, { method: "POST" })
|
|
||||||
.then(function (response) {
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(function (result) {
|
|
||||||
_loading.default.hide(),
|
|
||||||
result.Success
|
|
||||||
? require(["toast"], function (toast) {
|
|
||||||
toast(
|
|
||||||
_globalize.default
|
|
||||||
.translate("MessageKeyEmailedTo")
|
|
||||||
.replace("{0}", email)
|
|
||||||
);
|
|
||||||
})
|
|
||||||
: require(["toast"], function (toast) {
|
|
||||||
toast(result.ErrorMessage);
|
|
||||||
}),
|
|
||||||
console.log(result);
|
|
||||||
}),
|
|
||||||
e.preventDefault(),
|
|
||||||
!1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
function alertText(options) {
|
|
||||||
require(["alert"], function (alert) {
|
|
||||||
alert(options);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function updateSupporterKey(e) {
|
|
||||||
_loading.default.show();
|
|
||||||
var form = this,
|
|
||||||
key = form.querySelector(".txtSupporterKey").value;
|
|
||||||
return (
|
|
||||||
ApiClient.updatePluginSecurityInfo({ SupporterKey: key }).then(
|
|
||||||
function () {
|
|
||||||
_loading.default.hide(),
|
|
||||||
alertText(
|
|
||||||
key
|
|
||||||
? {
|
|
||||||
text: _globalize.default.translate("MessageKeyUpdated"),
|
|
||||||
title: _globalize.default.translate("HeaderConfirmation"),
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
text: _globalize.default.translate("MessageKeyRemoved"),
|
|
||||||
title: _globalize.default.translate("HeaderConfirmation"),
|
|
||||||
}
|
|
||||||
),
|
|
||||||
_connectionmanager.default.resetRegistrationInfo(ApiClient),
|
|
||||||
load(form.closest(".page"));
|
|
||||||
},
|
|
||||||
function () {
|
|
||||||
_loading.default.hide(),
|
|
||||||
_connectionmanager.default.resetRegistrationInfo(ApiClient),
|
|
||||||
load(form.closest(".page"));
|
|
||||||
}
|
|
||||||
),
|
|
||||||
e.preventDefault(),
|
|
||||||
!1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
function onSupporterLinkClick(e) {
|
|
||||||
_registrationservices.default.showPremiereInfo(),
|
|
||||||
e.preventDefault(),
|
|
||||||
e.stopPropagation();
|
|
||||||
}
|
|
||||||
function View(view, params) {
|
|
||||||
_baseview.default.apply(this, arguments),
|
|
||||||
view
|
|
||||||
.querySelector(".supporterKeyForm")
|
|
||||||
.addEventListener("submit", updateSupporterKey),
|
|
||||||
view
|
|
||||||
.querySelector(".lostKeyForm")
|
|
||||||
.addEventListener("submit", retrieveSupporterKey),
|
|
||||||
(view.querySelector(".benefits").innerHTML = _globalize.default.translate(
|
|
||||||
"HeaderSupporterBenefit",
|
|
||||||
'<a is="emby-linkbutton" class="lnkPremiere button-link" href="https://emby.media/premiere" target="_blank">',
|
|
||||||
"</a>"
|
|
||||||
)),
|
|
||||||
view
|
|
||||||
.querySelector(".lnkPremiere")
|
|
||||||
.addEventListener("click", onSupporterLinkClick);
|
|
||||||
}
|
|
||||||
Object.defineProperty(_exports, "__esModule", { value: !0 }),
|
|
||||||
(_exports.default = void 0),
|
|
||||||
require(["listViewStyle"]),
|
|
||||||
Object.assign(View.prototype, _baseview.default.prototype),
|
|
||||||
(View.prototype.onResume = function (options) {
|
|
||||||
_baseview.default.prototype.onResume.apply(this, arguments),
|
|
||||||
load(this.view);
|
|
||||||
}),
|
|
||||||
(_exports.default = View);
|
|
||||||
});
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
# 本教程旨在破解Emby Server for macOS
|
|
||||||
## 支持版本: 4.7.14.0
|
|
||||||
下载地址: https://github.com/MediaBrowser/Emby.Releases/releases/download/4.7.14.0/embyserver-osx-x64-4.7.14.0.zip
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
Emby.Web.dll 替换到 /Applications/EmbyServer.app/Contents/MacOS/Emby.Web.dll
|
|
||||||
|
|
||||||
embypremiere.js 替换到 /Applications/EmbyServer.app/Contents/Resources/dashboard-ui/embypremiere/embypremiere.js
|
|
||||||
|
|
||||||
## 最后
|
|
||||||
我再说一遍:网上那些破解Emby Linux/Windows Server版本要替换四五个文件的人都是傻狗。
|
|
||||||
|
|
||||||
不就是修改个b前端js和改一下.Net资源文件的事情被你们搞这么复杂,老子一直以为这东西很难都懒得弄,没想到就他妈这么点b大点难度。一群饭桶!
|
|
||||||
|
|
||||||
## 利用全局hook来伪造激活信息
|
|
||||||
|
|
||||||
```js
|
|
||||||
|
|
||||||
2024.03.08 全平台通杀代码无需反编译 by QiuChenly
|
|
||||||
就你们这b水平还搞Emby的破解?纯纯的一群饭桶。一个个只会盲目替换修改dll资源文件,一知半解在这装破解大神,问点问题没一个人回,真他妈的纯纯的饭桶。
|
|
||||||
|
|
||||||
/Applications/EmbyServer.app/Contents/Resources/dashboard-ui/apploader.js
|
|
||||||
function onDone():
|
|
||||||
|
|
||||||
// 重写全局的 fetch 函数
|
|
||||||
//powered by QiuChenly use node module hook
|
|
||||||
(window.fetch1 = window.fetch),
|
|
||||||
(window.fetch = (url, options) => {
|
|
||||||
console.log("加载的URL是:", url);
|
|
||||||
//如果url 包含 https://mb3admin.com/admin/service/registration/validateDevice 则直接返回
|
|
||||||
/**
|
|
||||||
* {
|
|
||||||
status: 200,
|
|
||||||
headers: $response.headers,
|
|
||||||
body: '{"cacheExpirationDays":999,"resultCode":"GOOD","message":"Device Valid"}'
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (
|
|
||||||
url ===
|
|
||||||
"https://mb3admin.com/admin/service/registration/getStatus" ||
|
|
||||||
url.includes(
|
|
||||||
"https://mb3admin.com/admin/service/registration/validateDevice"
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
resolve({
|
|
||||||
status: 200,
|
|
||||||
headers: {
|
|
||||||
get: () => "application/json",
|
|
||||||
},
|
|
||||||
json: () => {
|
|
||||||
return {
|
|
||||||
cacheExpirationDays: 999,
|
|
||||||
resultCode: "GOOD",
|
|
||||||
message: "Device Valid",
|
|
||||||
// 上半部分是分开的
|
|
||||||
deviceStatus: 0,
|
|
||||||
planType: "超级会员",
|
|
||||||
subscriptions: [
|
|
||||||
{
|
|
||||||
autoRenew: true,
|
|
||||||
store: "秋城落叶",
|
|
||||||
feature: "all",
|
|
||||||
planType: "超级会员",
|
|
||||||
expDate: "直到2099年12月31日以后",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return window.fetch1(url, options);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
35
adobe.py
@@ -1,35 +0,0 @@
|
|||||||
import os
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
subprocess.run(
|
|
||||||
"sudo chmod -R 777 '/Applications/Utilities/Adobe Creative Cloud/Components/Apps/Apps1_0.js'",
|
|
||||||
shell=True,
|
|
||||||
)
|
|
||||||
# 检查是否存在/Applications/Utilities/Adobe Creative Cloud/Components/Apps/Apps1_0.js
|
|
||||||
if os.path.isfile(
|
|
||||||
"/Applications/Utilities/Adobe Creative Cloud/Components/Apps/Apps1_0.js"
|
|
||||||
):
|
|
||||||
# 替换文件中的key:"getEntitlementStatus",value:function(e){为key:"getEntitlementStatus",value:function(e){return "Entitled Installed"
|
|
||||||
with open(
|
|
||||||
"/Applications/Utilities/Adobe Creative Cloud/Components/Apps/Apps1_0.js",
|
|
||||||
"r",
|
|
||||||
encoding="utf-8",
|
|
||||||
) as f:
|
|
||||||
content = f.read()
|
|
||||||
# 判断是否写过了
|
|
||||||
if (
|
|
||||||
'key:"getEntitlementStatus",value:function(e){return "Entitled Installed"'
|
|
||||||
not in content
|
|
||||||
):
|
|
||||||
# sed -i "s#key:\"getEntitlementStatus\",value:function(e){#key:\"getEntitlementStatus\",value:function(e){return \"Entitled Installed\"#g" /Applications/Utilities/Adobe\ Creative\ Cloud/Components/Apps/Apps1_0.js
|
|
||||||
content = content.replace(
|
|
||||||
'key:"getEntitlementStatus",value:function(e){',
|
|
||||||
'key:"getEntitlementStatus",value:function(e){return "Entitled Installed";',
|
|
||||||
)
|
|
||||||
with open(
|
|
||||||
"/Applications/Utilities/Adobe Creative Cloud/Components/Apps/Apps1_0.js",
|
|
||||||
"w",
|
|
||||||
encoding="utf-8",
|
|
||||||
) as f:
|
|
||||||
f.write(content)
|
|
||||||
1468
config.json
31
frontend/dist/assets/index-DJCNZJwH.js
vendored
1
frontend/dist/assets/index-Ywwf_4Ql.css
vendored
14
frontend/dist/index.html
vendored
@@ -1,14 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh-CN">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>QiuChenly 应用商店</title>
|
|
||||||
<script type="module" crossorigin src="/assets/index-DJCNZJwH.js"></script>
|
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-Ywwf_4Ql.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# 注入 IPA
|
|
||||||
|
|
||||||
## 先决条件
|
|
||||||
|
|
||||||
1. brew 需要安装 unzip 包
|
|
||||||
|
|
||||||
## iOS 设备支持
|
|
||||||
|
|
||||||
iOS 12.0+
|
|
||||||
|
|
||||||
支持自签与巨魔。
|
|
||||||
|
|
||||||
## 准备砸壳包
|
|
||||||
|
|
||||||
自行寻找。
|
|
||||||
|
|
||||||
## 自动注入
|
|
||||||
|
|
||||||
使用原神,启动!二进制即可:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./InjectLib genshine packipa /Users/qiuchenly/Downloads/媒体三幻神/SenPlayer5.7.2.ipa ./CoreInject.dylib
|
|
||||||
```
|
|
||||||
|
|
||||||
最终在"ipa 文件路径"处找到一个 "ipa 文件路径"\_inject.ipa 文件即为最终产物。
|
|
||||||
|
|
||||||
## 目前支持状态:
|
|
||||||
|
|
||||||
| 模式 | 状态 | 说明 |
|
|
||||||
| ---- | ---- | --------------------------------------------------- |
|
|
||||||
| 自签 | 支持 | 无法使用 iCloud 同步 |
|
|
||||||
| 巨魔 | 支持 | 暂未编译 但支持 可用 iCloud 同步 有需要自己到频道找 |
|
|
||||||
|
|
||||||
| App | 状态 | 说明 |
|
|
||||||
| --------- | --------------------------- | ------------------------------------------------------ |
|
|
||||||
| Infuse | 支持 8.1.9 以及后续所有版本 | 自签无法使用 iCloud 同步 https://t.me/qiuchenlymac/738 |
|
|
||||||
| SenPlayer | 当前支持所有版本 | 自签无法使用 iCloud 同步 |
|
|
||||||
|
|
||||||
部分 ipa 提供了注入好的 ipa 包,下载即可安装。请访问:https://t.me/qiuchenlymac 查看更多细节。
|
|
||||||
|
|
||||||
## 开发者
|
|
||||||
|
|
||||||
QiuChenly
|
|
||||||
|
|
||||||
20250708
|
|
||||||
|
|
||||||
美国东部时间下午 16:18 分于洛杉矶
|
|
||||||
BIN
imgs/Surge.png
|
Before Width: | Height: | Size: 41 KiB |
BIN
imgs/Surge_1.png
|
Before Width: | Height: | Size: 39 KiB |
BIN
imgs/Surge_2.png
|
Before Width: | Height: | Size: 258 KiB |
BIN
imgs/Surge_3.png
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 59 KiB |
BIN
imgs/image-1.png
|
Before Width: | Height: | Size: 512 KiB |
|
Before Width: | Height: | Size: 242 KiB |
BIN
imgs/image-2.png
|
Before Width: | Height: | Size: 199 KiB |
BIN
imgs/image-3.png
|
Before Width: | Height: | Size: 213 KiB |
BIN
imgs/image-4.png
|
Before Width: | Height: | Size: 42 KiB |
BIN
imgs/image-5.png
|
Before Width: | Height: | Size: 50 KiB |
BIN
imgs/image-6.png
|
Before Width: | Height: | Size: 543 KiB |
BIN
imgs/image-7.png
|
Before Width: | Height: | Size: 593 KiB |
BIN
imgs/image-8.png
|
Before Width: | Height: | Size: 123 KiB |
BIN
imgs/image-9.png
|
Before Width: | Height: | Size: 62 KiB |
BIN
imgs/image.png
|
Before Width: | Height: | Size: 628 KiB |
BIN
imgs/js配置.png
|
Before Width: | Height: | Size: 813 KiB |
|
Before Width: | Height: | Size: 52 KiB |
77
readme.md
@@ -1,79 +1,22 @@
|
|||||||
|
# 通知
|
||||||
|
|
||||||
|
传奇永不落幕。
|
||||||
|
|
||||||
|
我们将迈入到更大的胜利!
|
||||||
|
|
||||||
|
此镜像仓库已经转移并不再使用, 请访问位于中国·香港的临时境外中转自建GitLab服务器。
|
||||||
|
|
||||||
|
|
||||||
<a href="https://github.com/QiuChenly/InjectLib">
|
<a href="https://github.com/QiuChenly/InjectLib">
|
||||||
<img src="./style.svg" width="800" height="590">
|
<img src="./style.svg" width="800" height="590">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## 荣誉贡献榜
|
# 原神,启动!
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
<a href="https://github.com/QiuChenly/InjectLib/graphs/contributors">
|
|
||||||
<img src="https://contrib.rocks/image?repo=QiuChenly/InjectLib" />
|
|
||||||
</a>
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<p align="center">🔞全球各❤️地❤️服❤️务🔞<br/>
|
|
||||||
🔞①线至①⑧线城市齐全🔞<br/>
|
|
||||||
🔞汇❤️编 🚗与🤤ASM约❤️会🔞<br/>
|
|
||||||
🔞 一❤️个❤️人独自在家❤️火❤️热❤️难❤️耐 玩🔞逆🔞向 🔞<br/>
|
|
||||||
🔞找Qiu❤️Chen❤️l❤️y❤️Open❤️Source🔞<br/></p>
|
|
||||||
|
|
||||||
# 你这玩意我怎么使用?
|
|
||||||
|
|
||||||
下载仓库 zip,解压后终端 cd 到这个目录,执行"python3 main.py" 选择你中意的程序注入即可。
|
|
||||||
|
|
||||||
仍然遇到问题?你有两种选择。
|
|
||||||
|
|
||||||
1. 加群询问获取帮助: **https://t.me/+VvqTr-2EFaZhYzA1**
|
|
||||||
|
|
||||||
拒绝翻墙从我做起, QQ 群也可反馈问题:
|
|
||||||
|
|
||||||
二群 1049674046
|
|
||||||
|
|
||||||
2. 继续向下阅读并访问文档说明使用:
|
|
||||||
|
|
||||||
点下面的链接进入在线文档,有操作指南。
|
|
||||||
|
|
||||||
目前还没有写完,如果有没有的、看不懂的内容可以提 Issues。
|
|
||||||
|
|
||||||
点我查看 ➡️[使用文档](https://qiuchenlyopensource.github.io/Documentaions/)
|
|
||||||
|
|
||||||
# 加入小团体
|
|
||||||
|
|
||||||
关注我的频道,进群获取最新的推送资讯。
|
|
||||||
|
|
||||||
頻道: **<https://t.me/qiuchenlymac>**
|
|
||||||
|
|
||||||
群組: **https://t.me/+VvqTr-2EFaZhYzA1**
|
|
||||||
|
|
||||||
Twitter: https://twitter.com/QiuChenly
|
|
||||||
|
|
||||||
QQ 群:
|
|
||||||
仅为方便国内用户反馈问题与交流。
|
|
||||||
加群者请在遵守当地法律法规的前提下进行交流。
|
|
||||||
|
|
||||||
<br>
|
|
||||||
關注QiuChenly喵,關注落葉的Twitter喵。謝謝大家喵。
|
|
||||||
|
|
||||||
# 原神!
|
|
||||||
|
|
||||||
點擊圖片進入新世界.
|
點擊圖片進入新世界.
|
||||||
|
|
||||||
[](imgs/bengbuzhule.mp4)
|
[](imgs/bengbuzhule.mp4)
|
||||||
|
|
||||||
# 现已支持 IPA 注入
|
|
||||||
|
|
||||||
查看[文档](./iOSHijack/readme.md)了解更多细节。
|
|
||||||
|
|
||||||
# 操作系统要求 & 代码编译环境要求
|
|
||||||
|
|
||||||
- 最低运行 macOS High Sierra 10.13
|
|
||||||
- 编译 SDK macOS 14.0
|
|
||||||
- 目标部署平台 macOS 10.13
|
|
||||||
- CMakeLists 环境变量
|
|
||||||
- set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13")
|
|
||||||
- 检查二进制文件的最低 macOS 版本兼容性
|
|
||||||
- `find . -name "*.*" | xargs otool -l | grep -E "(minos|sdk)"`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 项目存在的目的
|
# 项目存在的目的
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTDPLIST1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>com.qiuchenly.hayaku.daemon</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>/usr/local/bin/QiuChenly/InjectLib</string>
|
|
||||||
<string>--daemon</string>
|
|
||||||
<string>/usr/local/bin/QiuChenly/config.json</string>
|
|
||||||
</array>
|
|
||||||
<key>RunAtLoad</key>
|
|
||||||
<true/>
|
|
||||||
<key>KeepAlive</key>
|
|
||||||
<true/>
|
|
||||||
<key>StandardOutPath</key>
|
|
||||||
<string>/var/log/hayaku_daemon.log</string>
|
|
||||||
<key>StandardErrorPath</key>
|
|
||||||
<string>/var/log/hayaku_daemon_error.log</string>
|
|
||||||
<key>UserName</key>
|
|
||||||
<string>root</string>
|
|
||||||
<key>GroupName</key>
|
|
||||||
<string>wheel</string>
|
|
||||||
<key>WorkingDirectory</key>
|
|
||||||
<string>/usr/local/bin/QiuChenly</string>
|
|
||||||
<key>ProcessType</key>
|
|
||||||
<string>Background</string>
|
|
||||||
<key>ThrottleInterval</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
Before Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 661 KiB |
|
Before Width: | Height: | Size: 639 KiB |
@@ -1,58 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Hayaku HTTP守护进程安装脚本
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "安装Hayaku HTTP守护进程..."
|
|
||||||
|
|
||||||
# 检查是否以root权限运行
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
echo "请使用sudo运行此脚本"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 获取脚本所在目录
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
BINARY_NAME="InjectLib"
|
|
||||||
PLIST_NAME="com.qiuchenly.hayaku.daemon.plist"
|
|
||||||
|
|
||||||
# 检查二进制文件是否存在(在脚本同级目录)
|
|
||||||
if [ ! -f "$SCRIPT_DIR/../InjectLib" ]; then
|
|
||||||
echo "错误: 找不到 $BINARY_NAME 文件"
|
|
||||||
echo "请先编译项目"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 创建目录
|
|
||||||
mkdir -p "/usr/local/bin/QiuChenly"
|
|
||||||
cp -r "$SCRIPT_DIR/../tool" "/usr/local/bin/QiuChenly/tool"
|
|
||||||
cp -r "$SCRIPT_DIR/../config.json" "/usr/local/bin/QiuChenly/config.json"
|
|
||||||
cp -r "$SCRIPT_DIR/../frontend" "/usr/local/bin/QiuChenly/frontend"
|
|
||||||
|
|
||||||
# 复制二进制文件到系统目录
|
|
||||||
echo "复制二进制文件到 /usr/local/bin/QiuChenly/"
|
|
||||||
cp "$SCRIPT_DIR/../InjectLib" "/usr/local/bin/QiuChenly/"
|
|
||||||
chmod +x "/usr/local/bin/QiuChenly/$BINARY_NAME"
|
|
||||||
|
|
||||||
xattr -cr "/usr/local/bin/QiuChenly/InjectLib"
|
|
||||||
xattr -cr "/usr/local/bin/QiuChenly/tool"
|
|
||||||
codesign -fs - --all-architectures "/usr/local/bin/QiuChenly/tool/CoreInject.dylib"
|
|
||||||
|
|
||||||
# 复制plist文件到LaunchDaemons目录
|
|
||||||
echo "安装LaunchDaemon配置..."
|
|
||||||
cp "$SCRIPT_DIR/$PLIST_NAME" "/Library/LaunchDaemons/"
|
|
||||||
chmod 644 "/Library/LaunchDaemons/$PLIST_NAME"
|
|
||||||
|
|
||||||
# 加载并启动服务
|
|
||||||
echo "启动服务..."
|
|
||||||
launchctl load "/Library/LaunchDaemons/$PLIST_NAME"
|
|
||||||
launchctl start "com.qiuchenly.hayaku.daemon"
|
|
||||||
|
|
||||||
echo "安装完成!"
|
|
||||||
echo "服务状态:"
|
|
||||||
launchctl list | grep com.qiuchenly.hayaku.daemon || echo "服务未运行"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "访问 http://localhost:15200 查看应用商店"
|
|
||||||
echo "查看日志: tail -f /var/log/hayaku_daemon*"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Hayaku HTTP守护进程卸载脚本
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "卸载Hayaku HTTP守护进程..."
|
|
||||||
|
|
||||||
# 检查是否以root权限运行
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
echo "请使用sudo运行此脚本"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
PLIST_NAME="com.qiuchenly.hayaku.daemon.plist"
|
|
||||||
|
|
||||||
# 停止并卸载服务
|
|
||||||
echo "停止服务..."
|
|
||||||
launchctl stop "com.qiuchenly.hayaku.daemon" 2>/dev/null || true
|
|
||||||
launchctl unload "/Library/LaunchDaemons/$PLIST_NAME" 2>/dev/null || true
|
|
||||||
|
|
||||||
# 删除文件
|
|
||||||
echo "删除文件..."
|
|
||||||
rm -f "/usr/local/bin/QiuChenly/InjectLib"
|
|
||||||
rm -rf "/usr/local/bin/QiuChenly/tool"
|
|
||||||
rm -f "/usr/local/bin/QiuChenly/config.json"
|
|
||||||
rm -rf "/usr/local/bin/QiuChenly/frontend"
|
|
||||||
rm -rf "/usr/local/bin/QiuChenly"
|
|
||||||
rm -f "/Library/LaunchDaemons/$PLIST_NAME"
|
|
||||||
rm -f "/var/log/hayaku_daemon.log"
|
|
||||||
rm -f "/var/log/hayaku_daemon_error.log"
|
|
||||||
|
|
||||||
echo "卸载完成!"
|
|
||||||
1067
res/安装说明.md
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/zsh
|
|
||||||
|
|
||||||
clear
|
|
||||||
cd ~/Library/Preferences/
|
|
||||||
|
|
||||||
echo -e "\e[36mGenerating Licence.....\e[0m"
|
|
||||||
|
|
||||||
openssl genrsa -out temp.pem 2048 >> /dev/null 2>&1
|
|
||||||
openssl rsa -in temp.pem -outform PEM -pubout -out public.pem >> /dev/null 2>&1
|
|
||||||
mv public.pem /Applications/CrossOver.app/Contents/SharedSupport/CrossOver/share/crossover/data/tie.pub
|
|
||||||
echo "[crossmac]\ncustomer=iAnon\nemail=iAnon@ianon.com\nexpires=2999/10/26\n[license]\nid=iAnonIsVeryNice" > com.codeweavers.CrossOver.license
|
|
||||||
openssl dgst -sha1 -sign temp.pem -out com.codeweavers.CrossOver.sig com.codeweavers.CrossOver.license
|
|
||||||
rm temp.pem
|
|
||||||
|
|
||||||
echo -e "\e[32mSuccessfully activated, enjoy!\e[0m"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
var globalThis;
|
|
||||||
void 0 === globalThis && (globalThis = self),
|
|
||||||
(function () {
|
|
||||||
"use strict";
|
|
||||||
globalThis.Emby = {};
|
|
||||||
var docElem,
|
|
||||||
appMode,
|
|
||||||
supportsModules = "noModule" in document.createElement("script"),
|
|
||||||
usesModules = !1;
|
|
||||||
function loadScript(src) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
var doc = document,
|
|
||||||
script = doc.createElement("script");
|
|
||||||
globalThis.urlCacheParam && (src += "?" + globalThis.urlCacheParam),
|
|
||||||
usesModules && supportsModules && (script.type = "module"),
|
|
||||||
(script.onload = resolve),
|
|
||||||
(script.onerror = reject),
|
|
||||||
(script.src = src),
|
|
||||||
doc.head.appendChild(script);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function catchAndResolve(err) {
|
|
||||||
return (
|
|
||||||
console.log("error registering service worker: " + err),
|
|
||||||
Promise.resolve()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
function loadRequire() {
|
|
||||||
return loadScript("./modules/alameda/alameda.js");
|
|
||||||
}
|
|
||||||
function loadApp() {
|
|
||||||
var baseRoute,
|
|
||||||
config = {
|
|
||||||
urlArgs: globalThis.urlCacheParam,
|
|
||||||
renameJsExtension: globalThis.Emby.jsExtension,
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
"android" !== globalThis.appMode &&
|
|
||||||
((baseRoute = (baseRoute = globalThis.location.href
|
|
||||||
.split("?")[0]
|
|
||||||
.replace("/index.html", "")).split("#")[0]).lastIndexOf("/") ===
|
|
||||||
baseRoute.length - 1 &&
|
|
||||||
(baseRoute = baseRoute.substring(0, baseRoute.length - 1)),
|
|
||||||
console.log("Setting require baseUrl to " + baseRoute),
|
|
||||||
(config.baseUrl = baseRoute)),
|
|
||||||
require.config(config),
|
|
||||||
loadScript("./app.js")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
function onPromiseLoaded() {
|
|
||||||
!(function () {
|
|
||||||
switch (globalThis.appMode) {
|
|
||||||
case "ios":
|
|
||||||
case "android":
|
|
||||||
case "windows":
|
|
||||||
case "winjs":
|
|
||||||
case "tizen":
|
|
||||||
case "webos":
|
|
||||||
case "chromecast":
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
return "undefined" != typeof caches && navigator.serviceWorker
|
|
||||||
? caches.open("embyappinfo").then(function (cache) {
|
|
||||||
return cache
|
|
||||||
.put(
|
|
||||||
"appversion",
|
|
||||||
new Response(globalThis.dashboardVersion || "")
|
|
||||||
)
|
|
||||||
.then(function () {
|
|
||||||
try {
|
|
||||||
var serviceWorkerOptions = {};
|
|
||||||
return (
|
|
||||||
usesModules &&
|
|
||||||
supportsModules &&
|
|
||||||
(serviceWorkerOptions.type = "module"),
|
|
||||||
navigator.serviceWorker
|
|
||||||
.register("serviceworker.js", serviceWorkerOptions)
|
|
||||||
.then(function () {
|
|
||||||
return navigator.serviceWorker.ready.then(
|
|
||||||
function () {
|
|
||||||
"standalone" === globalThis.appMode &&
|
|
||||||
(globalThis.urlCacheParam = null),
|
|
||||||
(Emby.serviceWorkerEnabled = !0);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}, catchAndResolve)
|
|
||||||
.then(function (reg) {
|
|
||||||
return reg && reg.sync
|
|
||||||
? reg.sync.register("emby-sync")
|
|
||||||
: Promise.resolve();
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
console.log("Error registering serviceWorker: " + err);
|
|
||||||
}
|
|
||||||
}, catchAndResolve);
|
|
||||||
}, catchAndResolve)
|
|
||||||
: Promise.resolve();
|
|
||||||
})()
|
|
||||||
.then(loadRequire, loadRequire)
|
|
||||||
.then(loadApp, loadApp);
|
|
||||||
}
|
|
||||||
(globalThis.Emby.requiresClassesPolyfill = !!1),
|
|
||||||
(docElem = document.documentElement),
|
|
||||||
(appMode = docElem.getAttribute("data-appmode")) &&
|
|
||||||
(globalThis.appMode = appMode),
|
|
||||||
(docElem = docElem.getAttribute("data-appversion")) &&
|
|
||||||
(globalThis.dashboardVersion = docElem),
|
|
||||||
docElem
|
|
||||||
? (globalThis.urlCacheParam = "v=" + docElem)
|
|
||||||
: appMode || (globalThis.urlCacheParam = "v=" + Date.now()),
|
|
||||||
(function (onDone) {
|
|
||||||
// 重写全局的 fetch 函数
|
|
||||||
//powered by QiuChenly use node module hook
|
|
||||||
(window.fetch1 = window.fetch),
|
|
||||||
(window.fetch = (url, options) => {
|
|
||||||
console.log("加载的URL是:", url);
|
|
||||||
//如果url 包含 https://mb3admin.com/admin/service/registration/validateDevice 则直接返回
|
|
||||||
/**
|
|
||||||
* {
|
|
||||||
status: 200,
|
|
||||||
headers: $response.headers,
|
|
||||||
body: '{"cacheExpirationDays":999,"resultCode":"GOOD","message":"Device Valid"}'
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (
|
|
||||||
url ===
|
|
||||||
"https://mb3admin.com/admin/service/registration/getStatus" ||
|
|
||||||
url.includes(
|
|
||||||
"https://mb3admin.com/admin/service/registration/validateDevice"
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
resolve({
|
|
||||||
status: 200,
|
|
||||||
headers: {
|
|
||||||
get: () => "application/json",
|
|
||||||
},
|
|
||||||
json: () => {
|
|
||||||
return {
|
|
||||||
SupporterKey: "1234",
|
|
||||||
IsMBSupporter: true,
|
|
||||||
// =======================
|
|
||||||
cacheExpirationDays: 999,
|
|
||||||
resultCode: "GOOD",
|
|
||||||
message: "Device Valid",
|
|
||||||
// 上半部分是分开的
|
|
||||||
deviceStatus: 0,
|
|
||||||
planType: "超级会员",
|
|
||||||
subscriptions: [
|
|
||||||
{
|
|
||||||
autoRenew: true,
|
|
||||||
store: "秋城落叶",
|
|
||||||
feature: "all",
|
|
||||||
planType: "超级会员",
|
|
||||||
expDate: "直到2099年12月31日以后",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return window.fetch1(url, options);
|
|
||||||
});
|
|
||||||
var doc, script, src;
|
|
||||||
globalThis.Promise && globalThis.Promise.all
|
|
||||||
? onDone()
|
|
||||||
: ((script = (doc = document).createElement("script")),
|
|
||||||
(src = "./modules/polyfills/native-promise-only.js"),
|
|
||||||
globalThis.urlCacheParam && (src += "?" + globalThis.urlCacheParam),
|
|
||||||
(script.onload = onDone),
|
|
||||||
(script.src = src),
|
|
||||||
doc.head.appendChild(script));
|
|
||||||
})(onPromiseLoaded);
|
|
||||||
})();
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
services:
|
|
||||||
docker_emby_system:
|
|
||||||
image: emby/embyserver:4.9.0.23
|
|
||||||
privileged: true
|
|
||||||
container_name: docker_emby_system
|
|
||||||
hostname: "MediaServerCenter"
|
|
||||||
# network_mode: host # Enable DLNA and Wake-on-Lan
|
|
||||||
environment:
|
|
||||||
# 你的用户id是多少就是多少uid=1000(qiuchenly) gid=1000(qiuchenly) groups=1000(qiuchenly) 直接写就是了
|
|
||||||
- TZ=Asia/Shanghai
|
|
||||||
- UID=1000 # The UID to run emby as (default: 2)
|
|
||||||
- GID=100 # The GID to run emby as (default 2)
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=100
|
|
||||||
- GIDLIST=1000 # A comma-separated list of additional GIDs to run emby as (default: 2)
|
|
||||||
extra_hosts:
|
|
||||||
- "thetvdb.com:65.8.170.107"
|
|
||||||
- 'api4.thetvdb.com:65.8.161.129'
|
|
||||||
- 'api4.thetvdb.com:65.8.161.105'
|
|
||||||
- 'api4.thetvdb.com:65.8.161.49'
|
|
||||||
- 'api4.thetvdb.com:65.8.161.38'
|
|
||||||
- 'api.themoviedb.org:65.8.161.111'
|
|
||||||
- 'api.themoviedb.org:65.8.161.126'
|
|
||||||
- 'api.themoviedb.org:65.8.161.83'
|
|
||||||
- 'api.themoviedb.org:65.8.161.37'
|
|
||||||
- 'image.tmdb.org:143.244.50.87'
|
|
||||||
- 'artworks.thetvdb.com:99.84.234.115'
|
|
||||||
- 'musicbrainz.emby.tv:23.239.10.174'
|
|
||||||
- 'www.theaudiodb.com:104.21.57.210'
|
|
||||||
- 'www.theaudiodb.com:172.67.149.243'
|
|
||||||
- 'webservice.fanart.tv:51.89.210.79'
|
|
||||||
- 'www.theaudiodb.com:172.67.149.243'
|
|
||||||
- 'www.theaudiodb.com:104.21.57.210'
|
|
||||||
volumes:
|
|
||||||
- emby-config:/config # Configuration directory
|
|
||||||
- /Volumes/data:/ExternalDisk
|
|
||||||
- ./apploader.js:/system/dashboard-ui/apploader.js
|
|
||||||
- ./Emby.Server.Implementations.dll:/system/Emby.Server.Implementations.dll
|
|
||||||
devices:
|
|
||||||
# 让宿主机显卡可以被调用 否则没有硬件解码器 chmod -R 777 /dev/dri
|
|
||||||
- /dev/dri:/dev/dri # VAAPI/NVDEC/NVENC render nodes
|
|
||||||
ports:
|
|
||||||
- "8096:8096"
|
|
||||||
# HTTP port
|
|
||||||
#- "8920:8920" # HTTPS port
|
|
||||||
restart: always
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
emby-config:
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# 自用EmbyServer破解
|
|
||||||
|
|
||||||
## 使用
|
|
||||||
1. 修改映射目录
|
|
||||||
2. docker compose up -d
|
|
||||||
|
|
||||||
## 对应版本
|
|
||||||
emby/embyserver:4.9.0.23
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
1. emby config自动存在于一个独立的镜像。如果需要docker compose down的时候也删掉这个配置保存内容,带上-v。
|
|
||||||
2. 如果不带-v,那么docker compose down是不会删除配置信息的,包括你的数据缓存。下次更新只需要docker compose down && docker compose up -d即可。
|
|
||||||
|
|
||||||
## 破解原理
|
|
||||||
1. 硬件解码
|
|
||||||
找到Security类,修改一个字节:
|
|
||||||
```c#
|
|
||||||
bool Emby.Server.Implementations.Security.RegRecord::get_registered()
|
|
||||||
return true;
|
|
||||||
```
|
|
||||||
2. 服务器验证
|
|
||||||
拦截hook http页面请求。这里涉及到前端js层hook,技术理解比较深入,不建议新手研究。
|
|
||||||
|
|
||||||
## 备注
|
|
||||||
|
|
||||||
破解个毫无安全意识的app,把网上不少贵物小学生得瑟的那样,发个版本到处装大神,你装你吗呢?菜鸟。
|
|
||||||
@@ -1,291 +0,0 @@
|
|||||||
#!/bin/zsh
|
|
||||||
|
|
||||||
/usr/bin/logger "Starting Office for Mac License Removal 2.7"
|
|
||||||
|
|
||||||
## CONSTANTS
|
|
||||||
PERPLICENSE="/Library/Preferences/com.microsoft.office.licensingV2.plist"
|
|
||||||
PERPLICENSEBACKUP="/Library/Preferences/com.microsoft.office.licensingV2.Backup"
|
|
||||||
|
|
||||||
## FUNCTIONS
|
|
||||||
GetLoggedInUser() {
|
|
||||||
LOGGEDIN=$(/bin/echo "show State:/Users/ConsoleUser" | /usr/sbin/scutil | /usr/bin/awk '/Name :/&&!/loginwindow/{print $3}')
|
|
||||||
if [ "$LOGGEDIN" = "" ]; then
|
|
||||||
echo "$USER"
|
|
||||||
else
|
|
||||||
echo "$LOGGEDIN"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
SetHomeFolder() {
|
|
||||||
HOME=$(dscl . read /Users/"$1" NFSHomeDirectory | cut -d ':' -f2 | cut -d ' ' -f2)
|
|
||||||
if [ "$HOME" = "" ]; then
|
|
||||||
if [ -d "/Users/$1" ]; then
|
|
||||||
HOME="/Users/$1"
|
|
||||||
else
|
|
||||||
HOME=$(eval echo "~$1")
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
GetNodeId() {
|
|
||||||
# Get node_id value from Registry
|
|
||||||
local NAME="$1"
|
|
||||||
local PARENT="$2"
|
|
||||||
local NODEVALUE=$(sqlite3 "$REGISTRY" "SELECT node_id from HKEY_CURRENT_USER WHERE name='$NAME' AND parent_id=$PARENT;")
|
|
||||||
if [ "$NODEVALUE" == '' ]; then
|
|
||||||
echo "0"
|
|
||||||
else
|
|
||||||
echo "$NODEVALUE"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
GetNodeVal() {
|
|
||||||
# Get node value from Registry
|
|
||||||
local NAME="$1"
|
|
||||||
local NODEID="$2"
|
|
||||||
local NODEVALUE=$(sqlite3 "$REGISTRY" "SELECT node_id from HKEY_CURRENT_USER_values WHERE name='$NAME' AND parent_id=$NODEID;")
|
|
||||||
if [ "$NODEVALUE" == '' ]; then
|
|
||||||
echo "0"
|
|
||||||
else
|
|
||||||
echo "$NODEVALUE"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
DeleteValue() {
|
|
||||||
# Delete value from Registry
|
|
||||||
local NAME="$1"
|
|
||||||
local NODEID="$2"
|
|
||||||
sqlite3 "$REGISTRY" "DELETE FROM HKEY_CURRENT_USER_values WHERE name='$NAME' and node_id=$NODEID;"
|
|
||||||
}
|
|
||||||
|
|
||||||
NukeValue() {
|
|
||||||
# Delete value from Registry with just the node name
|
|
||||||
local NAME="$1"
|
|
||||||
sqlite3 "$REGISTRY" "DELETE FROM HKEY_CURRENT_USER_values WHERE name='$NAME';"
|
|
||||||
}
|
|
||||||
|
|
||||||
DeleteNode() {
|
|
||||||
# Delete node and all contained values from Registry
|
|
||||||
local NODEID="$1"
|
|
||||||
sqlite3 "$REGISTRY" "DELETE FROM HKEY_CURRENT_USER_values WHERE node_id=$NODEID;"
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoveFlightData() {
|
|
||||||
# Remove all flighting keys from the specified app
|
|
||||||
local KEY_APP="$1"
|
|
||||||
# If the flight keys are set, remove the existing values
|
|
||||||
KEY_ETAG=($GetNodeVal "ETag" "$KEY_APP")
|
|
||||||
if [ "$KEY_ETAG" != "0" ]; then
|
|
||||||
DeleteValue "ETag" "$KEY_APP"
|
|
||||||
fi
|
|
||||||
KEY_EXPIRES=($GetNodeVal "Expires" "$KEY_APP")
|
|
||||||
if [ "$KEY_EXPIRES" != "0" ]; then
|
|
||||||
DeleteValue "Expires" "$KEY_APP"
|
|
||||||
fi
|
|
||||||
KEY_DEFERRED=($GetNodeVal "DeferredConfigs" "$KEY_APP")
|
|
||||||
if [ "$KEY_DEFERRED" != "0" ]; then
|
|
||||||
DeleteValue "DeferredConfigs" "$KEY_APP"
|
|
||||||
fi
|
|
||||||
KEY_CONFIGID=($GetNodeVal "ConfigIds" "$KEY_APP")
|
|
||||||
if [ "$KEY_CONFIGID" != "0" ]; then
|
|
||||||
DeleteValue "ConfigIds" "$KEY_APP"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
## MAIN
|
|
||||||
LoggedInUser=$(GetLoggedInUser)
|
|
||||||
SetHomeFolder "$LoggedInUser"
|
|
||||||
echo "Running as: $LoggedInUser; Home Folder: $HOME"
|
|
||||||
|
|
||||||
REGISTRY="$HOME/Library/Group Containers/UBF8T346G9.Office/MicrosoftRegistrationDB.reg"
|
|
||||||
O365SUBMAIN="$HOME/Library/Group Containers/UBF8T346G9.Office/com.microsoft.Office365.plist"
|
|
||||||
O365SUBBAK1="$HOME/Library/Group Containers/UBF8T346G9.Office/com.microsoft.e0E2OUQxNUY1LTAxOUQtNDQwNS04QkJELTAxQTI5M0JBOTk4O.plist"
|
|
||||||
O365SUBBAK2="$HOME/Library/Group Containers/UBF8T346G9.Office/e0E2OUQxNUY1LTAxOUQtNDQwNS04QkJELTAxQTI5M0JBOTk4O"
|
|
||||||
O365SUBMAINB="$HOME/Library/Group Containers/UBF8T346G9.Office/com.microsoft.Office365V2.plist"
|
|
||||||
O365SUBBAK1B="$HOME/Library/Group Containers/UBF8T346G9.Office/com.microsoft.O4kTOBJ0M5ITQxATLEJkQ40SNwQDNtQUOxATL1YUNxQUO2E0e.plist"
|
|
||||||
O365SUBBAK2B="$HOME/Library/Group Containers/UBF8T346G9.Office/O4kTOBJ0M5ITQxATLEJkQ40SNwQDNtQUOxATL1YUNxQUO2E0e"
|
|
||||||
O365PRODUCT="$HOME/Library/Group Containers/UBF8T346G9.Office"
|
|
||||||
VNEXTLICENSEPATH="$O365PRODUCT/Licenses"
|
|
||||||
VNEXTPERPETUALLICENSEPATH="/Library/Microsoft/Office/Licenses"
|
|
||||||
|
|
||||||
# Forcibly close Office apps if they are running
|
|
||||||
/usr/bin/pkill -HUP "Microsoft Word"
|
|
||||||
/usr/bin/pkill -HUP "Microsoft Excel"
|
|
||||||
/usr/bin/pkill -HUP "Microsoft PowerPoint"
|
|
||||||
/usr/bin/pkill -HUP "Microsoft Outlook"
|
|
||||||
/usr/bin/pkill -HUP "Microsoft OneNote"
|
|
||||||
|
|
||||||
# Remove the Perpetual/Volume License from the computer
|
|
||||||
if [ -f "$PERPLICENSE" ]
|
|
||||||
then
|
|
||||||
/usr/bin/logger "Detected $PERPLICENSE file"
|
|
||||||
/usr/bin/sudo mv -f "$PERPLICENSE" "$PERPLICENSEBACKUP"
|
|
||||||
/usr/bin/logger "Removed $PERPLICENSE file"
|
|
||||||
else
|
|
||||||
/usr/bin/logger "Did NOT detect $PERPLICENSE file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove the 2021 Consumer Perpetual Licence from the computer
|
|
||||||
if [ -e "$VNEXTPERPETUALLICENSEPATH" ]
|
|
||||||
then
|
|
||||||
/usr/bin/logger "Detected $VNEXTPERPETUALLICENSEPATH folder"
|
|
||||||
/usr/bin/sudo rm -rf "$VNEXTPERPETUALLICENSEPATH"
|
|
||||||
/usr/bin/logger "Removed $VNEXTPERPETUALLICENSEPATH folder"
|
|
||||||
else
|
|
||||||
/usr/bin/logger "Did NOT detect $VNEXTPERPETUALLICENSEPATH folder"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove the Office 365 Subscription License
|
|
||||||
if [ -f "$O365SUBMAIN" ] || [ -f "$O365SUBBAK1" ] || [ -f "$O365SUBBAK2" ] || [ -f "$O365SUBMAINB" ] || [ -f "$O365SUBBAK1B" ] || [ -f "$O365SUBBAK2B" ] || [ -e "$VNEXTLICENSEPATH" ]
|
|
||||||
then
|
|
||||||
/bin/logger "Detected Office 365 Subscription License file"
|
|
||||||
/bin/rm -f "$O365SUBMAIN"
|
|
||||||
/bin/rm -f "$O365SUBBAK1"
|
|
||||||
/bin/rm -f "$O365SUBBAK2"
|
|
||||||
/bin/rm -f "$O365SUBMAINB"
|
|
||||||
/bin/rm -f "$O365SUBBAK1B"
|
|
||||||
/bin/rm -f "$O365SUBBAK2B"
|
|
||||||
/bin/rm -rf "$VNEXTLICENSEPATH"
|
|
||||||
/usr/bin/logger "Removed all Office 365 Subscription License files"
|
|
||||||
else
|
|
||||||
/usr/bin/logger "Did NOT detect Office 365 Subscription License file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
KeychainHasLogin=$(/usr/bin/security list-keychains | grep 'login.keychain')
|
|
||||||
if [ "$KeychainHasLogin" = "" ]; then
|
|
||||||
echo "Adding user login keychain to list"
|
|
||||||
/usr/bin/security list-keychains -s "$HOME/Library/Keychains/login.keychain-db"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Display list-keychains for logged-in user"
|
|
||||||
/usr/bin/security list-keychains
|
|
||||||
|
|
||||||
# Remove any keychain entries for Office
|
|
||||||
/usr/bin/security delete-generic-password -s 'OneAuthAccount'
|
|
||||||
/usr/bin/security delete-internet-password -s 'msoCredentialSchemeADAL'
|
|
||||||
/usr/bin/security delete-internet-password -s 'msoCredentialSchemeLiveId'
|
|
||||||
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Settings 2'
|
|
||||||
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Settings 3'
|
|
||||||
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Cache 2'
|
|
||||||
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Cache 3'
|
|
||||||
/usr/bin/security delete-generic-password -l 'Microsoft Office Ticket Cache'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.microsoft.adalcache'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.microsoft.OutlookCore.Secret'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MicrosoftOfficeRMSCredential'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MSProtection.framework.service'
|
|
||||||
/usr/bin/security delete-generic-password -G 'MSOpenTech.ADAL.1'
|
|
||||||
/usr/bin/security delete-generic-password -G 'MSOpenTech.ADAL.1'
|
|
||||||
/usr/bin/security delete-generic-password -G 'Microsoft Office Data'
|
|
||||||
/usr/bin/security delete-generic-password -G 'Microsoft Office Data'
|
|
||||||
/usr/bin/security delete-generic-password -G 'Microsoft Office Data'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.microsoft.OutlookCore.Secret'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.helpshift.data_com.microsoft.Outlook'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.helpshift.data_com.microsoft.Outlook'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.helpshift.data_com.microsoft.Outlook'
|
|
||||||
/usr/bin/security delete-generic-password -l 'com.helpshift.data_com.microsoft.Outlook'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MicrosoftOfficeRMSCredential'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MicrosoftOfficeRMSCredential'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MSProtection.framework.service'
|
|
||||||
/usr/bin/security delete-generic-password -l 'MSProtection.framework.service'
|
|
||||||
/usr/bin/logger "Removed all Office keychain entries"
|
|
||||||
|
|
||||||
# Remove the Belongs To information
|
|
||||||
if [ -e "$HOME/Library/Preferences/com.microsoft.office.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults delete $HOME/Library/Preferences/com.microsoft.office OfficeActivationEmailAddress
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Preferences/com.microsoft.office OfficeAutoSignIn -bool TRUE
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Preferences/com.microsoft.office HasUserSeenFREDialog -bool TRUE
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Preferences/com.microsoft.office HasUserSeenEnterpriseFREDialog -bool TRUE
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Reset the first run experience for each licensed app
|
|
||||||
if [ -e "$HOME/Library/Containers/com.microsoft.Word/Data/Library/Preferences/com.microsoft.Word.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Containers/com.microsoft.Word/Data/Library/Preferences/com.microsoft.Word kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
||||||
fi
|
|
||||||
if [ -e "$HOME/Library/Containers/com.microsoft.Excel/Data/Library/Preferences/com.microsoft.Excel.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Containers/com.microsoft.Excel/Data/Library/Preferences/com.microsoft.Excel kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
||||||
fi
|
|
||||||
if [ -e "$HOME/Library/Containers/com.microsoft.Powerpoint/Data/Library/Preferences/com.microsoft.Powerpoint.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Containers/com.microsoft.Powerpoint/Data/Library/Preferences/com.microsoft.Powerpoint kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
||||||
fi
|
|
||||||
if [ -e "$HOME/Library/Containers/com.microsoft.Outlook/Data/Library/Preferences/com.microsoft.Outlook.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Containers/com.microsoft.Outlook/Data/Library/Preferences/com.microsoft.Outlook kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
||||||
fi
|
|
||||||
if [ -e "$HOME/Library/Containers/com.microsoft.onenote.mac/Data/Library/Preferences/com.microsoft.onenote.mac.plist" ]; then
|
|
||||||
/usr/bin/sudo -u $LoggedInUser /usr/bin/defaults write $HOME/Library/Containers/com.microsoft.onenote.mac/Data/Library/Preferences/com.microsoft.onenote.mac kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
||||||
fi
|
|
||||||
|
|
||||||
/usr/bin/logger "Set apps back to first run state"
|
|
||||||
|
|
||||||
# Remove the current flights from the registry
|
|
||||||
KEY_SOFTWARE=$(GetNodeId "Software" '-1')
|
|
||||||
KEY_MICROSOFT=$(GetNodeId "Microsoft" "$KEY_SOFTWARE")
|
|
||||||
KEY_OFFICE=$(GetNodeId "Office" "$KEY_MICROSOFT")
|
|
||||||
KEY_VERSION=$(GetNodeId "16.0" "$KEY_OFFICE")
|
|
||||||
KEY_COMMON=$(GetNodeId "Common" "$KEY_VERSION")
|
|
||||||
KEY_ECS=$(GetNodeId "ExperimentEcs" "$KEY_COMMON")
|
|
||||||
KEY_WORD=$(GetNodeId "word" "$KEY_ECS")
|
|
||||||
KEY_WORD_FLIGHTS=$(GetNodeId "Flights" "$KEY_WORD")
|
|
||||||
KEY_EXCEL=$(GetNodeId "excel" "$KEY_ECS")
|
|
||||||
KEY_EXCEL_FLIGHTS=$(GetNodeId "Flights" "$KEY_EXCEL")
|
|
||||||
KEY_POWERPOINT=$(GetNodeId "powerpoint" "$KEY_ECS")
|
|
||||||
KEY_POWERPOINT_FLIGHTS=$(GetNodeId "Flights" "$KEY_POWERPOINT")
|
|
||||||
KEY_OUTLOOK=$(GetNodeId "outlook" "$KEY_ECS")
|
|
||||||
KEY_OUTLOOK_FLIGHTS=$(GetNodeId "Flights" "$KEY_OUTLOOK")
|
|
||||||
KEY_ONENOTE=$(GetNodeId "onenote" "$KEY_ECS")
|
|
||||||
KEY_ONENOTE_FLIGHTS=$(GetNodeId "Flights" "$KEY_ONENOTE")
|
|
||||||
KEY_LICENSING=$(GetNodeId "licensingdaemon" "$KEY_ECS")
|
|
||||||
KEY_LICENSING_FLIGHTS=$(GetNodeId "Flights" "$KEY_LICENSING")
|
|
||||||
|
|
||||||
KEY_EX_CONFIGS=$(GetNodeId "ExperimentConfigs" "$KEY_COMMON")
|
|
||||||
KEY_EX_ECS=$(GetNodeId "Ecs" "$KEY_EX_CONFIGS")
|
|
||||||
KEY_EX_ECS_WORD=$(GetNodeId "word" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_WORD_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_WORD")
|
|
||||||
KEY_EX_ECS_EXCEL=$(GetNodeId "excel" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_EXCEL_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_EXCEL")
|
|
||||||
KEY_EX_ECS_POWERPOINT=$(GetNodeId "powerpoint" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_POWERPOINT_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_POWERPOINT")
|
|
||||||
KEY_EX_ECS_OUTLOOK=$(GetNodeId "outlook" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_OUTLOOK_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_OUTLOOK")
|
|
||||||
KEY_EX_ECS_ONENOTE=$(GetNodeId "onenote" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_ONENOTE_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_ONENOTE")
|
|
||||||
KEY_EX_ECS_LICENSING=$(GetNodeId "licensingdaemon" "$KEY_EX_ECS")
|
|
||||||
KEY_EX_ECS_LICENSING_CCD=$(GetNodeId "ConfigContextData" "$KEY_EX_ECS_LICENSING")
|
|
||||||
|
|
||||||
RemoveFlightData "$KEY_WORD"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_WORD"
|
|
||||||
DeleteNode "$KEY_WORD_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_WORD_CCD"
|
|
||||||
RemoveFlightData "$KEY_EXCEL"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_EXCEL"
|
|
||||||
DeleteNode "$KEY_EXCEL_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_EXCEL_CCD"
|
|
||||||
RemoveFlightData "$KEY_POWERPOINT"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_POWERPOINT"
|
|
||||||
DeleteNode "$KEY_POWERPOINT_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_POWERPOINT_CCD"
|
|
||||||
RemoveFlightData "$KEY_OUTLOOK"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_OUTLOOK"
|
|
||||||
DeleteNode "$KEY_OUTLOOK_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_OUTLOOK_CCD"
|
|
||||||
RemoveFlightData "$KEY_ONENOTE"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_ONENOTE"
|
|
||||||
DeleteNode "$KEY_ONENOTE_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_ONENOTE_CCD"
|
|
||||||
RemoveFlightData "$KEY_LICENSING"
|
|
||||||
RemoveFlightData "$KEY_EX_ECS_LICENSING"
|
|
||||||
DeleteNode "$KEY_LICENSING_FLIGHTS"
|
|
||||||
DeleteNode "$KEY_EX_ECS_LICENSING_CCD"
|
|
||||||
/usr/bin/logger "Removed all Office flighting data"
|
|
||||||
|
|
||||||
# Forcibly remove any Config Service Caching
|
|
||||||
NukeValue "AuthorityUrl"
|
|
||||||
NukeValue "FilePath"
|
|
||||||
NukeValue "Url"
|
|
||||||
|
|
||||||
# Restart the CFPreferences daemon to ensure that all caches are flushed
|
|
||||||
/usr/bin/sudo /usr/bin/killall cfprefsd
|
|
||||||
/usr/bin/logger "Terminated all instances of CFPrefsd"
|
|
||||||
|
|
||||||
/usr/bin/logger "Completed Office for Mac License Removal 2.7"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
import os, datetime, shutil
|
|
||||||
|
|
||||||
def extract(base):
|
|
||||||
os.system(f"cd {base} && asar extract obsidian.asar obsidian")
|
|
||||||
|
|
||||||
def pack(base):
|
|
||||||
os.system(f"cd {base} && asar pack obsidian obsidian.asar")
|
|
||||||
|
|
||||||
def log(msg):
|
|
||||||
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
print(f"「{now}」 {msg}")
|
|
||||||
|
|
||||||
def is_obsidian_running():
|
|
||||||
if os.system("pgrep -x Obsidian > /dev/null 2>&1") == 0:
|
|
||||||
log("检测到 Obsidian 进程正在运行,请先关闭 Obsidian 进程")
|
|
||||||
# os.system("killall -9 Obsidian")
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
def crack_app(base):
|
|
||||||
destination_path = f"{base}/obsidian"
|
|
||||||
|
|
||||||
app_js_file_path = os.path.join(destination_path, "app.js")
|
|
||||||
|
|
||||||
with open(app_js_file_path, "r", encoding="utf-8") as file:
|
|
||||||
old_content = """var iY=new(function(){function e(){this.keyValidation="",this.company="",this.expiry=0,this.seats=0;try{var e=JSON.parse(localStorage.getItem(zK));this.email=e.email,this.name=e.name,this.token=e.token,this.license=e.license,this.key=e.key}catch(e){}}return e.prototype.save=function(){var e={email:this.email,name:this.name,token:this.token,license:this.license,key:this.key};localStorage.setItem(zK,JSON.stringify(e))},e.prototype.setKey=function(e){this.key=e,this.save()},e}());"""
|
|
||||||
new_content = """
|
|
||||||
var iY = new ((function () {
|
|
||||||
function e() {
|
|
||||||
(this.keyValidation = "valid"),
|
|
||||||
(this.company = "QiuChenlyTeam"),
|
|
||||||
(this.expiry = 8640000000000),
|
|
||||||
(this.seats = Infinity);
|
|
||||||
(this.email = "QiuChenlyTeam@Cracked.com"),
|
|
||||||
(this.name = "Cracked by QiuChenlyTeam"),
|
|
||||||
(this.token = "e.token"),
|
|
||||||
(this.license = "vip"),
|
|
||||||
(this.key = "Cracked by QiuChenlyTeam");
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
(e.prototype.save = function () {
|
|
||||||
(this.keyValidation = "valid"),
|
|
||||||
(this.company = "QiuChenlyTeam"),
|
|
||||||
(this.expiry = 8640000000000),
|
|
||||||
(this.seats = Infinity);
|
|
||||||
(this.email = "QiuChenlyTeam@Cracked.com"),
|
|
||||||
(this.name = "Cracked by QiuChenlyTeam"),
|
|
||||||
(this.token = "e.token"),
|
|
||||||
(this.license = "vip"),
|
|
||||||
(this.key = "Cracked by QiuChenlyTeam");
|
|
||||||
var e = {
|
|
||||||
email: this.email,
|
|
||||||
name: this.name,
|
|
||||||
token: this.token,
|
|
||||||
license: this.license,
|
|
||||||
key: this.key,
|
|
||||||
};
|
|
||||||
localStorage.setItem(zK, JSON.stringify(e));
|
|
||||||
}), (e.prototype.setKey = function (e) { (this.key = e), this.save(); }), e
|
|
||||||
);
|
|
||||||
})())();"""
|
|
||||||
app_content = file.read()
|
|
||||||
if old_content in app_content:
|
|
||||||
log("激活信息写入中...")
|
|
||||||
new_app_content = app_content.replace(old_content, new_content)
|
|
||||||
|
|
||||||
with open(app_js_file_path, "w", encoding="utf-8") as file2:
|
|
||||||
file2.write(new_app_content)
|
|
||||||
log("激活信息写入完毕")
|
|
||||||
else:
|
|
||||||
log("Obsidian文件已被修改过,请重新下载")
|
|
||||||
|
|
||||||
def crack_asar(base):
|
|
||||||
if not os.path.exists(f"{base}/obsidian_backup.asar"):
|
|
||||||
log("备份 obsidian.asar -> obsidian_backup.asar")
|
|
||||||
shutil.copyfile(f"{base}/obsidian.asar", f"{base}/obsidian_backup.asar")
|
|
||||||
|
|
||||||
log("解包 obsidian.asar")
|
|
||||||
extract(base)
|
|
||||||
crack_app(base)
|
|
||||||
|
|
||||||
log("打包 obsidian.asar")
|
|
||||||
pack(base)
|
|
||||||
log("删除 obsidian 文件夹")
|
|
||||||
shutil.rmtree(f"{base}/obsidian")
|
|
||||||
|
|
||||||
log("正在修复已损坏")
|
|
||||||
os.system("sudo xattr -cr /Applications/Obsidian.app")
|
|
||||||
log("修复完毕")
|
|
||||||
|
|
||||||
def crack(base):
|
|
||||||
log("正在进行 Obsidian 破解操作...")
|
|
||||||
|
|
||||||
if os.system("command -v asar > /dev/null 2>&1") == 1:
|
|
||||||
log("未检测到asar,请先安装asar")
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
# 如果存在obsidian_backup,证明已经用脚本处理过,那就用obsidian_backup重新破解,免得有傻逼瞎几把搞
|
|
||||||
if os.path.exists(rf"{base}/obsidian_backup.asar"):
|
|
||||||
log("obsidian_backup.asar 已存在,将使用 obsidian_backup 重新激活")
|
|
||||||
os.remove(f"{base}/obsidian.asar")
|
|
||||||
shutil.copyfile(f"{base}/obsidian_backup.asar", f"{base}/obsidian.asar")
|
|
||||||
os.remove(f"{base}/obsidian_backup.asar")
|
|
||||||
|
|
||||||
if os.path.exists(rf"{base}/obsidian.asar"):
|
|
||||||
crack_asar(base)
|
|
||||||
|
|
||||||
log("Obsidian 破解处理完毕")
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
print(" ___ _ ____ _ _ _____")
|
|
||||||
print(" / _ \\(_)_ _ / ___| |__ ___ _ __ | |_ |_ _|__ __ _ _ __ ___")
|
|
||||||
print("| | | | | | | | | | '_ \\ / _ \\ '_ \\| | | | || |/ _ \\/ _` | '_ ` _ \\")
|
|
||||||
print("| |_| | | |_| | |___| | | | __/ | | | | |_| || | __/ (_| | | | | | |")
|
|
||||||
print(" \\__\\_\\_|\\__,_|\\____|_| |_|\\___|_| |_|_|\\__, ||_|\\___|\\__,_|_| |_| |_|")
|
|
||||||
print(" |___/")
|
|
||||||
print("\nQiuChenlyTeam Obsidian「Mac」一键破解脚本 By X1a0He\n")
|
|
||||||
|
|
||||||
is_obsidian_running()
|
|
||||||
|
|
||||||
# 你他妈的,要修改文件都是要权限的,不用 sudo ,你修改nm呢?
|
|
||||||
if not os.geteuid() == 0:
|
|
||||||
log("请以「sudo」运行此脚本")
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
if not os.path.exists("/Applications/Obsidian.app"):
|
|
||||||
log("未检测到 Obsidian.app,结束执行")
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
base = "/Applications/Obsidian.app/Contents/Resources"
|
|
||||||
crack(base)
|
|
||||||
os.system("open -a Obsidian")
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print("\n用户中断了程序执行")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>com.apple.security.app-sandbox</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.assets.pictures.read-only</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.files.downloads.read-write</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.files.user-selected.read-write</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.network.client</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
cp /Applications/Setapp.app/Contents/Library/LaunchServices/Setapp.app/Contents/MacOS/SetappAgent /Applications/Setapp.app/Contents/Library/LaunchServices/Setapp.app/Contents/MacOS/SetappAgent_backup
|
|
||||||
tool/insert_dylib /Applications/Setapp.app/Contents/Frameworks/CoreInject.dylib /Applications/Setapp.app/Contents/Library/LaunchServices/Setapp.app/Contents/MacOS/SetappAgent_backup /Applications/Setapp.app/Contents/Library/LaunchServices/Setapp.app/Contents/MacOS/SetappAgent
|
|
||||||
codesign -fs - /Applications/Setapp.app/Contents/Library/LaunchServices/Setapp.app
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2013-2014 Minkyu Lee. All rights reserved.
|
|
||||||
*
|
|
||||||
* NOTICE: All information contained herein is, and remains the
|
|
||||||
* property of Minkyu Lee. The intellectual and technical concepts
|
|
||||||
* contained herein are proprietary to Minkyu Lee and may be covered
|
|
||||||
* by Republic of Korea and Foreign Patents, patents in process,
|
|
||||||
* and are protected by trade secret or copyright law.
|
|
||||||
* Dissemination of this information or reproduction of this material
|
|
||||||
* is strictly forbidden unless prior written permission is obtained
|
|
||||||
* from Minkyu Lee (niklaus.lee@gmail.com).
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
const { EventEmitter } = require("events");
|
|
||||||
const fs = require("fs");
|
|
||||||
const path = require("path");
|
|
||||||
const crypto = require("crypto");
|
|
||||||
const UnregisteredDialog = require("../dialogs/unregistered-dialog");
|
|
||||||
const SK = "DF9B72CC966FBE3A46F99858C5AEE";
|
|
||||||
const packageJSON = require("../../package.json");
|
|
||||||
|
|
||||||
// Check License When File Save
|
|
||||||
const LICENSE_CHECK_PROBABILITY = 0.3;
|
|
||||||
|
|
||||||
const PRO_DIAGRAM_TYPES = [
|
|
||||||
"SysMLRequirementDiagram",
|
|
||||||
"SysMLBlockDefinitionDiagram",
|
|
||||||
"SysMLInternalBlockDiagram",
|
|
||||||
"SysMLParametricDiagram",
|
|
||||||
"BPMNDiagram",
|
|
||||||
"WFWireframeDiagram",
|
|
||||||
"AWSDiagram",
|
|
||||||
"GCPDiagram",
|
|
||||||
];
|
|
||||||
|
|
||||||
var status = false;
|
|
||||||
var licenseInfo = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set Registration Status
|
|
||||||
* This function is out of LicenseManager class for the security reason
|
|
||||||
* (To disable changing License status by API)
|
|
||||||
* @private
|
|
||||||
* @param {boolean} newStat
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
function setStatus(licenseManager, newStat) {
|
|
||||||
if (status !== newStat) {
|
|
||||||
status = newStat;
|
|
||||||
licenseManager.emit("statusChanged", status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
class LicenseManager extends EventEmitter {
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.projectManager = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
isProDiagram(diagramType) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Registration Status
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get License Infomation
|
|
||||||
* @return {Object}
|
|
||||||
*/
|
|
||||||
getLicenseInfo() {
|
|
||||||
return licenseInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
findLicense() {
|
|
||||||
var licensePath = path.join(app.getUserPath(), "/license.key");
|
|
||||||
if (!fs.existsSync(licensePath)) {
|
|
||||||
licensePath = path.join(app.getAppPath(), "../license.key");
|
|
||||||
}
|
|
||||||
if (fs.existsSync(licensePath)) {
|
|
||||||
return licensePath;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check license validity
|
|
||||||
*
|
|
||||||
* @return {Promise}
|
|
||||||
*/
|
|
||||||
validate() {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
// Local check
|
|
||||||
var file = this.findLicense();
|
|
||||||
if (!file) {
|
|
||||||
reject("License key not found");
|
|
||||||
} else {
|
|
||||||
var data = fs.readFileSync(file, "utf8");
|
|
||||||
licenseInfo = JSON.parse(data);
|
|
||||||
resolve(licenseInfo);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
checkLicenseValidity() {
|
|
||||||
if (packageJSON.config.setappBuild) {
|
|
||||||
setStatus(this, true);
|
|
||||||
} else {
|
|
||||||
this.validate().then(
|
|
||||||
() => {
|
|
||||||
setStatus(this, true);
|
|
||||||
},
|
|
||||||
() => {
|
|
||||||
setStatus(this, false);
|
|
||||||
UnregisteredDialog.showDialog();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the license key in server and store it as license.key file in local
|
|
||||||
*
|
|
||||||
* @param {string} licenseKey
|
|
||||||
*/
|
|
||||||
register(licenseKey) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
var data = {
|
|
||||||
name: "QiuChenlyTeam",
|
|
||||||
product: "STARUML.V6",
|
|
||||||
licenseType: "PRO",
|
|
||||||
quantity: "99999",
|
|
||||||
timestamp: "1575275098",
|
|
||||||
licenseKey: "88888888888888",
|
|
||||||
crackedAuthor: "BilZzard"
|
|
||||||
}
|
|
||||||
if (data.product === packageJSON.config.product_id) {
|
|
||||||
var file = path.join(app.getUserPath(), "/license.key");
|
|
||||||
fs.writeFileSync(file, JSON.stringify(data, 2));
|
|
||||||
licenseInfo = data;
|
|
||||||
setStatus(this, true);
|
|
||||||
resolve(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
htmlReady() {
|
|
||||||
this.projectManager.on("projectSaved", (filename, project) => {
|
|
||||||
var val = Math.floor(Math.random() * (1.0 / LICENSE_CHECK_PROBABILITY));
|
|
||||||
if (val === 0) {
|
|
||||||
this.checkLicenseValidity();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
appReady() {
|
|
||||||
this.checkLicenseValidity();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = LicenseManager;
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
# 检查是否安装了 asar 命令
|
|
||||||
def check_asar_command():
|
|
||||||
return os.system("command -v asar > /dev/null 2>&1") == 0
|
|
||||||
|
|
||||||
if not check_asar_command():
|
|
||||||
print("草泥马,先安装asar。")
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
# 获取用户输入的用户名
|
|
||||||
username = input("请输入用户名: ")
|
|
||||||
# 执行bash命令
|
|
||||||
bash_extract = """
|
|
||||||
cd /Applications/StarUML.app/Contents/Resources && asar extract app.asar app
|
|
||||||
"""
|
|
||||||
os.system(bash_extract)
|
|
||||||
|
|
||||||
# 复制license-manager.js文件到目标位置
|
|
||||||
destination_path = "/Applications/StarUML.app/Contents/Resources/app/src/engine/"
|
|
||||||
os.system("cp -f license-manager.js {}".format(destination_path))
|
|
||||||
|
|
||||||
|
|
||||||
# 将字符串中的"BilZzard"替换为用户输入的文本
|
|
||||||
with open(destination_path + "license-manager.js", 'r') as file:
|
|
||||||
js_content = file.read()
|
|
||||||
new_js_content = js_content.replace('QiuChenlyTeam', username)
|
|
||||||
|
|
||||||
# 将替换后的内容写回到js文件
|
|
||||||
with open(destination_path + "license-manager.js", 'w') as file:
|
|
||||||
file.write(new_js_content)
|
|
||||||
|
|
||||||
# 执行bash命令
|
|
||||||
print("需要修复app,看到提示后输入root密码。")
|
|
||||||
|
|
||||||
bash_pack = """
|
|
||||||
cd /Applications/StarUML.app/Contents/Resources &&
|
|
||||||
asar pack app app.asar &&
|
|
||||||
rm -rf app && sudo xattr -r -d com.apple.quarantine /Applications/StarUML.app
|
|
||||||
"""
|
|
||||||
os.system(bash_pack)
|
|
||||||
|
|
||||||
print("脚本执行完成。请打开后从设置-隐私与安全中打开!之后随便输入激活码即可激活!")
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# ./tool/GenShineImpactStarter /Applications/AirBuddy.app/Contents/Library/LaunchServices/codes.rambo.AirBuddy.Installer codes.rambo.AirBuddy
|
|
||||||
|
|
||||||
# 检查文件是否存在
|
|
||||||
if [ ! -f "/Applications/AirBuddy.app/Contents/Library/LaunchServices/codes.rambo.AirBuddy.Installer_backup" ]; then
|
|
||||||
cp "/Applications/AirBuddy.app/Contents/Library/LaunchServices/codes.rambo.AirBuddy.Installer" "/Applications/AirBuddy.app/Contents/Library/LaunchServices/codes.rambo.AirBuddy.Installer_backup"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 检查文件是否存在
|
|
||||||
if [ ! -f "/Applications/AirBuddy.app/Contents/MacOS/AirBuddy_backup" ]; then
|
|
||||||
cp "/Applications/AirBuddy.app/Contents/MacOS/AirBuddy" "/Applications/AirBuddy.app/Contents/MacOS/AirBuddy_backup"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp tool/91QiuChenly.dylib /Applications/AirBuddy.app/Contents/MacOS/91QiuChenly.dylib
|
|
||||||
|
|
||||||
tool/insert_dylib @executable_path/91QiuChenly.dylib /Applications/AirBuddy.app/Contents/MacOS/AirBuddy_backup /Applications/AirBuddy.app/Contents/MacOS/AirBuddy
|
|
||||||
|
|
||||||
codesign -f -s - /Applications/AirBuddy.app/Contents/Library/LaunchServices/codes.rambo.AirBuddy.Installer
|
|
||||||
|
|
||||||
codesign -f -s - /Applications/AirBuddy.app/Contents/Library/LoginItems/AirBuddyHelper.app
|
|
||||||
|
|
||||||
/usr/libexec/PlistBuddy -c 'Set :SMPrivilegedExecutables:codes.rambo.AirBuddy.Installer identifier \"codes.rambo.AirBuddy.Installer\"' '/Applications/AirBuddy.app/Contents/Info.plist'
|
|
||||||
|
|
||||||
codesign -f -s - /Applications/AirBuddy.app
|
|
||||||
|
|
||||||
xattr -cr /Applications/AirBuddy.app
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/usr/bin/codesign -f -s - /Applications/Camtasia\ 2023.app/Contents/Resources/CLExporter
|
|
||||||
/usr/bin/codesign -f -s - /Applications/Camtasia\ 2023.app/Contents/Resources/CLThumbnailer
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
codesign -fs - "/Applications/Adobe Acrobat DC/Adobe Acrobat.app"
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
codesign -fs - tool/CoreInject.dylib
|
|
||||||
cp tool/CoreInject.dylib '/Applications/IDA Professional 9.1.app/Contents/MacOS/91QiuChenly.dylib'
|
|
||||||
cp "/Applications/IDA Professional 9.1.app/Contents/MacOS/ida" /tmp/ida
|
|
||||||
codesign -fs - /tmp/ida
|
|
||||||
cp /tmp/ida "/Applications/IDA Professional 9.1.app/Contents/MacOS/ida"
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
cp "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/MacOS/Components" "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/MacOS/Components_backup"
|
|
||||||
sudo tool/insert_dylib '/Applications/iStat Menus.app/Contents/Frameworks/91QiuChenly.dylib' "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/MacOS/Components_backup" "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/MacOS/Components"
|
|
||||||
/usr/libexec/PlistBuddy -c "Set :SMPrivilegedExecutables:com.bjango.istatmenus.installer 'identifier \\\"com.bjango.istatmenus.installer\\\"'" "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/Resources/iStat Menus Helper.app/Contents/Info.plist"
|
|
||||||
/usr/bin/codesign -f -s - --timestamp=none --all-architectures --deep "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/Resources/com.bjango.istatmenus.daemon"
|
|
||||||
/usr/bin/codesign -f -s - --timestamp=none --all-architectures --deep "/Applications/iStat Menus.app/Contents/Resources/Components.bundle/Contents/Resources/iStat Menus Helper.app"
|
|
||||||
/usr/bin/codesign -f -s - --timestamp=none --all-architectures --deep "/Applications/iStat Menus.app/Contents/Resources/Components.bundle"
|
|
||||||
xattr -cr "/Applications/iStat Menus.app/Contents/Resources/Components.bundle"
|
|
||||||
BIN
tool/optool
@@ -1,4 +0,0 @@
|
|||||||
cp '/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app/Contents/MacOS/Adobe Lightroom Classic' /tmp/lrc
|
|
||||||
sudo codesign -fs - /tmp/lrc
|
|
||||||
cp /tmp/lrc '/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app/Contents/MacOS/Adobe Lightroom Classic'
|
|
||||||
rm -rf /tmp/lrc
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>com.apple.security.get-task-allow</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.cs.allow-jits</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.cs.debugger</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.cs.disable-library-validation</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 获取当前目录
|
|
||||||
CURRENT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
||||||
sudo pkill -f "sublime_text"
|
|
||||||
|
|
||||||
/usr/bin/codesign -f -s - --timestamp=none --all-architectures --deep "$CURRENT_DIR/CoreInject.dylib"
|
|
||||||
sudo mkdir -p /usr/local/lib
|
|
||||||
sudo cp "$CURRENT_DIR/CoreInject.dylib" /usr/local/lib/qcly
|
|
||||||
|
|
||||||
cp '/Applications/Sublime Text.app/Contents/MacOS/sublime_text' '/Applications/Sublime Text.app/Contents/MacOS/sublime_text_backup'
|
|
||||||
sudo $CURRENT_DIR/insert_dylib "qcly" '/Applications/Sublime Text.app/Contents/MacOS/sublime_text_backup' '/Applications/Sublime Text.app/Contents/MacOS/sublime_text'
|
|
||||||
sudo xattr -cr "/Applications/Sublime Text.app"
|
|
||||||
|
|
||||||
if [[ $(arch) == "arm64" ]]; then
|
|
||||||
echo "当前是 arm64 架构"
|
|
||||||
sudo codesign -fs - --deep /Applications/Sublime\ Text.app
|
|
||||||
else
|
|
||||||
echo "当前不是 arm64 架构"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "注册码:\n----- BEGIN LICENSE -----
|
|
||||||
秋城落叶@outlook.com
|
|
||||||
Unlimited User License
|
|
||||||
EA7E-8888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
88888888888888888888888888888888
|
|
||||||
------ END LICENSE ------"
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
/usr/bin/codesign -f -s - --timestamp=none --all-architectures --deep "tool/CoreInject.dylib"
|
|
||||||
sudo mkdir -p /usr/local/lib
|
|
||||||
sudo cp "tool/CoreInject.dylib" /usr/local/lib/qcly
|
|
||||||
cp '/Applications/Sublime Merge.app/Contents/MacOS/sublime_merge' '/Applications/Sublime Merge.app/Contents/MacOS/sublime_merge_backup'
|
|
||||||
sudo tool/insert_dylib qcly '/Applications/Sublime Merge.app/Contents/MacOS/sublime_merge_backup' '/Applications/Sublime Merge.app/Contents/MacOS/sublime_merge'
|
|
||||||
sudo xattr -cr "/Applications/Sublime Merge.app"
|
|
||||||
|
|
||||||
if [[ $(arch) == "arm64" ]]; then
|
|
||||||
echo "当前是 arm64 架构"
|
|
||||||
sudo codesign -fs - --deep /Applications/Sublime\ Merge.app
|
|
||||||
else
|
|
||||||
echo "当前不是 arm64 架构"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "注册码:\n-----BEGIN LICENSE-----
|
|
||||||
qiuchenly@outlook.com
|
|
||||||
Unlimited User License
|
|
||||||
E52D-73WX6E7KFW
|
|
||||||
3WSY28516XZBBBUAKIE3K62SPQ9TDRHV
|
|
||||||
TDLUO8M6ADKRAA888FEXKAPAF0HJE60W
|
|
||||||
92AVK103WAW1294SMQI9QJBEL4OT646C
|
|
||||||
DT5KM9OO0JWVCAKZV2SKTVQ395W9CM74
|
|
||||||
CY24F9VXU6AHJ2ZD41UW6MXEBBGBMVJT
|
|
||||||
MDWWA666OTZL1UHLULMPLYKIKRK7CLFJ
|
|
||||||
VASMFT7HHGHZK2LLO09R2ECMV9SEEWMK
|
|
||||||
E64V59PRUXKBKZBA9404KXIXDJRK4TOC
|
|
||||||
-----END LICENSE-----"
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>com.qiuchenly.macos.god</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>/usr/local/bin/macOSGod</string>
|
|
||||||
<string>/usr/local/lib/CoreInject.dylib</string>
|
|
||||||
<string>Surge</string>
|
|
||||||
<string>com.nssurge.surge-mac.ne</string>
|
|
||||||
</array>
|
|
||||||
<key>UnSupported</key>
|
|
||||||
<array>
|
|
||||||
<string>Navicat Premium</string>
|
|
||||||
<string>Proxyman</string>
|
|
||||||
<string>Infuse</string>
|
|
||||||
<string>App Cleaner 8</string>
|
|
||||||
<string>prl_client_app</string>
|
|
||||||
<string>prl_vm_app</string>
|
|
||||||
<string>prl_disp_service</string>
|
|
||||||
</array>
|
|
||||||
<key>RunAtLoad</key>
|
|
||||||
<true/>
|
|
||||||
<key>KeepAlive</key>
|
|
||||||
<true/>
|
|
||||||
<key>StandardOutPath</key>
|
|
||||||
<string>/var/log/macos_god.log</string>
|
|
||||||
<key>StandardErrorPath</key>
|
|
||||||
<string>/var/log/macos_god_error.log</string>
|
|
||||||
<key>UserName</key>
|
|
||||||
<string>root</string>
|
|
||||||
<key>GroupName</key>
|
|
||||||
<string>wheel</string>
|
|
||||||
<key>WorkingDirectory</key>
|
|
||||||
<string>/usr/local/bin</string>
|
|
||||||
<key>ProcessType</key>
|
|
||||||
<string>Background</string>
|
|
||||||
<key>ThrottleInterval</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# 颜色定义
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# 日志函数
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[*] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[+] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[!] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo -e "${RED}[×] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查是否以root权限运行
|
|
||||||
check_root() {
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
log_error "必须以root权限运行"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
qiuchenly=../tool/CoreInject.dylib
|
|
||||||
|
|
||||||
# 安装文件
|
|
||||||
install_files() {
|
|
||||||
log_info "正在安装文件..."
|
|
||||||
|
|
||||||
xattr -cr ./macOSGod
|
|
||||||
xattr -cr $qiuchenly
|
|
||||||
codesign -fs - --all-architectures --deep $qiuchenly
|
|
||||||
|
|
||||||
# 检查目录是否存在
|
|
||||||
if [ ! -d "/usr/local/bin" ]; then
|
|
||||||
mkdir -p /usr/local/bin
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -d "/usr/local/lib" ]; then
|
|
||||||
mkdir -p /usr/local/lib
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 复制可执行文件
|
|
||||||
cp ./macOSGod /usr/local/bin/
|
|
||||||
cp $qiuchenly /usr/local/lib/
|
|
||||||
chmod +x /usr/local/bin/macOSGod
|
|
||||||
|
|
||||||
# 复制LaunchDaemon配置
|
|
||||||
cp com.qiuchenly.macos.god.plist /Library/LaunchDaemons/
|
|
||||||
chmod 644 /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
|
|
||||||
# 创建日志文件
|
|
||||||
touch /var/log/macos_god.log
|
|
||||||
touch /var/log/macos_god_error.log
|
|
||||||
chmod 644 /var/log/macos_god.log
|
|
||||||
chmod 644 /var/log/macos_god_error.log
|
|
||||||
|
|
||||||
log_success "文件安装成功"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 启动服务
|
|
||||||
start_service() {
|
|
||||||
log_info "正在启动服务..."
|
|
||||||
|
|
||||||
# 加载LaunchDaemon
|
|
||||||
launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
|
|
||||||
# 启动服务
|
|
||||||
launchctl start com.qiuchenly.macos.god
|
|
||||||
|
|
||||||
log_success "服务启动成功"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示状态
|
|
||||||
show_status() {
|
|
||||||
log_info "服务状态:"
|
|
||||||
|
|
||||||
if launchctl list | grep -q com.qiuchenly.macos.god; then
|
|
||||||
log_success "服务正在运行"
|
|
||||||
else
|
|
||||||
log_warning "服务未运行"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "查看日志:"
|
|
||||||
echo " tail -f /var/log/macos_god*.log"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "停止服务:"
|
|
||||||
echo " sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "重启服务:"
|
|
||||||
echo " sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist"
|
|
||||||
echo " sudo launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 主函数
|
|
||||||
main() {
|
|
||||||
log_info "正在安装上帝之眼..."
|
|
||||||
|
|
||||||
check_root
|
|
||||||
install_files
|
|
||||||
start_service
|
|
||||||
show_status
|
|
||||||
|
|
||||||
log_success "安装上帝之眼完成!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 运行主函数
|
|
||||||
main "$@"
|
|
||||||
BIN
上帝之眼/macOSGod
258
上帝之眼/readme.md
@@ -1,258 +0,0 @@
|
|||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
# 上帝之眼 (God's Eye)
|
|
||||||
|
|
||||||
> **一个强大的macOS系统级监控与注入工具**
|
|
||||||
> 提供深度进程监控、动态库注入和应用程序劫持等功能
|
|
||||||
|
|
||||||
[](https://www.apple.com/macos/)
|
|
||||||
[](https://developer.apple.com/silicon/)
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
|
||||||
|
|
||||||
**作者**: [QiuChenly](https://github.com/qiuchenly)
|
|
||||||
**版本**: v1.0.0
|
|
||||||
**更新日期**: 2025年8月
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Core-FF6B6B?style=flat&logo=eye"> 核心功能
|
|
||||||
|
|
||||||
上帝之眼能够在系统级别实现应用程序的无感知劫持和激活。通过关闭SIP(系统完整性保护),实现对应用程序内存的深度访问和修改,让您无需手动修改应用程序文件即可获得完整的使用体验。
|
|
||||||
|
|
||||||
### 典型应用场景
|
|
||||||
|
|
||||||
- **Surge 6.x 自动激活**: 安装官方版本后,服务自动劫持并激活,重启后依然有效
|
|
||||||
|
|
||||||
### <img src="https://img.shields.io/badge/-Apps-4ECDC4?style=flat&logo=app-store"> 支持的应用程序
|
|
||||||
|
|
||||||
| 应用程序 | 版本 | 状态 | 功能描述 | 测试状态 |
|
|
||||||
|---------|------|------|----------|----------|
|
|
||||||
| **Surge** | 6.x | <img src="https://img.shields.io/badge/-Supported-00D4AA?style=flat"> | 网络代理工具自动激活 | 已适配 |
|
|
||||||
| **App Cleaner & Uninstaller** | 8.6.x | <img src="https://img.shields.io/badge/-Supported-00D4AA?style=flat"> | App卸载清理工具 | 已适配 |
|
|
||||||
|
|
||||||
**状态说明**:
|
|
||||||
- <img src="https://img.shields.io/badge/-Supported-00D4AA?style=flat"> **已支持**: 功能完整,可正常使用
|
|
||||||
- <img src="https://img.shields.io/badge/-Developing-FFA500?style=flat"> **开发中**: 正在适配,即将支持
|
|
||||||
- <img src="https://img.shields.io/badge/-Planned-9B59B6?style=flat"> **计划中**: 已列入开发计划
|
|
||||||
- <img src="https://img.shields.io/badge/-Not_Supported-E74C3C?style=flat"> **不支持**: 暂不支持或无法支持
|
|
||||||
|
|
||||||
本项目将持续扩展以下功能:
|
|
||||||
- 增强的安全监控能力
|
|
||||||
- 更精细的进程控制
|
|
||||||
- 自定义劫持规则配置
|
|
||||||
- 图形化配置界面
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Features-3498DB?style=flat&logo=star"> 特性
|
|
||||||
|
|
||||||
- **系统级监控**: 以root权限运行,提供深度系统监控能力
|
|
||||||
- **动态库注入**: 支持CoreInject.dylib动态库注入
|
|
||||||
- **后台服务**: 作为LaunchDaemon后台服务运行,开机自启动
|
|
||||||
- **日志记录**: 完整的日志记录系统,便于调试和监控
|
|
||||||
- **多架构支持**: 支持Intel (x86_64) 和 Apple Silicon (arm64) 架构
|
|
||||||
- **自动化部署**: 提供一键安装和卸载脚本
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-System-E67E22?style=flat&logo=macos"> 系统要求
|
|
||||||
|
|
||||||
- **操作系统**: macOS 10.15 (Catalina) 或更高版本
|
|
||||||
- **处理器**: 支持 Intel (x86_64) 和 Apple Silicon (arm64) 架构
|
|
||||||
- **权限要求**: Root 权限(用于安装和运行)
|
|
||||||
- **SIP状态**: 系统完整性保护必须关闭
|
|
||||||
- **特殊要求**: 黑苹果用户需要安装amfi相关kext
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Setup-2ECC71?style=flat&logo=terminal"> 安装说明
|
|
||||||
|
|
||||||
### 方法一:使用安装脚本(推荐)
|
|
||||||
|
|
||||||
1. **下载项目文件**
|
|
||||||
```bash
|
|
||||||
# 确保所有文件在同一目录下
|
|
||||||
ls -la
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **运行安装脚本**
|
|
||||||
```bash
|
|
||||||
sudo ./install_service.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **验证安装**
|
|
||||||
```bash
|
|
||||||
# 检查服务状态(需要sudo权限)
|
|
||||||
sudo launchctl list | grep com.qiuchenly.macos.god
|
|
||||||
|
|
||||||
# 查看日志
|
|
||||||
tail -f /var/log/macos_god.log
|
|
||||||
```
|
|
||||||
|
|
||||||
### 方法二:手动安装
|
|
||||||
|
|
||||||
1. **复制文件到系统目录**
|
|
||||||
```bash
|
|
||||||
sudo cp ./macOSGod /usr/local/bin/
|
|
||||||
sudo cp ../tool/CoreInject.dylib /usr/local/lib/
|
|
||||||
sudo chmod +x /usr/local/bin/macOSGod
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **安装LaunchDaemon配置**
|
|
||||||
```bash
|
|
||||||
sudo cp com.qiuchenly.macos.god.plist /Library/LaunchDaemons/
|
|
||||||
sudo chmod 644 /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **启动服务**
|
|
||||||
```bash
|
|
||||||
sudo launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
sudo launchctl start com.qiuchenly.macos.god
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Files-9B59B6?style=flat&logo=file-code"> 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
上帝之眼/
|
|
||||||
├── macOSGod # 主程序(支持x86_64/arm64)
|
|
||||||
├── com.qiuchenly.macos.god.plist # LaunchDaemon配置文件
|
|
||||||
├── install_service.sh # 安装脚本
|
|
||||||
├── uninstall_service.sh # 卸载脚本
|
|
||||||
└── readme.md # 项目说明文档
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Service-34495E?style=flat&logo=server"> 服务管理
|
|
||||||
|
|
||||||
### 查看服务状态
|
|
||||||
```bash
|
|
||||||
# 使用sudo权限查看系统级服务
|
|
||||||
sudo launchctl list | grep com.qiuchenly.macos.god
|
|
||||||
|
|
||||||
# 或者查看所有系统服务
|
|
||||||
sudo launchctl list | grep qiuchenly
|
|
||||||
```
|
|
||||||
|
|
||||||
### 启动服务
|
|
||||||
```bash
|
|
||||||
sudo launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
sudo launchctl start com.qiuchenly.macos.god
|
|
||||||
```
|
|
||||||
|
|
||||||
### 停止服务
|
|
||||||
```bash
|
|
||||||
sudo launchctl stop com.qiuchenly.macos.god
|
|
||||||
sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
### 重启服务
|
|
||||||
```bash
|
|
||||||
sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
sudo launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Logs-1ABC9C?style=flat&logo=file-text"> 日志监控
|
|
||||||
|
|
||||||
### 查看运行日志
|
|
||||||
```bash
|
|
||||||
tail -f /var/log/macos_god*.log
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Remove-E74C3C?style=flat&logo=trash-2"> 卸载说明
|
|
||||||
|
|
||||||
### 使用卸载脚本(推荐)
|
|
||||||
```bash
|
|
||||||
sudo ./uninstall_service.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### 手动卸载
|
|
||||||
```bash
|
|
||||||
# 停止服务
|
|
||||||
sudo launchctl stop com.qiuchenly.macos.god
|
|
||||||
sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
|
|
||||||
# 删除文件
|
|
||||||
sudo rm -f /usr/local/bin/macOSGod
|
|
||||||
sudo rm -f /usr/local/lib/CoreInject.dylib
|
|
||||||
sudo rm -f /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
sudo rm -f /var/log/macos_god*.log
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Important-F39C12?style=flat&logo=alert-triangle"> 重要注意事项
|
|
||||||
|
|
||||||
### 系统要求
|
|
||||||
1. **权限要求**: 安装和运行需要root权限
|
|
||||||
2. **系统兼容性**: 支持macOS 10.15及以上版本
|
|
||||||
3. **架构支持**: 同时支持Intel和Apple Silicon处理器
|
|
||||||
|
|
||||||
### SIP设置要求
|
|
||||||
4. **关闭SIP**: 必须关闭系统完整性保护才能正常工作
|
|
||||||
```bash
|
|
||||||
# 检查SIP状态
|
|
||||||
csrutil status
|
|
||||||
# 应该显示: System Integrity Protection status: disabled.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 黑苹果用户特殊要求
|
|
||||||
5. **OpenCore用户**: 如果使用OpenCore Legacy Patcher修改系统,需要:
|
|
||||||
- 安装amfi相关kext到OpenCore中(如amfigetoutofmyway或amfibypass)
|
|
||||||
- 确保SIP状态为disabled
|
|
||||||
- 否则程序将无法正常工作
|
|
||||||
|
|
||||||
### 安全提醒
|
|
||||||
6. **使用风险**: 本工具涉及系统级操作,请确保从可信来源获取
|
|
||||||
7. **备份重要**: 使用前建议备份重要数据
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Help-95A5A6?style=flat&logo=help-circle"> 故障排除
|
|
||||||
|
|
||||||
### 服务无法启动
|
|
||||||
1. 检查文件权限
|
|
||||||
```bash
|
|
||||||
ls -la /usr/local/bin/macOSGod
|
|
||||||
ls -la /usr/local/lib/CoreInject.dylib
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 检查LaunchDaemon配置
|
|
||||||
```bash
|
|
||||||
cat /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 查看错误日志
|
|
||||||
```bash
|
|
||||||
tail -20 /var/log/macos_god_error.log
|
|
||||||
```
|
|
||||||
|
|
||||||
4. 检查服务状态(需要sudo权限)
|
|
||||||
```bash
|
|
||||||
sudo launchctl list | grep com.qiuchenly.macos.god
|
|
||||||
```
|
|
||||||
|
|
||||||
5. 如果服务加载失败,尝试重新加载
|
|
||||||
```bash
|
|
||||||
sudo launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
sudo launchctl load /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
### 权限问题
|
|
||||||
```bash
|
|
||||||
# 重置文件权限
|
|
||||||
sudo chmod +x /usr/local/bin/macOSGod
|
|
||||||
sudo chmod 644 /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
### 代码签名问题
|
|
||||||
```bash
|
|
||||||
# 移除代码签名限制
|
|
||||||
sudo xattr -cr /usr/local/bin/macOSGod
|
|
||||||
sudo xattr -cr /usr/local/lib/CoreInject.dylib
|
|
||||||
```
|
|
||||||
|
|
||||||
## <img src="https://img.shields.io/badge/-Legal-7F8C8D?style=flat&logo=shield"> 许可证与声明
|
|
||||||
|
|
||||||
本项目仅供学习和研究使用,请遵守相关法律法规。使用者需自行承担使用风险。
|
|
||||||
|
|
||||||
### 免责声明
|
|
||||||
|
|
||||||
- 本工具仅用于合法的学习和研究目的
|
|
||||||
- 使用者应确保在合法环境下使用
|
|
||||||
- 开发者不承担因使用本工具而产生的任何责任
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
小知识: 秋城落叶是一个重生之人,大脑意外觉醒绑定了全球最强程序员系统,所以破解App不在话下,因为都是系统做的。 然后在梦中被慈溪托遗,让我夺回八国联军抢走本属于大清的一切,洗刷历史耻辱,所以破的大多都是外国软件,目前居住在华盛顿州 户籍是香港华裔。
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# 颜色定义
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# 日志函数
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[*] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[+] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[!] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo -e "${RED}[×] $1${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查是否以root权限运行
|
|
||||||
check_root() {
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
log_error "必须以root权限运行"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 停止服务
|
|
||||||
stop_service() {
|
|
||||||
log_info "正在停止服务..."
|
|
||||||
|
|
||||||
# 停止并卸载LaunchDaemon
|
|
||||||
if launchctl list | grep -q com.qiuchenly.macos.god; then
|
|
||||||
launchctl stop com.qiuchenly.macos.god
|
|
||||||
launchctl unload /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
log_success "服务已停止"
|
|
||||||
else
|
|
||||||
log_warning "服务未运行"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 删除文件
|
|
||||||
remove_files() {
|
|
||||||
log_info "正在删除文件..."
|
|
||||||
|
|
||||||
# 删除可执行文件
|
|
||||||
if [[ -f /usr/local/bin/macOSGod ]]; then
|
|
||||||
rm -f /usr/local/bin/macOSGod
|
|
||||||
log_success "已删除 /usr/local/bin/macOSGod"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f /usr/local/lib/CoreInject.dylib ]]; then
|
|
||||||
rm -f /usr/local/lib/CoreInject.dylib
|
|
||||||
log_success "已删除 /usr/local/lib/CoreInject.dylib"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 删除LaunchDaemon配置
|
|
||||||
if [[ -f /Library/LaunchDaemons/com.qiuchenly.macos.god.plist ]]; then
|
|
||||||
rm -f /Library/LaunchDaemons/com.qiuchenly.macos.god.plist
|
|
||||||
log_success "已删除 /Library/LaunchDaemons/com.qiuchenly.macos.god.plist"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 删除日志文件
|
|
||||||
if [[ -f /var/log/macos_god.log ]]; then
|
|
||||||
rm -f /var/log/macos_god.log
|
|
||||||
log_success "已删除 /var/log/macos_god.log"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f /var/log/macos_god_error.log ]]; then
|
|
||||||
rm -f /var/log/macos_god_error.log
|
|
||||||
log_success "已删除 /var/log/macos_god_error.log"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 主函数
|
|
||||||
main() {
|
|
||||||
log_info "正在卸载上帝之眼..."
|
|
||||||
|
|
||||||
check_root
|
|
||||||
stop_service
|
|
||||||
remove_files
|
|
||||||
|
|
||||||
log_success "卸载上帝之眼完成!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 运行主函数
|
|
||||||
main "$@"
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
set -euo pipefail
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
chmod +x ./InjectLib
|
|
||||||
xattr -cr ./InjectLib
|
|
||||||
codesign -fs - ./InjectLib
|
|
||||||
sudo ./InjectLib $(pwd)
|
|
||||||