https://bbs.pediy.com/thread-224559.htm

最近在学习ARM汇编和逆向方面的基础知识,抽空跟着“无名”大神的逆向数据分析视频学习了一下,以下是本人在学习过程中的一些心得和笔记,还望各位大牛们指正。

PS:本人已对截图做了相应的打码处理,如有侵权或涉及敏感信息,还望告知,我会第一时间做出处理。谢谢!

一、抓包&反编译

  1. 首先在登录时,抓包,看到相应的登录信息:

通过POST信息可以看到,除了时间戳、手机号码、经过MD5处理的密码以及deviceid外,有一个“sign”的认证信息,故本次逆向分析就是针对“sign”的HASH方式进行分析。

  1. 拿出Android killer对该安装包尝试反编译,顺利反编译,发现搜索“sign”关键字后的搜索结果太多,于是换了关键字“pawd”进行搜索后,发现只有两条结果:

根据名称可以基本定位在下方LoginRegisterManager这个方法中。

3.通过反编译后的java代码,顺着pawd向下寻找,于是找到“sign”的代码:

4.通过查看,可以得出sign是通过KeyGenerator的getsign方法操作后获取,于是进入“KeyGenerator”方法,可以查看到这里调用了动态链接库(System.loadLibrary "XX_key"):

二、so静态分析

1.拿出神器IDA,打开apk包lib目录下的libxx_key.so文件,首先下意识的在Exports中搜索关键字“Java”,查看是否有相应方法调用,发现并没有,于是需要通过JNI_Onload中去寻找相应方法,进入JNI_Onload后,F5查看伪C代码,代码相对比较简练,RegisterNatives此处为JNI环境注册Native方法的通用做法:

2.点击gMethods进入查看,这是一个典型的JNINativeMethod methods[]数组,通常是3个参数:
参数1:Java层方法名
参数2:方法的签名以及返回值为Java String类型 (Ljava/lang/String;)Ljava/lang/String;
参数3:为SO库实现的方法名,这里强制转换成了函数指针,会指向SO中的方法(generateKeyByParams)

3.点击第三个参数,进入到generateKeyByParams方法内,同样F5查看伪C代码:

4.发现伪C代码居然将generateKeyByParams的方法只识别了1个传参(上一张截图中可以明显看出该方法是有3个传参的),通过上一张截图可以得知,3个参数的含义:
参数1:Env指针
参数2:Java层类对象
参数3:用户输入的String

5._ZN7_JNIEnv17GetStringUTFCharsEP8_jstringPh ; _JNIEnv::GetStringUTFChars(_jstring ,uchar ) 表示将java传入的string转换为C的string格式

6.通过对generateKeyByParams方法的分析,发现它在前面做了一些初始化的工作:

大概有40字节的内存空间初始化,然后调用了generate_key_by_value(v19, v4)这个方法

7.通过以上分析,我们可以初步断定,HASH处理应该就在generate_key_by_value方法内了

三、动态调试

  1. 手机打开,adb shell运行android_server,运行APP,IDA远程调试连接,选中相应的APP进程
  2. 在module中通过查找“libxx_key”,定位到libxx_key.so,然后查找到“generate_key_by_value”,在其开始处下断点,运行
  3. 然后在手机上随便填写一个手机号码和12345678的密码,登录,此时IDA会停留在我们的断点处,根据前面所知,generate_key_by_value有两个传参,我们可以通过动态调试的方式查看R0,R1这两个寄存器中的内容,也就是说v19和v4两个参数了:

4.通过查看可以发现R0即为我们提交时的POST封包的一些数据,而R1则为内存初始化的一段空间,此时为00
5.此时记下R1的地址(我的是BEFF34E4,每个人会有所不同),然后在generate_key_by_value方法的结束处下断点,然后运行,IDA会停留在结束处的断点,此时在HEX-View处,按G,输入刚才记下的R1地址,查看R1寄存器中的内容:

可以发现R1的内容已经为HASH后的数据,将该段数据复制出来与抓包的sign数据进行比对:

数据完全吻合,此时可以肯定,generate_key_by_value就是HASH方法关键所在。

四、算法分析

1.为了分析HASH算法,可以在IDA静态分析中继续查看generate_key_by_value的伪C代码,通过查看代码,可以发现是典型的SHA1散列值函数组合生成

其大致的流程为SHA1Init()-->SHAUpdate()-->SHA1Final()

而代码中共调用了4次SHAUpdate():

SHAUpdate(a),SHAUpdate(b),相当于SHAUpdate(a+b),于是我们可以通过代码看到这4次调用,第1次和最后1次,分别有&v15的一串字符串“bi2ipxazqodmw9hoety0h1wwgjvkttng”,推断大致的HASH流程为SHAUpdate(&v15+v6+v8+v10+v12+&v15):

2.为了验证是否正确,再次结合动态调试,在第一处BL SHA1Update处进入到SHA1Update方法中,在开始处下断

3.APP再次登录,IDA会停留到SHA1Update断点处,查看R1寄存器中的内容,发现“bi2ipxazqodmw9hoety0h1wwgjvkttng”字符串:

4.再次运行,IDA会再次停留在下断处,再次查看R1寄存器中的内容,此时变为“deviceid”:

5.继续运行,依次查看R1寄存器中的内容,“mobile”、“pawd”、“timestamp”、“bi2ipxazqodmw9hoety0h1wwgjvkttng”及其相应数据:

6.然后在generate_key_by_valu方法的结束处下断,F9运行,在HEX-View中按G,查看之前记下的R1地址(BEFF34E4),将已HASH后的数据复制出来

