首页
社区
课程
招聘
[求助]关于ARM程序中字符串的偏移量。。。。。
发表于: 2009-7-10 13:00 7801

[求助]关于ARM程序中字符串的偏移量。。。。。

2009-7-10 13:00
7801
先看图:






从图中看到指令为:

.text:00071964                 LDR     R1, =s->Www_

=s->Www_字符串的实际位置在:  00108DDC

指令的机器码为: 78 11 9F E5

E5 9F  是 LDR       11 78 为偏移值,,,,


现在的问题是:  这个 11 78 是怎样计算出来的,,有人知道吗???

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
2
这和ARM处理器的寻址方式有关。字符串一般放在文字池中。

ldr指令中装载的地址是字符串在文字池中的地址相对于当前PC中地址的偏移量。
2009-7-10 13:46
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
3
这个问题问的很好!

因为RISC架构的处理器指令长度固定,所以在寻址的时候经常使用相对距离以节约表示地址的长度。

例如:ARM中的跳转指令,跳转的地址也是相对于当前PC的。
2009-7-10 13:49
0
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个不复杂,楼主的截图没有把关键的地方抓到,
嘻嘻,有空偶写个这方面的东东
2009-7-10 15:25
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

我是想替换掉程序中的一个字符串,,但太长了,,只好找一个空白的地方写入,,然后用 ldr 载入这个这符串,,就是不清楚它的偏移量怎么算,,,真晕,,,




希望加百力版主和楼上的 maxiu 帮帮忙,,谢谢。。。

另外,,有些地方的机器码这样的: 78 10 9F E5

E5 9F  为 LDR   ,, 10 为寄存器 R1  ,,78  才为字符串的偏移量,,,,

..

..
2009-7-10 18:14
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我反编译一个看看再回复你。
2009-7-14 12:43
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不太懂编程,不知道我描述的对不对,因为每条ARM指令占用四个字节,通常ARM程序的字符串的存放规则是这样的,在子程序后面通常会存放着很多调用字符串的指针位置,这个指针所指向的地址就是真正的字符串位置,按楼主的图我给你说明一下,在第二个图的OFF_39EA4双击就到了这个指针的位置,你可以查看它的十六进制值,里面的值所指向的就是真正的字符串位置,此时记下它的地址即目标地址,图中调用的地方是71964,即当前地址,看计算方法:(目标地址-当前地址-8)=未知-71964-8=1178,-8的意思是因为两条指令占用了2*4,修改时,程序调用的地方可以不用改,还是1178,直接修改指针指向字符串新地址就可以了。
2009-7-14 13:15
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
唉,俺也不知道说明白没有。
2009-7-14 13:16
0
雪    币: 195
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
E59F1178 ===> LDR R1, [PC, #0x178]

即用 PC 指针作为基址寄存器寻址,从 PC + 8 + 0x0178 的地址加载数据到 R1 中
2009-7-14 20:41
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢各位的帮助,,刚从外地回来,,打开电脑直奔pediy,,看到有人帮忙了,,真开心,,,谢谢。。。。
2009-7-17 12:44
0
游客
登录 | 注册 方可回帖
返回
//