吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6152|回复: 110
收起左侧

[原创] 华硕fx63vd7700充电保护程序“ASUS Battery Health Charging”逆向分析

  [复制链接]
SNSD99 发表于 2024-3-17 22:30
0.前言
最近好奇这个充电保护程序为什么可以控制最高充电百分比,所以我想分析一下。
该程序适用于华硕飞行堡垒fx63vd7700型号,如果适用华硕其它型号的可以试试看。
注意该充电保护程序不适用于其它品牌、或华硕其它型号的笔记本电脑。
这个软件的界面如下图所示。
模式有三种:完整充电模式、平衡保养模式、最佳保养模式。三种模式限制充电百分比分别为100%,80%、和60%。

软件主界面

软件主界面


目录如下:
2.png

1.x64dbg动态调试
双击BhcApp.exe,启动充电保护软件。x64dbg附加“BhcMgr.exe”。
DeviceIoControl处插入断点,这个函数用于和设备通信,随便选中一个模式然后点确定就会触发断点。
例如我选中的“平衡保养模式”。
调用堆栈如下图所示。
3.png

DeviceIoControl的参数如下:

[C] 纯文本查看 复制代码
BOOL DeviceIoControl(
  [in]                HANDLE       hDevice,
  [in]                DWORD        dwIoControlCode,
  [in, optional]      LPVOID       lpInBuffer,
  [in]                DWORD        nInBufferSize,
  [out, optional]     LPVOID       lpOutBuffer,
  [in]                DWORD        nOutBufferSize,
  [out, optional]     LPDWORD      lpBytesReturned,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);


回到DeviceIoControl上层函数“sub_321C90”。观察DeviceIoControl的入参:

4.png

HANDLE hDevice = 0x274
DWORD dwIoControlCode = 0x22240C
LPVOID lpInBuffer = 0xB7F010
DWORD nInBufferSize = 0x10
LPVOID lpOutBuffer = 0x93F238
DWORD nOutBufferSize = 0x400
LPDWORD lpBytesReturned = 0x93F234
LPOVERLAPPED lpOverlapped = 0

1.1 查看缓冲区lpInBuffer: 0xB7F010
如下图所示为缓冲区内容,大小0x10字节。
5.png

这个可以视为一个结构体。代码如下。
[C] 纯文本查看 复制代码
struct BatteryIOCtlInfo
{
        DWORD head; // 头部
        DWORD nextSize; // 后续结构体成员大小
        DWORD num2; // 未知四字节数,固定为0x120057
        DWORD perecent; // 充电百分比,0x50为80%,0x3C为60,0x64为100%
};


结构体各成员值填写为:
[C] 纯文本查看 复制代码
        BatteryIOCtlInfo btinfo;
        btinfo.head = 0x53564544;
        btinfo.nextSize=8;
        btinfo.num2 = 0x120057;
        // 0x3c 60%
        // 0x50 80%
        // 0x64 100%
        btinfo.perecent = 0x3c;  


1.2 输出缓冲区lpOutBuffer: 0x93F238
只有头四节被填充0x1,剩余的0x400 - 4个字节均为0.
6.png

输出缓冲区里的内容没有什么特别的,只需保证有输出缓冲区,以及该缓冲区有0x400字节大小即可。

2.IDA静态分析
以上分析了DeviceIoControl的入参,但是还不知道设备句柄是怎么获取的。
进入sub_321C90的代码段,在IDA为“sub_401C90”,00401D0C为调用DeviceIoControl的语句。
7.png

选中"hDevice",按下X键看看哪个语句写入了这个hDevice。如下图所示。(Type:r表示读取read,w表示写入write)
8.png

进入了函数sub_401D70。
9.png

原来是CreateFileW打开(电池)设备的句柄。

CreateFileW参数如下:
[C] 纯文本查看 复制代码
HANDLE CreateFileW(
  [in]           LPCWSTR               lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);


LPCWSTR lpFileName:"\\.\ATKACPI"
DWORD dwDesiredAccess: 0xC0000000 ( GENERIC_READ | GENERIC_WRITE == 0xC0000000 )
DWORD dwShareMode: 0x3 (FILE_SHARE_READ | FILE_SHARE_WRITE == 0x3)
LPSECURITY_ATTRIBUTES lpSecurityAttributes: NULL
DWORD dwCreationDisposition: 0x3 (OPEN_EXISTING == 3)
DWORD dwFlagsAndAttributes: NULL
HANDLE hTemplateFile: NULL

3. 代码复现
因此控制笔记本最高充电百分比的C++代码如下:

