能力值:
(RANK:510 )
|
-
-
2 楼
这和ARM处理器的寻址方式有关。字符串一般放在文字池中。
ldr指令中装载的地址是字符串在文字池中的地址相对于当前PC中地址的偏移量。
|
能力值:
(RANK:510 )
|
-
-
3 楼
这个问题问的很好!
因为RISC架构的处理器指令长度固定,所以在寻址的时候经常使用相对距离以节约表示地址的长度。
例如:ARM中的跳转指令,跳转的地址也是相对于当前PC的。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这个不复杂,楼主的截图没有把关键的地方抓到,
嘻嘻,有空偶写个这方面的东东
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我是想替换掉程序中的一个字符串,,但太长了,,只好找一个空白的地方写入,,然后用 ldr 载入这个这符串,,就是不清楚它的偏移量怎么算,,,真晕,,,
希望加百力版主和楼上的 maxiu 帮帮忙,,谢谢。。。
另外,,有些地方的机器码这样的: 78 10 9F E5
E5 9F 为 LDR ,, 10 为寄存器 R1 ,,78 才为字符串的偏移量,,,,
..
..
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我反编译一个看看再回复你。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
不太懂编程,不知道我描述的对不对,因为每条ARM指令占用四个字节,通常ARM程序的字符串的存放规则是这样的,在子程序后面通常会存放着很多调用字符串的指针位置,这个指针所指向的地址就是真正的字符串位置,按楼主的图我给你说明一下,在第二个图的OFF_39EA4双击就到了这个指针的位置,你可以查看它的十六进制值,里面的值所指向的就是真正的字符串位置,此时记下它的地址即目标地址,图中调用的地方是71964,即当前地址,看计算方法:(目标地址-当前地址-8)=未知-71964-8=1178,-8的意思是因为两条指令占用了2*4,修改时,程序调用的地方可以不用改,还是1178,直接修改指针指向字符串新地址就可以了。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
唉,俺也不知道说明白没有。
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
E59F1178 ===> LDR R1, [PC, #0x178]
即用 PC 指针作为基址寄存器寻址,从 PC + 8 + 0x0178 的地址加载数据到 R1 中
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
谢谢各位的帮助,,刚从外地回来,,打开电脑直奔pediy,,看到有人帮忙了,,真开心,,,谢谢。。。。
|
|
|