跳至主要内容

博文

目前显示的是 一月, 2018的博文

32位ARM汇编语言(四)数据处理指令

http://ift.tt/2Gwa4v5 基本指令介绍 数据传送指令 比较指令 cmp{条件}操作数1,操作数2 CMN{条件}操作数1,操作数2 TST{条件},操作数1,操作数2 TEQ{条件} 操作数1,操作数2 算数逻辑运算指令 ADD{条件}{S}目的寄存器,操作数1,操作数2 ADC{条件}{S}目的寄存器,操作数1,操作数2 RSB{条件}{S}目的寄存器,操作数1,操作数2 RSC{条件}{S}目的寄存器,操作数1,操作数2 AND{条件}{S}目的寄存器,操作数1,操作数2 EOR{条件}{S}目的寄存器,操作数1,操作数2 BIC{条件}{S}目的寄存器,操作数1,操作数2 基本指令介绍 数据传送指令 数据传送指令用于在寄存器和储存器中之间进行数据的双向传输 比如:MOV ,MVN 算数逻辑运算指令 完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中相应条件表示位 比如:ADD,ADC,SUB,SBC,RSB,RSC,AND,ORR,EOR,BIC 比较指令 不保存运算结果,只更新CPSR中相应的条件标志位 比如:CMP,CMN,TST,TEQ 数据传送指令 指令 描述 MOV{条件}{S}目的寄存器,操作数 数据传送指令 MVN{条件}{S}目的寄存器,操作数 数据取反传送指令 {S}选项决定指令的操作是否影响CPSR中条件标志位的值 MVN与MOV不同之处是在传送之前按位被取反 __asm__ ("mov ri,r0“); //将寄存器R0的值传送到寄存器R1 __asm__(”mov r1,r0,lsl#3"); //将寄存器R0的值左移3位后传到R1 __asm__(“mov pc,lr"); //将寄存器lr的值传送到pc,常用于子程序返回 __asm__("mvn r0,#0”); // 将立即数0 取反传送到寄存器R0中,完成后R0=-1 比较指令 指令 描述 CMP{条件}操作数1,操作数2 比较指令 CMN{条件}操作数1,操作数2 比较反值指令 TST{条件...

32位ARM汇编语言(二)ARM 汇编语言特点

http://ift.tt/2FpIH4w 两种不同风格的ARM指令 特点1:LDR/STR结构 特点2:8中寻址方式 特点3:指令后缀 特点4:条件执行后缀 特点5:多级指令流水线 两种不同风格的ARM指令 ARM 官方的ARM汇编指令:指令一般用大写,Windows中IDE开发环境常用,如 LDR RO,[R1] GNU风格的ARM汇编:指令一般用小写字母,linux中常用,如: ldr r0,[r1] 特点1:LDR/STR结构 ARM 采用RISC(Reduced Instruction Set Computer 中文:精简指令计算机)结构,cpu本身不能直接读取内存,需要先将内存中的内容加载到cpu中的通用寄存器中,而后才能被cpu处理 ldr(load register)指令将内存内容加载入通用寄存器 str(store register)指令将寄存器内容存入内存空间中 ldr/str组合用来实现ARM cpu和内存的数据交互 特点2:8中寻址方式 寻址方式 示例 寄存器寻址 mov r1,r2 立即寻址 mov r0,#0xff00 寄存器移位寻址 mov r0,r1,lsl#3 寄存器间接寻址 ldr r1,[r2] 基址变址寻址 ldr r1,[r2,#4] 多寄存器寻址 ldmia r1!,{r2-r7,r12} 堆栈寻址 stmfd sp!,{r2-r7,lr} 相对寻址 beq sign 特点3:指令后缀 虽然ARM的汇编指令不是很多,但是通常可以在指令后面跟上后缀,变成不同的指令,常用的指令有: 常用指令后缀 解释 B(byte) 功能不变,操作长度变为8位 H(half word) 功能不变,长度变为16位 S(signed) 功能不变,操作数变为有符号(如ldrsh,ldrsb) S(S标志) 功能不练,影响CPSR标志位,如(mov 和movs,movs r0,#0) 特点4:条件执行后缀 条件码 助记符 助记符全拼 说明 检测条件 0000 EQ equal 等于0 Z=1 0001 NE not equal...

32位ARM汇编语言(一)寄存器介绍

