我的HTC凯撒买了将近3个月了,一直没怎么写过程序在手机上跑
最近有了个需求,就是想写个控制屏幕亮度的东东
然后通过“无限今日”调用来改变亮度值
网上也找到了三种方法
一种是调用系统API“SetPowerRequirement”,
一种是调用比较底层的接口“DeviceIoControl”,
另一种是修改注册表,然后向系统发送EVENT
然而最郁闷的是这三种方法对于我的手机都无效!
估计是系统底层对这些方法都屏蔽了
即将绝望的时候突然想到了反汇编
系统设置亮度的程序是Backlight.exe,可以反汇编这个程序来得知如何设置亮度
可是手机是ARM平台,Ollydbg显然反汇编不了
目标转向强大的IDA工具
这个工具之前听说过,但没用过
只好现学现卖~~
面对Backlight.exe的一大堆汇编代码,貌似没找到我需要的敏感接口
而是发现一句.text:00011074 BL LoadLibraryW
果然,这个是调用HTC的一个DLL
立马将手机里的这个DLL传到PC上
Dump一口,乖乖,那么多接口中终于有我想要的“HTCUtilSetOnBatteryBrightnessLevel”
可惜只有函数名,参数又是怎么样的?
猜!!!
理论上至少要传进去一个亮度值,假设类型为DWORD
返回值一般是HRESULT,
OK,在我的程序中动态载入这个DLL,测试
函数Load成功,但是在执行时卡住了……
看来猜是解决不了问题的。
还好IDA支持反汇编DLL,继续反汇编之~~
里面终于找到我敏感的API字眼
但是按照那个代码看也是使用上面提到的“DeviceIoControl”方法
为什么我调用确不成功呢?会不会是HTC修改了底层驱动参数?
再仔细分析寄存器的赋值,发现了一些蹊跷,汇编代码如下:
.text:10003A98 LDR R0, =aBkl1
.text:10003A9C MOV LR, #0x80
.text:10003AA0 MOV R4, #3
.text:10003AA4 MOV R6, #0
.text:10003AA8 MOV R3, #0
.text:10003AAC MOV R2, #3
.text:10003AB0 MOV R1, #0xC0000000
.text:10003AB4 STR R6, [SP,#0x28+var_20]
.text:10003AB8 STR LR, [SP,#0x28+var_24]
.text:10003ABC STR R4, [SP,#0x28+var_28]
.text:10003AC0 BL CreateFileW
.text:10003AC4 MOV R5, R0
.text:10003AC8 CMN R5, #1
.text:10003ACC BEQ loc_10003B18
.text:10003AD0 ADD R3, SP, #0x28+var_18
.text:10003AD4 STR R3, [SP,#0x28+var_20]
.text:10003AD8 MOV R3, #4
.text:10003ADC ADD R2, SP, #0x28+arg_0
.text:10003AE0 MOV R1, #7
.text:10003AE4 STR R6, [SP,#0x28+var_1C]
.text:10003AE8 STR R6, [SP,#0x28+var_24]
.text:10003AEC STR R6, [SP,#0x28+var_28]
.text:10003AF0 BL DeviceIoControl
=============================================
CreateFileW的第二个参数为什么传进去的是3?
网上的方法传进去的是2,并且MSDN对该参数的取值也是1~2
DeviceIoControl的第二个参数在这个DLL中是7,而MSDN对该参数的取值设定为0~2
看来之前的猜测是对的,HTC修改了底层驱动接口参数的取值
难怪我按照标准方法总不成功
根据这些汇编代码修改我的程序,运行
泪流满面,终于能改变亮度了……
小结:
Windows Mobile手机系统一样,但是却有很多不同的厂家
每个厂家针对不同硬件来修改底层驱动
导致微软提供的标准编程方法很多不奏效
这确实是个问题
欣慰的是我也从中学到逆向分析问题的方法
反工程其实也是一门艺术~~