图文精华

易锦教育»学术中心 学术交流社区 作业中心 Android逆向精英班(第一期) 2021-09-03 精英班学员
分享

2021-09-03 精英班学员

msms_0oEDH0D8 发表于 2021-9-7 23:02:45
IDA(32位)打开libnative-lib.so, 在IDA View-A页面 -> alt+t搜索_Z3mulP7_JNIEnvP8 找到.text段此函数位置

.text:0000138C _Z3mulP7_JNIEnvP8_jobjectxx             ; CODE XREF: mul(_JNIEnv *,_jobject *,long long,long long)+8j
.text:0000138C                                         ; DATA XREF: .got:_Z3mulP7_JNIEnvP8_jobjectxx_ptro ...
.text:0000138C
.text:0000138C var_20          = -0x20
.text:0000138C var_1C          = -0x1C
.text:0000138C var_18          = -0x18
.text:0000138C var_14          = -0x14
.text:0000138C var_10          = -0x10
.text:0000138C var_C           = -0xC
.text:0000138C arg_0           =  8
.text:0000138C arg_4           =  0xC
.text:0000138C
.text:0000138C                 PUSH            {R4,R5,R7,LR} ;把R4,R5,R7,LR寄存器值存入栈指针所指向内存地址以保护现场
.text:0000138E                 ADD             R7, SP, #8 ;R7=(SP+8)
.text:00001390                 SUB             SP, SP, #0x18 ;开辟栈空间,SP = (sp-24),栈空间24
.text:00001392                 LDR.W           R12, [R7,#arg_4] ;r12 = *(r7+12) ?为何这么操作
.text:00001396                 LDR.W           LR, [R7,#arg_0]        ;lr=*(R7+8) ?
.text:0000139A                 MOV             R4, R3        ;R4=R3
.text:0000139C                 MOV             R5, R2        ;R5=R2
.text:0000139E                 STR             R0, [SP,#0x20+var_C]        ;*(sp+20)=r0,env
.text:000013A0                 STR             R1, [SP,#0x20+var_10]        ;*(sp+16)=r1,jobject
.text:000013A2                 STR             R3, [SP,#0x20+var_14]        ;*(sp+12)=r3,乘数b
.text:000013A4                 STR             R2, [SP,#0x20+var_18]        ;*(sp+8)=r2, 乘数a       
.text:000013A6                 STR.W           R12, [SP,#0x20+var_1C]        ;*(sp+4)=r12,?
.text:000013AA                 STR.W           LR, [SP,#0x20+var_20]        ;*(sp)=lr
.text:000013AE                 LDR             R0, [SP,#0x20+var_18]        ;r0=*(sp+8),乘数a
.text:000013B0                 LDR             R1, [SP,#0x20+var_14]        ;r1=*(sp+12),乘数b
.text:000013B2                 LDR             R2, [SP,#0x20+var_20]        ;r2=*sp,?
.text:000013B4                 LDR             R3, [SP,#0x20+var_1C]        ;r3=*(sp+4),?
.text:000013B6                 UMULL.W         R12, LR, R0, R2                ;64位无符号乘法指令,r12=r0*r2的低32位,lr=r0*r2的高32位
.text:000013BA                 MLA.W           R0, R0, R3, LR                ;r0=r0*r3+lr,?
.text:000013BE                 MLA.W           R1, R1, R2, R0                ;r1=r1*r2+r0,?
.text:000013C2                 MOV             R0, R12                        ;r0=r12
.text:000013C4                 ADD             SP, SP, #0x18                ;恢复现场,对应SUB SP, SP, #0x18
.text:000013C6                 POP             {R4,R5,R7,PC}                ;恢复现场,对应push
.text:000013C6 ; End of function mul(_JNIEnv *,_jobject *,long long,long long)

有很多疑问
<
回复

使用道具 举报

小飞 发表于 2021-9-7 23:29:13
作业要求:分析APP程序中lib目录下的armeabi-v7a文件夹里面的so文件,使用IDA打开so文件,找到里面的_Z3mulP7_JNIEnvP8_jobjectxx函数,给每条汇编指令添加注释(分析案例已经上传到附件)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

恐龙先生 发表于 2021-9-8 11:05:20
20210903作业

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

mlq 发表于 2021-9-9 11:04:12
通过Search▶Text(热键:ALT+T)命令启动文本搜索_Z3mulP7_JNIEnvP8 找到.text段此函数位置




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

心情落叶 发表于 2021-9-9 21:26:05

.text:0000138C var_20 = -0x20 .text:0000138C var_1C = -0x1C .text:0000138C var_18 = -0x18 .text:0000138C var_14 = -0x14 .text:0000138C var_10 = -0x10 .text:0000138C var_C = -0xC .text:0000138C arg_0 = 8 .text:0000138C arg_4 = 0xC .text:0000138C .text:0000138C PUSH {R4,R5,R7,LR} //将R4,R5,R7,LR 的值压入栈内存 .text:0000138E ADD R7, SP, #8 //R7 = SP+8 .text:00001390 SUB SP, SP, #0x18 //SP = SP-0x18 栈顶指针(Stack Point)下移0x18 .text:00001392 LDR.W R12, [R7,#arg_4] //R12 = [R7+0xC] .text:00001396 LDR.W LR, [R7,#arg_0] //LR = [R7+0x8] LR(Link Register) 保存返回地址 .text:0000139A MOV R4, R3 //R4 = R4+R3 .text:0000139C MOV R5, R2 //R5 = R5+R2 .text:0000139E STR R0, [SP,#0x20+var_C] //将R0的值保存到栈地址 [SP+0x20-0xC]=[SP+0x14] .text:000013A0 STR R1, [SP,#0x20+var_10] //将R1的值保存到栈地址 [SP+0x20-0x10]=[SP+0x10] .text:000013A2 STR R3, [SP,#0x20+var_14] //将R3的值保存到栈地址 [SP+0x20-0x14]=[SP+0xC] .text:000013A4 STR R2, [SP,#0x20+var_18] //将R2的值保存到栈地址 [SP+0x20-0x18]=[SP+0x8] .text:000013A6 STR.W R12, [SP,#0x20+var_1C] //将R12的值保存到栈地址 [SP+0x20-0x1C]=[SP+0x4] .text:000013AA STR.W LR, [SP,#0x20+var_20] //将LR的值保存到栈地址 [SP+0x20-0x20]=[SP] 将返回地址保存到栈顶 .text:000013AE LDR R0, [SP,#0x20+var_18] //将[SP+0x8]的值保存到R0 .text:000013B0 LDR R1, [SP,#0x20+var_14] //将[SP+0xC]的值保存到R1 .text:000013B2 LDR R2, [SP,#0x20+var_20] //将[SP]的值保存到R2 .text:000013B4 LDR R3, [SP,#0x20+var_1C] //将[SP+0x4]的值保存到R3 .text:000013B6 UMULL.W R12, LR, R0, R2 //无符号64位乘法指令: R12=R0xR2的低32位,LR=R0xR12的高32位 .text:000013BA MLA.W R0, R0, R3, LR //R0=(R0xR3)+LR .text:000013BE MLA.W R1, R1, R2, R0 //R1=(R1xR2)+R0 .text:000013C2 MOV R0, R12 //R0=R12 .text:000013C4 ADD SP, SP, #0x18 //SP=SP+0x18 栈顶指针上移0x18 .text:000013C6 POP {R4,R5,R7,PC} //将R4,R5,R7,LR 的值弹出栈内存 .text:000013C6 ; End of function mul(_JNIEnv ,_jobject ,long long,long long)

<
回复

使用道具 举报

古哥 发表于 2021-9-12 21:07:47

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

Heaven.路 发表于 2021-9-27 11:04:33

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

wx_188 发表于 2021-10-2 16:07:22
.text:0000138C ; mul(_JNIEnv *, _jobject *, long long, long long)
.text:0000138C                 EXPORT _Z3mulP7_JNIEnvP8_jobjectxx
.text:0000138C _Z3mulP7_JNIEnvP8_jobjectxx             ; CODE XREF: mul(_JNIEnv *,_jobject *,long long,long long)+8↑j
.text:0000138C                                         ; DATA XREF: LOAD:000003D0↑o ...
.text:0000138C
.text:0000138C var_20          = -0x20
.text:0000138C var_18          = -0x18
.text:0000138C var_14          = -0x14
.text:0000138C var_10          = -0x10
.text:0000138C var_C           = -0xC
.text:0000138C arg_0           =  8
.text:0000138C
.text:0000138C ; __unwind {
.text:0000138C                 PUSH            {R4,R5,R7,LR} ; 将R4,R5,R7,RL压进栈中
.text:0000138E                 ADD             R7, SP, #8 ; 将SP的地址加上8偏移赋R7
.text:00001390                 SUB             SP, SP, #0x18 ; 将SP的地址减去0X18重新赋给SP分配一个空间
.text:00001392 ; 2:   return a3 * a4;
.text:00001392                 LDR.W           R12, [R7,#arg_0+4] ; 将R7的地址加上8再加上4的偏移地址里面的数据加载到R12
.text:00001396                 LDR.W           LR, [R7,#arg_0] ; 将R7加上8偏移的地址数据加载到LR
.text:0000139A                 MOV             R4, R3  ; 将R3的地址赋给R4
.text:0000139C                 MOV             R5, R2  ; 将R2的地址赋给R5
.text:0000139E                 STR             R0, [SP,#0x20+var_C] ; 将SP地址加上0X20再加上0XC的偏移数据存储到R0
.text:000013A0                 STR             R1, [SP,#0x20+var_10] ; 将SP地址加上0X20再加上0X10的偏移数据存储到R1
.text:000013A2                 STR             R3, [SP,#0x20+var_14] ; 将SP地址加上0X20再加上0X14的偏移数据存储到R3
.text:000013A4                 STR             R2, [SP,#0x20+var_18] ; 将SP地址加上0X20再加上0X18的偏移数据存储到R2
.text:000013A6                 STR.W           R12, [SP,#0x20+var_20+4] ; 将SP地址加上0X20再加上0X20+4偏移地址数据存储到64位的R12寄存器
.text:000013AA                 STR.W           LR, [SP,#0x20+var_20] ; 将SP地址加上0X20再加上0X20偏移地址数据存储到64位的LR寄存器
.text:000013AE                 LDR             R0, [SP,#0x20+var_18] ; 加载SP地址加上0X20再加上0X18偏移地址数据到R0
.text:000013B0                 LDR             R1, [SP,#0x20+var_14] ; 加载SP地址加上0X20再加上0X14偏移地址数据到R1
.text:000013B2                 LDR             R2, [SP,#0x20+var_20] ; 加载SP地址加上0X20再加上0X20偏移地址数据到R2
.text:000013B4                 LDR             R3, [SP,#0x20+var_20+4] ; 加载SP地址加上0X20再加上0X20+4偏移地址数据到R3
.text:000013B6                 UMULL.W         R12, LR, R0, R2 ; 无符号数相除 (R0*R2) 得到的结果低于32位就和R12相加存放到R0,高于32位与LR相加存放到LR
.text:000013BA                 MLA.W           R0, R0, R3, LR ;  R0=(R0*R3+LR);
.text:000013BE                 MLA.W           R1, R1, R2, R0 ; R1=(R1*R2+R0);
.text:000013C2                 MOV             R0, R12 ; 将R12寄存器的内容存入R0寄存器进行返回
.text:000013C4                 ADD             SP, SP, #0x18 ; 释放SP+0X18的地址空间
.text:000013C6                 POP             {R4,R5,R7,PC} ; 将R4,R5,R7,PC推出栈
.text:000013C6 ; } // starts at 138C
.text:000013C6 ; End of function mul(_JNIEnv *,_jobject *,long long,long long)
.text:000013C6

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则