http://ift.tt/2EiY3sg ARM 基本约定 ARM处理器工作模式(7种) ARM寄存器 Abort Mode FIQ Mode IRQ Mode SVC Mode Undef Mode User Mode 小结 ARM 基本约定 Byte:8 bits Halfword: 16bits Word:32 bits 大部分的ARM core提供: - ARM 指令集(32-bit)(中断处理,需要32位) - Thumb指令集(16-bit)(最先推出的,每个指令16位) - Thumb2 指令集(16&32bit)(ARMv7时退出,混合指令) - ARM Thumb 互相可以转换 ARM处理器工作模式(7种) 7种工作模式: Mode 解释 User 非特权模式,大部分任务执行在这种模式 FIQ 当一个高优先级(fast)中断产生时将会进入这种模式(ARM的FIQ Signal被触发所产生的异常) IRQ 当一个低优先级(normal)中断产生时将会进入这种模式(ARM的IRQ Signal被触发所产生的异常 ) Supervisor 当复位或软中断指令执行时将会进入这种模式 Abort 当存取异常时将会进入这种模式(也就是读取内存异常) Undef 当执行未定义指令时进入这种模式 System 使用和User模式相同寄存器集的特权模式 注意: 1:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式) 2:Privilege中除Sys模式外,其余5种为异常模式 3:各种模式的切换,可以是普通程序员通过代码主动切换(通过写cpsr寄存器);也可以是CPU在某些情况下自动切换 4:各种模式下权限和可以访问的寄存器不同 ARM寄存器 ARM 寄存器一共有37个32位寄存器 其中,30个为”通用“寄存器,r1-r14 未分组的寄存器:r1-r7,只有一个寄存器 分组的寄存器: r8-r14:有多个同名寄存器 r8-r12:两个 r13-r14:6个 r13(sp),R14(lr) 一个固定的程序计数器:pc(又称r15),也...

安卓CTF cake.apk解题

http://ift.tt/2DENrGZ 题目基本信息 大小: 1685975 bytes 修改时间: 2018年1月25日, 12:03:47 MD5: EBA6C33907783F8D24313AF3C1329598 SHA1: DD6821B9F91282325C87FD51220896168AAA3935 CRC32: A1CF79DC cake.apk解压密码: nvai 安装运行画面 很明显这是一道解密题,二话不说开始分析吧 分析 拖到安卓killer中,注册文件没有发现有什么特别的 只知道主模块是 .M 在主模块中的 onCreate 函数中,发现 实在 a 这个了类中有点击事件的监听器,那么进去看 onClick 函数倒地做了什么 整个a函数是非常简单的,就一个点击相应函数,这里比较关注的是 check 函数,实在主类中,进去查看一下 大体的逻辑是,先通过getkey,获取一个字符串保存到str1中,本来getkey返回的字符串是这样的 但是注意了,这里是方法的名称是 getKey 但是 str1= get□ey 非常的具有迷惑力 实例返回的字符串应该是这个 从图片上也可以看到,对数组进行了赋值,赋值完之后的数组为 int tem[16] = { 0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42 }; 紧接着就是对字符串进行校对,可以看到整个程序中没有返回值,如果发生了错误,都会调到自定义的错误 localException1 进行处理 通过观察可以得知数组中每个元素和字符串的关系为 密码[i]^str[i%8]=整型数组[i] 因此写过控制台程序进行输出 计算解密 int tem[16] = { 0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42 }; char temchar[] = "bobdylan"; for (int i = 0; i < 16; i++) { char c = tem[i] ^ temchar[(i % 8)]; printf("%c...

Android病毒分析之《秒抢红包apk》

