首页
社区
课程
招聘
[求助]几行arm代码求解释
2014-12-1 19:09 9575

[求助]几行arm代码求解释

2014-12-1 19:09
9575
以下为ida逆向出来的某个函数的arm汇编代码,想把它还原成C代码:
.text:00007160                 PUSH    {LR}            ; 两个参数:this指针,dest目录
.text:00007162                 SUB     SP, SP, #0x74
.text:00007164                 STR     R0, [SP,#0x78+var_74] ; this指针
.text:00007166                 STR     R1, [SP,#0x78+file] ; dest目录
.text:00007168                 LDR     R2, [SP,#0x78+file] ; R2=dest目录
.text:0000716A                 ADD     R3, SP, #0x78+buf
.text:0000716C                 MOVS    R0, R2          ; file
.text:0000716E                 MOVS    R1, R3          ; buf   结构体指针
.text:00007170                 BLX     lstat           ; 成功0,失败返回-1
.text:00007174                 ADD     R3, SP, #0x78+buf
.text:00007176                 LDR     R2, [R3,#0x10]  ; R2=buf[0x10]
.text:00007178                 MOVS    R3, #0xF000     ; R3=0xF000
.text:0000717C                 ANDS    R3, R2          ; R3=R3&R2=0xF000 & buf[0x10]
.text:0000717E                 LDR     R1, =0xFFFFC000 ; R1=-16384
.text:00007180                 ADDS    R2, R3, R1      ; R2=R3+R1
.text:00007182                 NEGS    R3, R2          ; 求补指令
.text:00007184                 ADCS    R3, R2          ; 带进位加法指令 ADC
.text:00007186                 MOVS    R0, R3          ; 
.text:00007188                 ADD     SP, SP, #0x74
.text:0000718A                 POP     {PC}

但是其中有几条语句:
.text:00007182                 NEGS    R3, R2          ; 求补指令
.text:00007184                 ADCS    R3, R2          ; 带进位加法指令 ADC

不知道怎么还原,请各位帮帮忙,谢谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
juweiping 2014-12-1 19:31
2
0
我来回答一下吧:
The ARM instruction sequence

subs r2, #0x10
negs r0, r2
adcs r0, r2
Is equivalent to

mov r0, (r2 == #0x10)
The above sequence can be rewritten into

subs r2', r2, #0x10
adds r0, #1, not(r2')
adcs r0, r0, r2'
The final step is effectively “store carry flag to r0″, since x + (-x) = 0. The carry flag is set only when not(r2′) == 0xFFFFFFFF, i.e. r2′ = 0. This happens only when r2 == #0x10.

你的语句的意思就是求R0=(R3==16384)
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
longnull 2014-12-1 20:58
3
0
说的非常详细,谢谢!
雪    币: 274
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dunwin 2014-12-1 23:44
4
0
游客
登录 | 注册 方可回帖
返回