逆向思维

我的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手机系统一样,但是却有很多不同的厂家

每个厂家针对不同硬件来修改底层驱动

导致微软提供的标准编程方法很多不奏效

这确实是个问题

欣慰的是我也从中学到逆向分析问题的方法

反工程其实也是一门艺术~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值