http://ift.tt/2E6mnxp 病毒信息 恶意行为 病毒执行 病毒分析 总结 病毒信息 大小: 251271 bytes 修改时间: 2016年4月15日, 23:37:26 MD5: 033AE1BA78676130E99ACC8D9F853124 SHA1: B43F731C59FF37602CB9F971F893965EF19C9DEE CRC32: AAC480FC 恶意行为 修改锁屏画面 修改锁屏密码 监控输入密码尝试次数 开机自启恶意画面 激活设备管理器 对解密进行勒索 病毒执行 首先安装好病毒之后,病毒向用户申请权限 通过图片可以看到,申请的权限有 - 清楚所有数据 - 更改屏幕锁屏密码 - 更改密码 - 检视屏幕解锁尝试次数 - 锁定屏幕 加入用户点击激活之后,就会发生下面的情况 病毒分析 首先看注册文件 通过图片可以发现,这个广播中有一个 DEVICE_ADMIN_ENABLED 权限,这是服务的类是 MyAdmin ,这个类被用过很多次了,感觉网上很多病毒代码都是搜索一下拼凑的。。。同时上面还有一个开机自启的权限 进去 MyAdmin 这个类中,可以发现有又给很明显的onPasswordChanged函数,这个很明显的就可以看到的是密码是 8985 ,经过试验,是可以用这个密码解开重启之后的手机的,并且手动关闭设备管理器之后,是可以把这个程序卸载掉的 但是卸载掉之后发现,重启手机仍旧是可以看到锁的 因此我们需要换个思路,这样可能不行,需要把上面图片描述页面的密码找出来,因为那个界面有监控数据,找起来应该有点麻烦 在 DU 这个类中,发现了 DES 进行加密解密的函数 当用户点击验证密码的时候,肯定会对保存的加密密码进行解密,然后进行比较,干脆直接在这里加一个日志Log,输出一下解密信息 通过回编译生成之后重新安装,使用 adb logcat 进行日志过滤 发现密码为 00000000 ,输入之后果然进行正常的进行解锁了 总结 这个病毒主要利用的是人的贪欲,如果用户不下载非官网的APP,在app进行权限申请的时候多留个心眼,多想想,可能就不会遭到病毒的攻击 The post Android病毒分析之《秒抢红包apk》 appear...

Android病毒分析之《王者荣耀刷皮肤》

http://ift.tt/2G9wJ0d 病毒信息 病毒行为 使用工具 病毒执行 病毒分析 卸载应用 病毒信息 大小: 261080 bytes 修改时间: 2016年3月19日, 22:57:58 MD5: CB9E3C9C5CDED91F96AA9662BA150DB8 SHA1: 3852A0324A1B57B23DE15A6D5298E61BF4C087E2 CRC32: D4DA0CB5 病毒行为 获取锁屏权限 设置设备管理器权限 获取修改屏幕密码的权限 使用工具 AndroidKiller jeb2.2.7 病毒执行 打开软件,点击立即使用之后,会让进行权限选择,不激活就提示不激活的话不能使用全部功能 这里看获取的权限是 更改屏幕锁屏密码 和 锁定屏幕 点击激活之后黑屏,退出之后发现屏幕被锁,并设有勒索信息 病毒分析 首先分析注册文件发现了了一个服务,这个服务中有 DEVICE_ADMIN_ENABLED 权限 这个 DEVICE_ADMIN_ENABLED 权限主要是使用了 DevicePolicyManager 这个类,其可以实现实现屏幕锁定、屏幕亮度调节、出厂设置等功能。如果这个设备管理器激活成功的话,那么Action就是ACTION_DEVICE_ADMIN_ENABLED, 据此调用 onEnabled 方法。因此去查看 MyAdmin 这个服务的 onEnable 方法就是最主要的 查看onEnable函数,发现了一个方法, getSharedPreferences 这个方法,这个方法可以获取以xml文件保存的键值对,而且这个保存键值对的xml文件,必须保存在 data/data/包名/shared_prefs 这个目录下 但是进去这个路径之后,发现目录下并没有这个文件夹 也就是说明其实获取的空的,但是后面又想通过 getString 这个方法获取xml实例中的“test"的字符串,但是其实是没有的,str只能等于6699了 同时通过图片可以看到,下面有 lockNow 函数和 resetPassword 函数,见名知意,同时 resetPassword 的参数是str,也就是说锁屏的密码其实是6699 卸载应用 虽然有了密码可以进去了,但是...

# java语言反编译 smali 汇编基础语法(5)之内部类以及内部类的访问

http://ift.tt/2GampFj 内部类 匿名内部类 内部类访问外部类的私有变量 外部类访问内部类的私有变量 内部类 内部类的smali特点,就是会在外部类的后面加一个$符号,然后是内部类名,如 MainActivity$Myinner 如下面的例子 java: class MyInner{ int mInt =1; public void Test(){ System.out.println(mInt); } } .class Lscience/cole/myapplication/MainActivity$MyInner; .super Ljava/lang/Object; .source "MainActivity.java" # annotations .annotation system Ldalvik/annotation/EnclosingClass; value = Lscience/cole/myapplication/MainActivity; .end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x0 name = "MyInner" .end annotation # instance fields .field mInt:I .field final synthetic this$0:Lscience/cole/myapplication/MainActivity; # direct methods #可以看到,在调用内部类的构造函数的时候,会传入外部类的指针 .method constructor <init>(Lscience/cole/myapplication/MainActivity;)V .locals 1 #这吧外部类的对象的指针给了p1,让内部类知道是谁调用的 .param p1, "this$0" # Lscience/cole/my...

