安卓逆向案例(4)owasp_r2pay-v0.9.apk
1. 案例来源https://github.com/OWASP/mastg/tree/master/Crackmes/Android 2. 分析过程先安装APK,根据提示随便输入内容看一看,根据题目要求,生成的那一长串字符颜色是绿色才算成功。 拖进jadx看一下,在OnCreate函数里面发现反调试和Root检测。 定位到核心判断逻辑,核心函数为gXftm3iswpkVgBNDUp,这又是一个native函数。 用IDA打开so库,导出表没看到gXftm3iswpkVgBNDUp函数,估计是动态注册的,看到了很多的decode函数,位于init_array段中,估计是解密数据用的。 看一下JNI_OnLoad函数,很乱,上了OLLVM。 上D810处理一下JNI_OnLoad函数,修正一下类型,即可定位到关键的动态注册逻辑。函数详细信息的地址off_163018是动态解密的,准备调试获取。 先把Java代码里面的反调试和ROOT检测代码给删掉,准备接下来的调试。 断到函数注册的Call,看到函数信息,包括名称:gXftm3iswpkVgBNDUp,方法签名和地址。根据函数名称...
安卓逆向案例(3)owasp_UnCrackable-Level3.apk
1. 案例来源https://github.com/OWASP/mastg/tree/master/Crackmes/Android 2. 分析过程先安装apk后运行看一眼,看起来是要输入正确的内容然后验证,先随便输入一个试试看。 用jadx-gui打开,定位到核心代码。 看一下this.check.check_code函数,重定向到了Native库。 找到bar函数,恢复类型后看一下大概逻辑。 这里v8数组和qword_15038都是动态填充的,硬分析逻辑比较麻烦,这里采取动态调试的方法来Get flag会比较简单。 3. 调试之前先干掉反调试在调试之前,我们要先干掉程序的反调试机制。 简单看一下MainActivity的逻辑,可以看到程序进行了so文件完整性检测、调试状态检测和Root检测,这里可以用修改代码、Frida Hook等方式干掉他们。这里简单起见,我就用修改代码的方式来操作。 在APK Editor里面定位到OnCreate函数。 注释掉相关检测代码,然后重新打包APK。 可以重新反编译新打包的APK验证一下,确实相关检测代码已经消失。 4. 调试启动调试的步骤我...
安卓逆向案例(2)owasp_UnCrackable-Level2.apk
1. 案例来源https://github.com/OWASP/mastg/tree/master/Crackmes/Android 2. 分析过程先安装apk后运行看一眼,看起来是要输入正确的内容然后验证。 先随便输入一个看一看。 用jadx-gui反编译看一下,定位到关键逻辑。 看一下this.m.a函数,转到了native函数bar。 解压APK后,从lib文件夹拿到libfoo.dll(记得要拿ARM版本的,x86版本会存在变量类型等相关问题),用IDA打开,从导出表中定位到bar函数。 JNI函数的参数列表和类型是固定的,修正一下参数类型。可以看到逻辑就是检查字符串长度是否为23,并于Thanks for all the fish相比较。 成功。
安卓逆向案例(1)owasp_UnCrackable-Level1.apk
1. 案例来源https://github.com/OWASP/mastg/tree/master/Crackmes/Android 2. 分析过程先安装apk文件看一下,打开后有个输入框和验证按钮,所以需要找到正确的内容输入然后验证即可。 先随便输入一个内容看一看。 用jadx-gui反编译看一下,找到MainActivity,定位到关键逻辑,程序会将输入字符串交给a.a函数处理并判断返回值。 接下来查看a.a()函数,该函数将输入字符串与sg.vantagepoint.a.a.a(b("8d127684cbc37c17616d806cf50473cc"), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0))的返回值相比较。 查看sg.vantagepoint.a.a.a函数,可以看出来是一个AES解密函数。 用密码学工具解密,得到结果:I want to believe。 成功。
结构体文档
1. 初衷其他笔记中,涉及到结构体的时候,都只是记录了其中一部分(完整记录会显得篇幅过长),这就导致查阅起来比较麻烦,这里做一个完整的结构体文档,以便查阅。 2. 内核2.1. _KTRAP_FRAME12345678910111213141516171819202122232425262728293031323334353637kd> dt _kTrap_Frament!_KTRAP_FRAME +0x000 DbgEbp : Uint4B ; 调试等其他作用 +0x004 DbgEip : Uint4B ; +0x008 DbgArgMark : Uint4B ; +0x00c DbgArgPointer : Uint4B ; +0x010 TempSegCs : Uint4B ; +0x014 TempEsp : Uint4B ; +0x018 ...
反逆向工程
1. 反静态分析 花指令:通过条件互补、固定值、滥用指针、滥用SEH等方式破坏反汇编代码 动态加解密 对抗反编译:通过push + retn替代jmp、在永不执行的代码处调整栈指针等方式使得Hex-Rays反编译器认为函数堆栈不平衡,拒绝反编译 位数交叉编码:32位/64位交叉模式编码 Java/Python代码混淆 ollvm控制流平坦化 2. 反调试 进程状态检测:检测BeingDebugged、NtGlobalFlag等 调试环境检测:检测调试器窗口、进程、文件、内核对象等 时钟检测:检测程序运行时长 异常检测:调试器和常规程序对异常的处理存在差异 断点检测:检测硬件断点/软件断点/单步标志位,检测代码段哈希 自调试和多线程/进程逻辑互补 通过调试器/插件漏洞检测或破坏 3. 反虚拟机 虚拟机痕迹与指纹检测,常见于注册表、服务、进程、文件、网卡Mac地址、CPUID、主板/磁盘型号、内核模块等 特权指令:一些特权指令如sidt、sgdt、sldt、cpuid、in等,由于性能和硬件模拟等原因虚拟化不完...
Windows微信逆向(一)Hook微信自身日志
1. 前言近期分析了一下64位的PC微信,对其中的一些内容做一些分享。本期分享内容:Hook微信自身日志。 本次分析使用版本:3.9.12.51。 2. 逆向分析众所周知,PC微信的主要业务功能均实现于WechatWin.dll,使用IDA分析。 一般日志都会存在格式化字符串,比如%s、{}等,直接在IDA中搜索。 随便选择一个看着很像(带有一些微信业务属性的,比如消息、图片等)的,追踪一下。 定位到函数sub_182627590,进去看看。 函数内发现代码获取了时间和线程ID并格式化,基本可以确定这里就是日志函数了。并发现代码循环处理字符串后在尾部添加结束符\x00。 将Hook点选择在添加结束符\x00之后,即0x18262780F处。这时候字符串已经组装完毕。 调试发现在0x18262780F处,rdx指向字符串。 3. Hook64位的Hook和32位的有点区别,32位一般在Hook点直接jmp XXXXXXXX(立即数地址)或者call XXXXXXXX(立即数地址)即可,但是64位不支持直接jmp/call立即数地址,所以这里采用mov rax,X...
经济学原理(7)开放经济的宏观经济学
1. 开放经济的基本概念1.1. 物品和服务的流动 进出口:国家对外购买或者销售物品及服务 净出口:出口 - 进口 贸易盈余(顺差):净出口 > 0 贸易赤字(逆差):净出口 < 0 1.2. 金融资源的流动 资本净流出:本国人购买外国资产 - 外国人购买本国资产,这种资产可以是直接投资或者有价证券 资本净流出 = 净出口 1.3. 储蓄和投资根据GDP公式的变形,储蓄 = 国内投资 + 资本净流出 1.4. 美国的贸易赤字 不平衡的财政政策【政府预算赤字的增加(如减税、国防支出增加等)导致】:在储蓄减少作为既定事实时,外部投资可以刺激经济 投资高涨【科技发展等导致的外部投资高涨】:如果投资带来了好的收益,则对整体经济有好处 经济衰退【经济衰退导致投资降低,政府为了刺激经济而扩大预算赤字】 总体来说,贸易赤字并不算一个问题,但是贸易赤字有时候会是其他经济问题的征兆。 2. 汇率2.1. 真实汇率与名义汇率 名义汇率:银行提供的汇兑服务的汇率 真实汇率:双方市场同一物品的价格比值 2.2. 汇率决定理论购买力平价理论:汇率由两国的物价水平比率...
经济学原理(6)宏观经济学的数据
1. 宏观经济指标1.1. GDP指既定时间内某个国家内生产的所有物品和服务的市场价值总和。由四个部分构成: 消费 投资:资本设备、存货和建筑物等 政府消费支出和总投资 净出口 真实GDP:由名义GDP去除通胀因素后得到。 GDP并不是一个完美的指标,他对于社会福利、环境、市场外活动(如家务)、分配与不均、生产率等无法很好的衡量。但是,在衡量居民生活水平时,主观感觉存在差异且无法量化,GDP总体上仍然是一个重要指标。 1.2. 其他GDP类似指标 GNP:国民生产总值,会在GDP基础上加上本国国民在海外的生产值,并减去外籍人员在国内的生产值 NNP:国民生产净值,GNP减去折旧 个人收入:家庭和非公司制企业获得的收入 个人可支配收入:个人收入减去税收和某些非税收支出(如交通罚单) 1.3. CPICPI等于本年普通消费者购买一篮子物品与服务(一些重要的生活相关的物品与服务)的总费用与基年的总费用的比值,反映了该费用随时间变化的情况,它是衡量通货膨胀最常用的指标之一。 CPI无法处理物品替代、新增和同物品质量提升的情况,会出现一定偏差。 2. 生产与增长生产率一定程度上决定了...
经济学原理(5)微观经济学深入论题
1. 消费者选择理论1.1. 预算约束与无差异曲线 预算约束:消费者的收入构成了一条约束曲线,限制消费者的消费行为 无差异曲线:其斜率表现了用户偏好,整体曲线表现了对消费行为的影响 预算约束曲线和无差异曲线共同决定了最优选择。 1.2. 收入变动对消费的影响收入变动会导致预算约束曲线扩大或者缩小。 1.3. 价格变动对消费的影响价格变动存在两种效应,这两种效应同时作用,叠加时会导致部分变化趋势不可预测: 收入效应:价格下降会导致物品和替代品消费量均增加 替代效应:价格下降会导致物品消费量增加,替代品消费量降低 一个重要例子: 吉芬商品:如果肉和土豆同时涨价,土豆的购买量可能反而会上升。因为虽然土豆涨价了,但是在这种情况下,收入效应远大于替代效应,反而导致消费量增加 2. 不对称信息现实交易中,买卖双方所掌握的信息往往是不对称的,这会导致道德风险(如怠工)和逆向选择(如市场上充斥着劣质产品和高风险人群)。 存在以下解决方法: 发信号:拥有信息的人主动披露,如广告、文凭、高工资等 筛选:不拥有信息的人采取措施要求另一方披露,如要求入职体检、配置摄像头等设施获取信息等 政...