吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6594|回复: 109
收起左侧

[原创] 华硕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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
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] 纯文本查看 复制代码
1
2
3
4
5
6
7
struct BatteryIOCtlInfo
{
        DWORD head; // 头部
        DWORD nextSize; // 后续结构体成员大小
        DWORD num2; // 未知四字节数,固定为0x120057
        DWORD perecent; // 充电百分比,0x50为80%,0x3C为60,0x64为100%
};


结构体各成员值填写为:
[C] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
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] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
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++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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, 2025-4-1 09:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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