java语言反编译 smali 汇编基础语法(4)之返回指令和分支结构

http://ift.tt/2Gaml8x java语言反编译 smali 汇编基础语法(4)之返回指令和循环、分支结构 java语言反编译 smali 汇编基础语法(4)之返回指令和循环、分支结构 返回指令 字符串操作 选择结构 循环结构 分支结构 第一种:case值是连续递增的 第二种:case值可以为任意值 返回指令 返回指令不多,有以下几种: - return-void:返回一个void - return-vAA:返回一个32位非对象类型的值,返回寄存器为8位 - return-wide vAA:返回一个64位非对象类型的值,返回寄存器为8位 - return-object vAA:返回一个对象类型 字符串操作 指令 说明 const-string v0,”english string" 英语字符串可以被直接解析 const-string v1,”\uxxx\uxxx" unicode字符串是这种方式 const v3,0xxxxxx 说明字符串存在于资源文件中,后面是资源的id 选择结构 smali条件跳转分支的语法一般为: if-<条件>v0,v1:cond_xx 如果v0<条件>v1成立,就跳转到cond_xx 判断关键字如下: 条件关键字 意思 if-eq if equal if-ne if not equal if-lt if less than if-le if less or equal if-ge if greater or equal if-eqz if equal zero if-nez if not equal zero if-ltz if less than zero if-lez if less equal zero if-gtz if greater than zero if-gez if greater equal zero 循环结构 在smali中循环的实现就是通过无条件跳转语句goto加条件语句if-<条件>相结合实现 循环无非...

安卓逆向练手项目:《全民捕鱼》内购破解

http://ift.tt/2E0p5EC 声明信息 开干 开始破解 字符串搜索 日志分析 更改源码,破解内购 去掉购买提示框 分析 改掉Toast,替自己加个广告 去掉弹窗 声明信息 此游戏已经下线,所以比较适合用来做来做练手的项目 保证虚拟机处于无网状态,因为已经下线了,所有联网内购功能都失效了 开干 开始破解 可以看到我们要破解的就是这个内购,在点击确定之后,会弹出一个Toast 一般有文字的是最好的了,可以用这个字符串作为突破口 字符串搜索 可以使用 AndroidKiller 或者 jeb 打开apk,这里因为 AndroidKiller 回编译比较方便,就用它了,不过他内置的源码查看真是不如jeb的 但是天不如人愿,搜了各种字符串都没有搜到 因此不得不换一个思路 日志分析 在软件开发中都需要打印日志来分析软件运行状态,游戏更甚,因此,可以尝试分析一下日志,看是否有什么苗头 首先,使用 AndroidKiller 附加到虚拟机上 然后打开日志窗口,选择游戏进程,开始监听日志 然后在点击按钮看看是否有日志 通过实验,在点击图标的时候,就有日志打印 但是经过正常的逻辑可知,肯定是点击“确定“之后才回触发购买,也就说在点击”确定“之后才回触发各种购买的函数,因此去看一下点击确定之后的日志,跟钱有关的,肯定会有日志的 :) 在点击了之后,发现日志有几处格外引人注目,跟pay相关的字眼总是惹人注目,我们有理由怀疑这个字符串很可能跟购买的函数有关,因此我们尝试搜索一下 先列出怀疑的日志如下: Failed DX_payCode2 == 5125375 FaildCode == 1211 orderFinish code = 3 result= 0 orderFinish code = 3 result= 0 先一下 DX_payCode2 这个字符串试一下 通过搜索可以发现,可以搜索到一条内容,这个太好了 ,可以减轻分析的负担 双击进去之后,点击上面的下拉框,发现这个几个函数名,完完全全就是见名知意啊,填好了 点 payFailed ,使用源码查看器 jd-gui 查看,因为不可能购买成功,所以看看失败的,然后跟成功的对比一下有什么不同,看看能不能改 经...