QQ帐号被盗 被换了手机号,qq更换密保手机号还是原来的qq更换密保手机号,为什么非让我用手机号改密码?腾讯能不能有点公平。

北京中西远大科技有限公司
【简单介绍】
氧分析仪 型号:STD8-GPR-1500库号:M311479
区域等级:Class 1,Division 1,Group B,C,D防爆区域报 警:2路继电器报警输出
【详细说明】
氧分析仪 型号:STD8-GPR-1500库号:M311479氧分析仪 型号:STD8-GPR-1500库号:M311479&&&认 证:CE,本质安全(申请中)区域等级:Class 1,Division 1,Group B,C,D防爆区域报 警:2路继电器报警输出氧分析仪 型号:STD8-GPR-1500库号:M311479&&&标 定:使用浓度大约为80%量程或更高的经过认证的标准气体补 偿:压力和温度接 口:1/4"接头控 制:量程选择开关,防水键,标定及系统功能显 示:2.75"&1.375";分辨率:0.01ppm;实时显示温度&氧分析仪 型号:STD8-GPR-1500库号:M311479&&&及压力外 观:NEMA 4X,21"&5"&7",15 lbs;带样气系统板21"&15"&8",25Ibs流量影响:0.25-2.5 L/M,推荐流量:1 L/M线 性:&.995超过所有量程压 力:进样5-30 psig;排空-大气压电 源:9-28VDC恢复时间:在空气中暴露60秒钟,用氮气恢复至10 ppm的时间为&1小时响应时间:90%满量程为15秒样气系统:无,如图可选H2S脱除系统灵 敏 度:&0.5%满量程传感器型号:XLT-12-333当CO2&0.5%时,免维护传感器寿命:24个月,25℃输 出:4-20mA温度范围:5-45℃﹝GPR传感器﹞;-20-45℃﹝XLT传感器﹞质 保 期:12个月,包括分析仪和传感器样气接触部分:不锈钢联系电话: 400-605-0014&&
感兴趣的产品:
您的姓名:
您的单位:
联系电话:
详细地址:
常用邮箱:
您的任何要求、意见或建议:
*&=&&&请输入计算结果(填写阿拉伯数字),如:三加四=7
请输入产品关键字:
{zt_Keyword}
北京中西远大科技有限公司
地址:北京市平谷区滨河工业区零号区22号317室
邮编:100085
联系人:张女士
电话:010-传真:010-手机:售后电话:/010-留言:个性化:
中国安防展览网 设计制作,未经允许翻录必究.Copyright(C)
, All rights reserved.
以上信息由企业自行提供,信息内容的真实性、准确性和合法性由相关企业负责,中国安防展览网对此不承担任何保证责任。
温馨提示:为规避购买风险,建议您在购买产品前务必确认供应商资质及产品质量。
扫一扫访问手机站(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总16页&&|
您的计算机尚未安装Flash,点击安装&
阅读已结束,如需下载到电脑,请使用积分()
下载:8积分
0人评价9页
0人评价268页
0人评价25页
0人评价33页
0人评价21页
所需积分:(友情提示:大部分文档均可免费预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
若此文档涉嫌侵害了您的权利,请参照说明。
评价文档:
下载:8积分干货 | 代码引起的NATIVE野指针问题(上)
作者介绍:
简介:朴英敏,小米MIUI部门。从事嵌入式开发和调试工作8年多,擅长逆向分析方法,主要负责解决安卓系统问题。
上周组同事反馈了一个必现Native Crash问题,tombstone如下:
崩溃的原因是pc指向了一个没有可执行权限的内存地址上。
pid: 5028, tid: 5028, name: com.miui.player &&&& com.miui.player &&&
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 79801f28
&& &r0 7ac59c98 &r1
&r2 bea7b174 &r3 400fc1b8
&& &r4 774c4c88 &r5 79801f28 &r6 bea7b478 &r7 40c12bb8
&& &r8 7c1b68e8 &r9
&sl bea7b478 &fp bea7b414
&sp bea7b148 &lr 40c07031 &pc 79801f28 &cpsr 600f0010
backtrace:
#00 &pc 0000bf28 &&unknown&
&& &#01 &pc 0002302f &//lib/libhwui.so (::uirenderer::OpenGLRenderer::callDrawGLFunction(android::Functor*, android::uirenderer::Rect&)+322)
&& &#02 &pc 00015d91 &/system/lib/libhwui.so (android::uirenderer::DrawFunctorOp::applyDraw(android::uirenderer::OpenGLRenderer&, android::uirenderer::Rect&)+28)
&& &#03 &pc
&/system/lib/libhwui.so (android::uirenderer::DrawBatch::replay(android::uirenderer::OpenGLRenderer&, android::uirenderer::Rect&, int)+74)
&& &#04 &pc
&/system/lib/libhwui.so (android::uirenderer::DeferredDisplayList::flush(android::uirenderer::OpenGLRenderer&, android::uirenderer::Rect&)+218)
&& &#05 &pc 0001d1cf &/system/lib/libhwui.so (_ZN7android10uirenderer14OpenGLRenderer15drawDisplayListEPNS0_11DisplayListERNS0_4RectEi.part.47+230)
&& &#06 &pc 0006820d &/system/lib/libandroid_runtime.so
初步分析: 对应的代码如下:
status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
&& &if (mSnapshot-&isIgnored()) return DrawGlInfo::kStatusD
&& &detachFunctor(functor);
&& &interrupt();
=& &status_t result = (*functor)(DrawGlInfo::kModeDraw, &info);
其中,Functor类重载了()操作符:
class Functor {
&& &Functor() {}
&& &virtual ~Functor() {}
=& &virtual status_t operator ()(int /*what*/, void* /*data*/) { return NO_ERROR; }
因此,()操作其实就是调用了Functor类的一个虚函数,它的具体实现目前还不清楚。 对应的汇编代码如下:&&
23028: &&&&&&aa0b &&&&&&&&&&&add &&&&r2, sp, #44
2302a: &&&&&&6803 &&&&&&&&&&&ldr &&&&r3, [r0, #0] ; r0是functor,r3 = [r0] = functor.vtlb
2302c: &&&&&&689d &&&&&&&&&&&ldr &&&&r5, [r3, #8] ; r5 = [r3 + 8] = [functor.vtlb + 8] = Functor.operator()
2302e: &&&&&&47a8 &&&&&&&&&&&blx &&&&r5 &; call Functor.operator()
崩溃时的寄存器值如下:
r0 7ac59c98 &r1
&r2 bea7b174 &r3 400fc1b8
r4 774c4c88 &r5 79801f28 &r6 bea7b478 &r7 40c12bb8
r8 7c1b68e8 &r9
&sl bea7b478 &fp bea7b414
&sp bea7b148 &lr 40c07031 &pc 79801f28 &cpsr 600f0010
可以看到,r5和pc值是相等的,可以知道,确定是崩溃在2302e这一行汇编代码中。 而查看寄存器对应的内存值,发现有点问题:
memory near r0:
&& &7ac59c78 b38 23831ef0 &
&& &7ac59c88 2a9b50 00011 &
&& &7ac59c98 10
&& &7ac59ca8 00
memory near r3:
&& &400fc198 7c74c000 acd8 &
&& &400fc1a8 fc1a8 400fc1a8 &
&& &400fc1b8 400fc1b0 400fc1b0 7c04acb8 7c78f008 &
&& &400fc1c8 7c021d98 7c78ffc0 7983bbf0 7c04bfa8
[r0] = [7ac59c98] = ,这个和r3值(400fc1b8)不一样, 同样 [r3+8] = [400fc1b8 + 8] = 7c04acb8,这个值也和r5值(79801f28)不一样。
这在平时的tombstone里是非常少见的! 乍一看非常不可思议,但仔细想想tombstone的生成过程,就能发现其中的问题。 原来寄存器信息是错位崩溃时的cpu context,保存在崩溃时的线程私有的信号栈和内核栈中,直到debuggerd去获取这个值,它是不会被修改的。 而内存是进程中的各个线程共享的,所以在发生异常到debuggerd打印内存信息这段过程中(其实是相对很长的一个过程),别的线程是有可能修改内存值的。
为了证明别的线程在改这个内存值,在callDrawGLFunction()函数中的若干处打印了Functor和它的vtbl(虚函数表地址)值:
status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
&& &AOGI("functor=%p,vtbl=%p");
&& &sleep(1);
&& &if (mSnapshot-&isIgnored()) return DrawGlInfo::kStatusD
&& &AOGI("functor=%p,vtbl=%p");
&& &sleep(1);
&& &detachFunctor(functor);
&& &AOGI("functor=%p,vtbl=%p");
&& &sleep(1);
&& &interrupt();
&& &AOGI("functor=%p,vtbl=%p");
&& &sleep(1);
&& &status_t result = (*functor)(DrawGlInfo::kModeDraw, &info);
抓到的log如下:
10-27 21:19:45.794
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x73648de0
10-27 21:19:47.801
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x73648de0
10-27 21:19:48.801
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x73648de0
10-27 21:19:49.801
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x73648de0
10-27 21:19:50.804
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x73648de0
10-27 21:19:51.804
I OpenGLRenderer: functor=0x7a7b8530,vtbl=0x400fc1b8
可以确定确实有别的线程在修改这个值。 这里就存在两个可能性了: 1、别的线程也持有functor指针,并修改内容 2、functor是野指针,对应的内存已经还回系统,其他模块可任意使用。 而对象的vtbl一般是不会修改的,所以2的可能性更大一些。 为了查明是哪个线程在改,对functor指向的内存做了写保护操作:
static int** s_saved_vtbl = NULL;
static void* s_saved_functor = NULL;
static void &mprotect_local(int** p) {
&& &// 一旦发现vtbl有变化就将对应内存设置为只读
&& &if(p != s_saved_vtbl) {
&& & & &mprotect((void*)((unsigned int)s_saved_functor&0xfffff000), 4096, PROT_READ);
&& &sleep(1);
status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
&& &int* ptr = (int*)
&& &s_saved_functor = (void*)
&& &s_saved_vtbl = (int**)*
&& &if (mSnapshot-&isIgnored()) return DrawGlInfo::kStatusD
&& &mprotect_local((int**)*ptr);
&& &detachFunctor(functor);
&& &mprotect_local((int**)*ptr);
&& &mprotect_local((int**)*ptr);
&& &interrupt();
&& &status_t result = (*functor)(DrawGlInfo::kModeDraw, &info);
push到中复现问题,很容易抓到访问权限引起的crash。 而每次的crash的线程和位置都不一样,也就是不同的线程在不同的函数中读写这个地址。 这样基本上就确定是野指针问题,进入下一阶段的分析。
关于野指针: 所谓野指针就是一个对象被释放后又被使用,可能是释放的问题,也可能是使用的问题。 我们已经知道使用的位置,接下来要找出是从哪释放的。 找到释放对象的最笨的方法,是在free()函数里打印调用栈。 &
但这么做有两个问题: 1、log太量多,一秒内可能会有成千上万的malloc/free函数被调用。 2、打印调用栈的函数本身会调用free函数,这样会陷入死循环。 为了解决上面两个问题,需要用到hook。
关于hook技术: 要了解hook技术,得先了解外部函数的调用过程。 所谓外部函数就是外部模块中定义的函数。比如,libhwui.so中的某个中调用了malloc函数,而这个malloc函数是libc.so中定义的。 当编译libhwui.so的这个源文件时,对应调用malloc的地方会生成如下的汇编代码:
这里blx是arm的跳转指令,addr是目标地址,也就是malloc函数的地址,那这个malloc函数的地址如何确定? 这个编译的阶段是无法确定的,只有当运行时进程加载完libc.so以后,malloc函数的地址才能被确定。 所以在编译的时候会在libbinder.so中留出一部分作为地址表,专门用于存放外部函数的地址,这个区域叫got表。 每一个本模块调用到的外部函数都对应got表中的一项。 当然got表里面的内容是在进程启动阶段,加载库时被连接器linker填充的。& 而编译阶段我们只需要将代码写成: 1、从got表对应位置获取外部函数地址 2、跳转到这个外部函数的地址
这个动作需要由若干的指令来完成,所以跳转指令blx addr中的addr其实指向本模块的一组指令:
blx & &cb74 &malloc@plt&
这组指令所在的区域就是elf文件结构里的plt表,plt表中每一个外部函数都对应一个表项,如:
0000cb74 &malloc@plt&:
&& &cb74: & &e28fc600 & & add & &ip, pc, #0, 12
&& &cb78: & &e28cca29 & & add & &ip, ip, #167936 & &;
&& &cb7c: & &e5bcf1e8 & & ldr & &pc, [ip, #488]! & &;
0000c8bc &free@plt&:
&& &c8bc: & &e28fc600 & & add & &ip, pc, #0, 12
&& &c8c0: & &e28cca29 & & add & &ip, ip, #167936 & &;
&& &c8c4: & &e5bcf3b8 & & ldr & &pc, [ip, #952]! & &;
每一个plt表项都是做相同操作: 1、先获取got表中外目标函数对应的地址(前两行); 2、从got表中获取地址目标函数的地址,并赋给pc寄存器(第三行)。
下面给出got表和plt表在so文件中的位置:
readelf -S libhwui.so
&&[Nr] Name & & & & & & &Type & & & & & &Addr & & Off & &Size & ES Flg Lk Inf Al
&&[ 0] & & & & & & & & & NULL & & & & & &000
& & &0 & 0 &0
&&[ 1] .interp & & & & & PROGBITS & & & &134
& A &0 & 0 &1
&&[ 2] .dynsym & & & & & DYNSYM & & & & &148
& A &3 & 1 &4
&&[ 3] .dynstr & & & & & STRTAB & & & & &568
& A &0 & 0 &1
&&[ 4] .hash & & & & & & HASH & & & & & &7c0c
& A &2 & 0 &4
&&[ 5] .rel.dyn & & & & &REL & & & & & & d40 002bc8 08 & A &2 & 0 &4
&&[ 6] .rel.plt & & & & &REL & & & & & & b908 000a78 08 & A &2 & 7 &4
=&[ 7] .plt & & & & & & &PROGBITS & & & &c380 000fc8 00 &AX &0 & 0 &4
&&[ 8] .text & & & & & & PROGBITS & & & &d348 01ef30 00 &AX &0 & 0 &8
&&[ 9] .ARM.exidx & & & &ARM_EXIDX & & & c278 001fb8 08 &AL &8 & 0 &4
&&[10] .ARM.extab & & & &PROGBITS & & & &e230
& A &0 & 0 &4
&&[11] .rodata & & & & & PROGBITS & & & &eb60
& A &0 & 0 &4
&&[12] .fini_array & & & FINI_ARRAY & & &010
&WA &0 & 0 &4
&&[13] .data.rel.ro & & &PROGBITS & & & &018
&WA &0 & 0 &8
&&[14] .init_array & & & INIT_ARRAY & & &928 00000c 00 &WA &0 & 0 &4
&&[15] .dynamic & & & & &DYNAMIC & & & & 934
&WA &3 & 0 &4
=&[16] .got & & & & & & &PROGBITS & & & &a74 00058c 00 &WA &0 & 0 &4
&&[17] .data & & & & & & PROGBITS & & & &000 00025c 00 &WA &0 & 0 &4
&&[18] .bss & & & & & & &NOBITS & & & & &525c
&WA &0 & 0 &4
&&[19] .comment & & & & &PROGBITS & & & &25c
&MS &0 & 0 &1
&&[20] .note.gnu.gold-ve NOTE & & & & & &26c 00001c 00 & & &0 & 0 &4
&&[21] .ARM.attributes & ARM_ATTRIBUTES &288 00003e 00 & & &0 & 0 &1
&&[22] .gnu_debuglink & &PROGBITS & & & &2c6
& & &0 & 0 &1
&&[23] .shstrtab & & & & STRTAB & & & & &2d6 0000dc 00 & & &0 & 0 &1
我们的hook技术就是通过修改so的got表来截获so中的某些外部函数调用。 so的代码段是多个进程共享的,但它的数据段私有的,而got表就是数据段。 所以我们只修改music应用进程的libhwui.so的got表中free函数对应的项,影响范围将大大减少。
那改成什么值呢?一般是我们自己定义的函数,比如:
void inject_free(void *ptr) & {
&& &ALOGI("free ptr=%p",ptr);
&& &dumpNativeStack();
&& &dumpJavaStack();
&& &free(ptr);
为了不影响原来的逻辑,打印完debug信息,还是要调用原来被hook的函数。 有了hook技术后能完美的解决野指针中的两个问题,下面继续分析问题。
小米开放平台重磅推出小米帐号接入有礼活动:自今日起至日前成功接入小米帐号即可获得小米开放平台免费提供的平台资源(小米应用商店、小米卡包、小米推送vip、小米帐号联盟等资源),机会不容错过,我们期待您的加入! 活动报名地址:/console/hd/account.html?hmsr=%E5%BC%80%E6%BA%90%E4%B8%AD%E5%9B%BD%E5%8D%9A%E5%AE%A2%E6%B8%A0%E9%81%93&hmpl=&hmcu=&hmkw=&hmci= 官方QQ交流群:
想了解更多?
那就关注我们吧!
小米开放平台公众号新版模拟器打开模拟器提示F,请教大神们,LDR:class,std:runtime_电脑数码_丸子百科网
新版模拟器打开模拟器提示F,请教大神们,LDR:class,std:runtime
&&&来源:用户发布&&&发布时间:&&&查看次数:27
新版模拟器打开模拟器提示F,请教大神们,LDR:class,std:runtime
该问题暂无回答。
电脑数码相关
更多相关内容
本站内容来自网友发布,本站无法保证其部分内容的正确性,请用户一定仔细辨别。
[] &&[联系QQ:885&971&98] &
津ICP备号&}

我要回帖

更多关于 怎么更换密保手机号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信