[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

struct BatteryIOCtlInfo
{
	DWORD head;
	DWORD nextSize;
	DWORD num2;
	DWORD perecent;
};

int main(int argc, char** argv, char** envp)
{
	// GENERIC_READ | GENERIC_WRITE == 0xC0000000
	// FILE_SHARE_READ | FILE_SHARE_WRITE == 0x3
	// OPEN_EXISTING == 3
	HANDLE hhh = CreateFileW
		(
			L"\\\\.\\ATKACPI", 
			GENERIC_READ | GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE, 
			NULL,
			OPEN_EXISTING,
			NULL,
			NULL
		);
	//
	BatteryIOCtlInfo btinfo;
	btinfo.head = 0x53564544;
	btinfo.nextSize=8;
	btinfo.num2 = 0x120057;
	// 0x3c 60%
	// 0x50 80%
	// 0x64 100%
	btinfo.perecent = 0x3c;  // 修改此处数值
	// out buffer
	void* out_buf = malloc(0x400);
	DWORD returnBytes = 0;
	//
	DeviceIoControl(
		hhh,
		0x22240C,
		&btinfo,
		sizeof(btinfo),
		out_buf,
		0x400,
		&returnBytes,
		NULL);
	CloseHandle(hhh);
	free(out_buf);
	return 0;
}


经测试可以修改最高充电百分比,但是只能有60%,80%和100%三种数值。如果修改为其它数值,则默认最高充电百分比为100%。




免费评分

参与人数 41威望 +2 吾爱币 +134 热心值 +37 收起 理由
luokaichuang + 1 https://github.com/zllovesuki/G14Manager/blob/main/system/atkacpi/wmi.
fcml45 + 1 + 1 我很赞同!
dyjpxc + 1 + 1 我很赞同!
梦?[SVIP + 1 用心讨论,共获提升!
Headhunterz + 1 热心回复!
iTMZhang + 1 + 1 用心讨论,共获提升!
hu1590 + 1 + 1 热心回复!
safeblood + 1 + 1 我很赞同!
yixi + 1 + 1 谢谢@Thanks!
liqishun + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
FengJonas + 1 + 1 热心回复!
Chenda1 + 1 + 1 我很赞同!
52pojieplayer + 1 + 1 谢谢@Thanks!
zxp666 + 1 + 1 谢谢@Thanks!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
wari01 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
David13738 + 1 + 1 热心回复!
wangyou188 + 1 我很赞同!
NotYoojun + 1 我很赞同!
duhaofei + 1 用心讨论,共获提升!
fast001 + 1 + 1 我很赞同!
skiss + 1 + 1 谢谢@Thanks!
kdrew + 1 + 1 热心回复!
gym66777 + 1 + 1 谢谢@Thanks!
sivion + 1 谢谢@Thanks!
helloworld0011 + 1 热心回复!
tuobo001 + 1 我很赞同
tom5718 + 1 用心讨论,共获提升!
xbr + 1 太强了
爱飞的猫 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
杨辣子 + 1 + 1 用心讨论,共获提升!
唐小样儿 + 1 + 1 我很赞同!
Lael2032 + 1 赞!
hudaoyuan163 + 1 + 1 我很赞同!
ll090822 + 1 + 1 热心回复!
zhongsir + 1 + 1 我很赞同!
jy138290 + 1 + 1 我很赞同!
开心熊猫741 + 1 + 1 热心回复!
Conselor + 1 + 1 用心讨论,共获提升!
moriv4 + 1 + 1 我很赞同!
ciker_li + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| SNSD99 发表于 2024-3-18 09:42
Wobuaishangban 发表于 2024-3-18 08:49
技术很niubi,但问个小白问题:改这个的目的是什么?

我想分析一下这个华硕的充电保护程序是怎么控制最高充电电量的,然后用c++代码复现出来。这个工具感觉不太好找,所以试着分析一下它的原理
Chenda1 发表于 2024-3-20 08:56
本帖最后由 Chenda1 于 2024-3-20 09:15 编辑

大佬我是华硕天选  看了您的文章只知道用这个代码在可支持机型可以  使用代码调整。不过我看不懂
我有一个问题: 这个电池控制是比如控制到80就  涓流充电 (很慢的速度 让他与80%消耗的成互补关系)还是它冲到80%后就将电引到电脑主板而开机的耗电不再消耗电池  ,电池只是在慢慢的维持80%,因为我长时间插着他会从80%慢慢到达82%当然过程可能是一个月,     我总结一下  1.是否高功率充电入电池然后 电脑消耗电池的电量  2.到达80%后涓流充电池,电脑直接从充电器取电。
willgoon 发表于 2024-3-17 23:20
kapibl 发表于 2024-3-17 23:36
原创必顶一个
moriv4 发表于 2024-3-17 23:48

感谢分享原创作品!
Conselor 发表于 2024-3-17 23:54
感谢,学到了
SRT 发表于 2024-3-18 00:03
来试试看
wcabc 发表于 2024-3-18 00:19
我的笔记本正好也是华硕的飞行堡垒系列,但型号不一样。不知道能不能适用
zxb1997 发表于 2024-3-18 00:25
感谢分享,很有用
头像被屏蔽
Hdry 发表于 2024-3-18 07:11
提示: 作者被禁止或删除 内容自动屏蔽
52shijie 发表于 2024-3-18 07:37
支持一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 04:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表