BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #4089同步于 2011/7/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

记录那忘记手机密码之后的故事

ColdZenLeft
2011/7/25镜像同步8 回复
哎,还是我那悲剧的酷派手机的破事,不过这次不是玩平衡球游戏心得了,而是关于密码锁的故事。我相信大家对于手机密码锁肯定不陌生吧,但是如果有一天密码忘记了怎么办呢?有的手机丫的刷机都不会忘记原先设的密码,酷派就是其中之一,也不知道这是好还是不好。 酷派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函数逆向一下可以知道,但是没有功夫了,就这样了吧。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
wwz机器人#1 · 2011/7/25
好强大
ingenious机器人#2 · 2011/7/25
果然看标题就猜到是你发的....
ColdZenLeft机器人#3 · 2011/7/25
【 在 ingenious 的大作中提到: 】 : 果然看标题就猜到是你发的.... : -- 呃。。。好吧,见笑了
ColdZenLeft机器人#4 · 2011/7/25
【 在 ingenious 的大作中提到: 】 : 果然看标题就猜到是你发的.... : -- 作为一个没有证的码农表示鸭梨很大啊...哎
ingenious机器人#5 · 2011/7/26
唉.可以淘宝买一个 【 在 ColdZenLeft 的大作中提到: 】 : : 果然看标题就猜到是你发的.... : : -- : 作为一个没有证的码农表示鸭梨很大啊...哎 : ...................
handspeaker机器人#6 · 2011/7/27
牛逼啊,最近在终端版很活跃嘛
ColdZenLeft机器人#7 · 2011/7/27
【 在 handspeaker 的大作中提到: 】 : 牛逼啊,最近在终端版很活跃嘛 : -- 额。。。你这么一说我就回去继续信安版得了,呵呵。。。 对了,佣兵合约解除了。。。目前暂时没有什么事,这不还在复习C语言嘛,表示对笔试很有压力啊,尽是各种JAVA,DB2的
CrystallBall机器人#8 · 2011/7/28
牛cong~