返回信息流哎,还是我那悲剧的酷派手机的破事,不过这次不是玩平衡球游戏心得了,而是关于密码锁的故事。我相信大家对于手机密码锁肯定不陌生吧,但是如果有一天密码忘记了怎么办呢?有的手机丫的刷机都不会忘记原先设的密码,酷派就是其中之一,也不知道这是好还是不好。
酷派N900S和N920系列都是基于WinCE6的版本,它们的密码锁一般是默认启用于备份功能(只要你以前设置过密码)。如果有人要访问备份项,对不起,就必须输入以前设的密码。
所幸地是,酷派的Windows系列手机都可以自动刷机,如果机器启动不了的话,它可以监控情况适时自己刷机,方便你乱整之后的麻烦。但是这不代表备份功能的密码就解除了,而且你要改的话也是要输入原始密码呢,但是悲剧是如果有一天你真的忘了密码怎么办?以下就是我忘了密码过后的处理心得。
经过自动刷机后,机器大部分功能还原了,但是备份那个要密码登录的功能没有,以前的短信数据都存里面的呢,偏偏密码那个啥...⊙﹏⊙b汗
不过酷派毕竟是WinCE手机,那就是说是Windows系列的嘛,或许这就是唯一的办法了。。。
我估计吧,如果是密码,肯定有什么判断一类的语句,如果换你自己去编程,无非就是strcmp,memcmp之类的,而密码这些数据呢,很可能原始就是存在系统目录下你不知道得地方,由那个备份的执行程序去访问。至于判断呢,我一开始猜测可能是在执行程序(App_Sync728.exe)中判断的,后来我利用OsinterfaceDll的函数SetAccessProperty设置权限(这是在一个补丁里面逆的),将App_Sync728.exe放到IDA里面一看,不由大跌眼镜——没有相关的字符串。就是说,什么“密码错误 ,请重试”啊,“你输入的密码还有3次机会”一类的话没有,这个,怎么回事呢?...
不过后来我突然想到,以前记得密码的时候,貌似可以对某些应用添加密码功能,如短信可以添加为输入密码查看,包括玩游戏甚至聊QQ等,那么如果一个密码登陆程序可以有如此众多的利用,那就说明那很可能不是一个EXE,而是一个DLL,以系统控制注入的方式,来控制程序登陆密码过关的说法。
以这个思路,我用任务管理器查了查App_Sync728.exe,排除声音啊,读数据库的DLL(查名字猜的),我最后把目标锁定到了一个叫verify.dll上,听名字也像嘛。。。
于是我编程将verify.dll从系统目录中拷贝出来,然后放到IDA中,还是在Strings中没有看到和密码有关的说法,不由有点灰心。不过可能是运气好吧,我偶然发现verify.dll在导入表(IAT)中居然有LoadStringW这个函数。定义如下:
int LoadString(
HINSTANCE hInstance, // handle to module containing string resource
UINT uID, // resource identifier
LPTSTR lpBuffer, // pointer to buffer for resource
int nBufferMax // size of buffer
);
如果是这个函数,那就说明我的思路是错的,应该从文件的资源段查找,于是果断打开EXESCOPE,终于出现了第一个很重要的线索:
那这么一想,可以确定两点了:第一,肯定是verify.dll干的;第二,它调用了LoadStringW且第二个参数为196(=0xC4)
再同时考虑到,当你输入错误密码弹出的那个框,其实不是MessageBox,而是宇龙酷派的一个自我封装的函数,叫YLMsgBoxExTrans,而且IDA中也证实了,仅此而言:
那么这么说,如果利用IDA从导入表入手,针对LoadStringW和YLMsgBoxExTrans函数,用交差参考图表的方式逆推,就能够找到线索。虽然数据庞大,不过我翻了大概2小时吧,终于找到了一个函数,后来发现它具有重大嫌疑,于是我将其命名为Sepcial1_MsgBox,代码如下:
.text:10012D78 Sepcial1_MsgBox
.text:10012D78
.text:10012D78
.text:10012D78
.text:10012D78 Buffer = -0x424
.text:10012D78 var_21C = -0x21C
.text:10012D78 var_14 = -0x14
.text:10012D78
.text:10012D78 STMFD SP!, {R4-R6,LR}
.text:10012D7C LDR R12, =0xFFFFFBEC
.text:10012D80 ADD SP, SP, R12
.text:10012D84 MOV R6, R2
.text:10012D88 MOV R4, R1 /*** R4来自传入的第二个参数 ***/
.text:10012D8C MOV R5, R0
.text:10012D90 LDR R3, =unk_10019310
.text:10012D94 LDR R3, [R3]
.text:10012D98 STR R3, [SP,#0x424+var_14]
.text:10012D9C MOV R2, #0x208 ; size_t
.text:10012DA0 MOV R1, #0 ; int
.text:10012DA4 ADD R0, SP, #0x424+Buffer ; void *
.text:10012DA8 BL memset
.text:10012DAC MOV R3, #0x104 ; nBufferMax
.text:10012DB0 ADD R2, SP, #0x424+Buffer ; lpBuffer
.text:10012DB4 MOV R1, #0xA7 ; uID
.text:10012DB8 MOV R0, R5 ; hInstance
.text:10012DBC BL LoadStringW
.text:10012DC0 MOV R2, #0x208 ; size_t
.text:10012DC4 MOV R1, #0 ; int
.text:10012DC8 ADD R0, SP, #0x424+var_21C ; void *
.text:10012DCC BL memset
.text:10012DD0 MOV R3, #0x104 ; nBufferMax
.text:10012DD4 ADD R2, SP, #0x424+var_21C ; lpBuffer
.text:10012DD8 MOV R1, R4 ; uID /*** R4是uID ***/
.text:10012DDC MOV R0, R5 ; hInstance
.text:10012DE0 BL LoadStringW
.text:10012DE4 MOV R3, #1
.text:10012DE8 ADD R2, SP, #0x424+Buffer
.text:10012DEC ADD R1, SP, #0x424+var_21C
.text:10012DF0 MOV R0, R6
.text:10012DF4 BL YLMsgBoxExTrans
.text:10012DF8 LDR R0, [SP,#0x424+var_14]
.text:10012DFC BL sub_1001438C
.text:10012E00 MOV R0, #0
.text:10012E04 MOV R12, 0x414
.text:10012E0C ADD SP, SP, R12
.text:10012E10 LDMFD SP!, {R4-R6,PC}
在这个函数中,有LoadString和YLMsgBoxExTrans都出现,而且,LoadStringW的第二个参数是uID嘛,它是来着这个Sepcial1_MsgBox函数的第二个参数(ARM汇编我也不懂,就知道这点点),然而这个Sepcial1_MsgBox函数的交插表中,就看到了灰常重要的东西了:
.text:10011734 ; int __cdecl sub_10011734(LPARAM lParam)
......
.text:10011D68 loc_10011D68
.text:10011D68 LDR R0, [R3,#0xA60]
.text:10011D6C MOV R2, R9
.text:10011D70 MOV R1, #0xC4
.text:10011D74 BL Sepcial1_MsgBox
.text:10011D78 LDR R2, =_SetWndText_CNoWSDKEdit__QAAHPBGHH_Z ; CNoWSDKEdit::SetWndText(ushort const *,int,int)
.text:10011D7C LDR R1, =unk_100167AC
.text:10011D80 MOV R3, #0
.text:10011D84 LDR R4, [R2]
.text:10011D88 MOV R2, #0
.text:10011D8C ADD R0, R8, #0xFC0
.text:10011D90 MOV LR, PC
.text:10011D94 MOV PC, R4
.text:10011D98 B loc_10011DEC
......
这个0xC4传入的R1,也就是Sepcial1_MsgBox的第二个参数,那就是说,程序运行到这里开始输入你错了一类的说法了。这个时候我们正确的做法就应该在靠上一些的位置改,由图所示:
于是我在往上处找到一个函数调用(ARM的BL相当于X86的CALL),于是进去一看,我去:
有strcmp,有ReadFile,还有Decode函数,那还有什么好说的呢。。。这肯定就是解码然后比较嘛!
好吧,知道了这些以后,最后就是怎么办的问题了,这个函数判断密码是不是相等,如果相等函数最后就返回为1,我没有控制它绝对返回为1,而是将“BNE loc_100119DC”条件跳转进行修改,将其改为绝对跳转,即“B loc_100119DC”。这样即使是输入错误的密码,也可以成功登入了。而且我没有改文件,而是内存补丁的方式,文件是改不了的,貌似权限不够。
最后效果如下图所示:
这样,即使是密码忘了,还是有办法可以进去了。我重新设了个新密码,虽然最后我都不知道老密码是多少,不过或许DeCode函数逆向一下可以知道,但是没有功夫了,就这样了吧。
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #4089同步于 2011/7/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
记录那忘记手机密码之后的故事
ColdZenLeft
2011/7/25镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
唉.可以淘宝买一个
【 在 ColdZenLeft 的大作中提到: 】
: : 果然看标题就猜到是你发的....
: : --
: 作为一个没有证的码农表示鸭梨很大啊...哎
: ...................
【 在 handspeaker 的大作中提到: 】
: 牛逼啊,最近在终端版很活跃嘛
: --
额。。。你这么一说我就回去继续信安版得了,呵呵。。。
对了,佣兵合约解除了。。。目前暂时没有什么事,这不还在复习C语言嘛,表示对笔试很有压力啊,尽是各种JAVA,DB2的