7.然后将动态调试时获取到的“bi2ipxazqodmw9hoety0h1wwgjvkttng”、“deviceid”等数据放在一起,保证无空格、无换行,然后通过网上SHA1哈希后与抓包的数据比对,发现完全一致:

故之前推断的HASH流程完全正确。

未完待续,后面会补充SHA1Update()伪C代码分析的学习笔记。

通过两晚的学习,发现还是很有收获的,更加激发了逆向的学习动力,虽然已近不惑,凭着对逆向的热爱兴趣,一直以来都以自学和浏览帖子为主,很少有勇气发帖,希望通过看雪这个平台多与志同道合的朋友们交流,共同进步。

转载于:https://www.cnblogs.com/davidwang456/articles/8944205.html

登录抓包逆向分析学习笔记相关推荐

  1. google nexus5x 刷机抓包逆向环境配置(三)

    本文仅供学习交流使用,如侵立删! google nexus5x 刷机抓包逆向环境配置(三) 安装抓包证书(Fiddler.Charles) 操作环境 nexus5x kaliLinux win10 准 ...

  2. google nexus5x 刷机抓包逆向环境配置(一)

    本文仅供学习交流使用,如侵立删! google nexus5x 刷机抓包逆向环境配置(一) 操作环境 nexus5x kaliLinux win10 准备 官方工具包官方下载地址:https://dl ...

  3. Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记

    Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记 中间遇到各种问题导致最终没法看到抓包信息,一个坑一个坑的埋,终于成功抓包小程序. 梳理了下可以尽量减少栽坑的安装过程,如 ...

  4. 关于Linux 网络抓包的一些笔记整理

    写在前面 遇到一个 ping 单通 的情况,需要抓包分析下,所以整理这部分笔记 博文内容涉及: HTTP/TCP 抓包分析 Demo ICMP 抓包分析 Demo Nginx 抓包分析用户名密码 De ...

  5. 基于Inspeckage的安卓APP抓包逆向分析——以步道乐跑APP为例

    引言:本人最近稍微弄懂了inspeckage的用法,特在此以步道乐跑APP为例,较详细记录地记录APP抓包与简单的逆向分析过程,用于备忘与共同学习!另外,温馨提醒,本文图片较多,建议连接WiFi阅读! ...

  6. 跨平台抓包软件Charles笔记

    文章目录 一. 代理 1.1 系统代理 1.1.1 MAC 1.1.2 WIN 1.2 浏览器代理 1.2.1 插件 1.2.2 谷歌浏览器 1.2.3 火狐浏览器 二. charles 2.1 认识 ...

  7. 监控商品库存方法之二——抓包逆向

    继上一篇. Selenium虽然模拟用户操作显得比较真实,但毕竟动用了浏览器,并按手动操作执行,效率上显然是极低的,而且耗用巨大系统资源(Chrome).所以总需要更直接高效的方式,那就是抓包再发包了 ...

  8. 软件测试里面关于网络抓包的学习笔记思考

    打工人tips: 对于网络摄像机的而言,除了设备本身的网络通信以外,还要对接对应运营商的手机app端和web端. 前段时间对于设备的主板进行过tcp的抓包,是在应用层,利用tcpdump和iperf3 ...

  9. 抓包:Charles抓包配置分析笔记

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.重发.编辑.转存等操作,也用来检查网络安全.抓包也经常被用来进行数据截取等. 一:常用抓包工具: Wireshark.Fi ...

最新文章

  1. 安卓adb常用简单指令
  2. 【PHP】多线程请求 curl_multi_init()
  3. MyBatis 解决了什么问题?
  4. lvs增加并发连接,解决因为哈希表过小导致软中断过高问题
  5. 50年后的地球什么样?大数据、AI、量子计算的书单给你答案
  6. 大学计算机基础徐久成pdf,大学计算机基础徐久成王岁花版第7章.pptx
  7. js页面自适应屏幕大小_Web页面适配移动端方案研究
  8. java程序设计题库
  9. ARM9学习笔记之——SDRAM实验
  10. 管理感悟:不要告诉主管只有一条路
  11. C语言自动刷视频源码,使用C语言快速制作一个视频播放器,使用这个开源库就可以了...
  12. ETL工具-Taskctl在Windows作业类型的使用(Soap服务驱动)
  13. Qt-高分辨率drawImage模糊问题
  14. Java多线程 - 线程状态
  15. quast 的结果怎么看_使用quast评估基因组装配的质量
  16. python操作实例_python_文件操作代码实例
  17. 【MATLAB appdesigner】23_如何通过回调函数来实现“键盘操作”?
  18. 凤凰汽车登陆纳斯达克:累计亏损1820万美元,持续经营能力存疑问
  19. Required field ‘client_protocol‘ is unset
  20. 使用selenium爬取网页

热门文章

  1. 移植net-snmp 出现的编译问题 ./libs/libnetsnmpsnmpd.a(snmpd.o): relocation R_ARM_THM_MOVW_ABS_NC against `
  2. float取整数部分_一步一步学Python3(小学生也适用) 第六篇: 变量及整数(int)类型...
  3. LED驱动设计及实现
  4. java简单通讯录的实现02person类_Java中Math类的简单介绍
  5. Android 的简介和体系结构中每个层的功能。
  6. 使用隐式Intent打开系统内置拨号界面
  7. 计算机视觉编程——图像分割
  8. mysql存储netcdf数据_关于NetCDF与HDF5存储科学数据的观点?
  9. Job for network.service failed because the control process exited with error code问题
  10. 知识图谱学习笔记-风控算法介绍