skirky的博客

skirky

———— just a coder ————

一个不愿意妥协,一事无成的程序员

看过很多人的电脑桌面后,深感反胃的我顺手写下了这个"DesktopOrganizer"程序,程序本身不算大,但是功能还是可以的,因为是顺手写的,UI也没有美化,就是WPF默认,凑合看吧。

使用方法:

1.首先你要有一个兼容OpenAI接口的某个大模型(国内推荐使用DeepSeek,真的便宜)的API Key,这里我以DeepSeek为例,首先进入DeepSeek开放平台,注册或者登录账号,在左侧导航栏找到充值,充点钱(对于桌面整理来说,充1块钱基本就能用很久了),然后再来到API Keys,创建一个API Key,名字随便起,然后将创建的API Key复制备用

2.从这里下载DesktopOrganizer,双击运行,将刚才得到的API Key输入

3.点击开始监听,软件就会将放到桌面上的文件自动归入桌面现有的某个文件夹,如果现有的文件夹都不适合,AI就会自动创建新的文件夹来存放这个文件

4.打开自启动,如果你想的话

5.点击关闭,软件会最小化到任务栏托盘

众所周知啊,摩托罗拉软件更新会检测系统环境是否正常,异常就会拒绝更新,从网上找到的方法说把boot还原到原厂就可以正常更新,奈何本人不知什么原因,依然显示"正在下载的更新包与设备上的当前软件版本不兼容。" (本人设备为Moto X30 Pro)

被这个问题困扰了一段时间后,终于痛下决心,准备自己写一个Xposed模块劫持摩托罗拉软件更新,去除校验,过程出乎意料的顺利,只用了一下午就从0写了出来,代码也只是寥寥几十行,反编译apk得到的关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void verifyPayloadMetadata(final String str, final boolean z) {
new Thread(new Runnable() { // from class: com.motorola.ccc.ota.installer.updaterEngine.common.UpdaterEngineHelper.1
@Override // java.lang.Runnable
public void run() {
Logger.debug("OtaApp", "UpdaterEngineHelper:verifyPayloadMetadata");
Context globalContext = OtaApplication.getGlobalContext();
boolean zBooleanValue = false;
try {
UpdaterEngineHelper.setUpdateEngineObject();
zBooleanValue = ((Boolean) UpdaterEngineHelper.updateEngine.getDeclaredMethod("verifyPayloadMetadata", String.class).invoke(UpdaterEngineHelper.mUpdateEngine, str)).booleanValue();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
Logger.error("OtaApp", "exception in UpdaterEngineHelper:verifyPayloadMetadata " + e);
}
Logger.debug("OtaApp", "UpdaterEngHelper:verifyPayloadMetadata:isVerifySuccessful=" + zBooleanValue);
if (z) {
UpgradeUtilMethods.sendActionVerifyPayloadStatus(globalContext, zBooleanValue);
} else if (zBooleanValue) {
UpgradeUtilMethods.sendActionVerifyPayloadStatus(globalContext, "success", UpgradeUtilConstants.DownloadStatus.STATUS_OK, null);
} else {
UpgradeUtilMethods.sendActionVerifyPayloadStatus(globalContext, "Payload metadata verification failed ", UpgradeUtilConstants.DownloadStatus.STATUS_FAIL_PAYLOAD_METADATA_VERIFY, ErrorCodeMapper.KEY_PAYLOAD_METADATA_VERIFICATION_FAILED);
}
}
}).start();
}

代码看起来很明确,开了一个新的线程,用一个反射方法执行检测,检测结束后发送一个广播进行下一步,那么我们的思路就是在校验方法被调用时劫持它,直接返回true,绕过检测

阅读全文

喜欢用合宙芯片的朋友对Luatools一定不陌生,烧录固件绕不开这个工具,但是我在入手合宙芯片后觉得这种烧录方式很麻烦,每次烧录都要在IDE和Luatools来回切换,于是就想通过逆向的手段看看能不能把Luatools的烧录集成到IDE中
按照逆向的流程,先丢进DIE看看

DIE扫描结果

阅读全文

今日闲来无事,偶然得知自己的笔记本支持Intel傲腾内存,欲打开之,不料Intel提出了条件

intel

回想起上次随意修改SATA模式导致蓝瓶钙,最终重装系统的惨痛经历,特意上网查询了一下,得知提前打开安全启动可无痛渡此劫,遂采取

msconfig

重启进BIOS,切换SATA模式,一气呵成,不料Windows在此留了一手

PIN不可用

阅读全文

想要判断一个正在运行的程序是否是UWP程序并不难。

UWP程序有一个最基本的特征,也是UWP程序与Win32程序底层上的差别,UWP程序的类名是"Windows.UI.Core.CoreWindow",而Win32程序就不一样了,千奇百怪,依靠这个特征,我们就可以辨别出一个程序是UWP还是Win32,Spy++(Visual Studio自带的工具)可以查看进程信息,可以用Spy++查看进程的类名判断这个程序是UWP还是Win32。

spyxx_img

但是Spy++工具并不是很好用,它的UI在现在看来有些落后了,而且当你想要判断一个程序是否是UWP程序,Spy++会列出所有进程,包括一些后台进程,所以我写了个WPF程序(在ChatGPT的帮助下,我承认它确实帮了我亿点点😂),这个程序以及源码我会在文章最后给出。

下面我来详细的讲讲这个程序的工作原理:

首先,需要获取全部活动程序的列表,我们需要检索所有的窗口,然后再判断窗口是否显示,只需要使用"user32.dll"中提供的"EnumWindows"和"IsWindowVisible"即可,具体的代码是:

1
2
3
4
5
6
7
private delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam);

[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

[DllImport("user32.dll")]
private static extern bool IsWindowVisible(IntPtr hwnd);

然后只需要调用即可

阅读全文