打印

代码重定位问题!!!

[复制链接]
4058|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
乌月明星稀|  楼主 | 2013-9-25 23:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 乌月明星稀 于 2013-9-25 23:17 编辑

#include "stdio.h"

void a()
{
        printf("This is test!\n");
}

char CodeArr[100];
void main()
{
    char temp;
    char *Pcopy=(char*)a;
    for(temp=0;temp<100;temp++)
    {
            CodeArr[temp]=Pcopy[temp];//代码拷贝
    }
    ((void(*)(void))CodeArr)();    //强制转换为void (*)(void)函数类型
}

我的想法是:将代码a拷贝到CodeArr中,然后用CodeArr强制转换为函数指针,执行到拷贝后的函数中去,但实际会导致整个main进程死掉。

求高手指点,如何用C编译可重定向代码。环境是Windows的C编译器

相关帖子

沙发
zhangmangui| | 2013-9-26 10:12 | 只看该作者
a()的大小不确定  那样拷贝可能会出问题

使用特权

评论回复
板凳
飞鹰嵌入式| | 2013-9-26 17:27 | 只看该作者
没玩过,希望高手过来指点一下

使用特权

评论回复
地板
chess20052006| | 2013-9-26 17:32 | 只看该作者
这个做法也太山寨了,要解析符号表和回填地址的,还要编译器产生可重定位代码,地址不能填死了

使用特权

评论回复
5
aresc| | 2013-9-26 21:47 | 只看该作者
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。

使用特权

评论回复
6
zhangmangui| | 2013-9-26 22:22 | 只看该作者
楼上各位建议很好

使用特权

评论回复
7
msblast| | 2013-9-27 00:17 | 只看该作者
建议先看ais文档

使用特权

评论回复
8
jackcms| | 2013-9-27 10:18 | 只看该作者
谢谢!

使用特权

评论回复
9
乌月明星稀|  楼主 | 2013-9-27 14:17 | 只看该作者
zhangmangui 发表于 2013-9-26 10:12
a()的大小不确定  那样拷贝可能会出问题

但我至少100个字节已经可以确保我所要进入的那个函数已经完全拷贝咯。问题并不出在这里咯。

使用特权

评论回复
10
乌月明星稀|  楼主 | 2013-9-27 14:26 | 只看该作者
chess20052006 发表于 2013-9-26 17:32
这个做法也太山寨了,要解析符号表和回填地址的,还要编译器产生可重定位代码,地址不能填死了 ...

……知识没有山寨这种说法,只有借鉴和使用。
你觉得我是在测试还是在把它当工程在用??
你说的是编译原理的东西?我个人不是很懂,如果可以,能否详实??

使用特权

评论回复
11
乌月明星稀|  楼主 | 2013-9-27 14:29 | 只看该作者
aresc 发表于 2013-9-26 21:47
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。 ...

No,我把它强制转成函数指针类型,那他一般函数时多少位,他就是多少位。

使用特权

评论回复
12
乌月明星稀|  楼主 | 2013-9-27 14:31 | 只看该作者
zhangmangui 发表于 2013-9-26 10:12
a()的大小不确定  那样拷贝可能会出问题

应该知道ARM的boot引导程序吧,原理一样。但他是用汇编的。

使用特权

评论回复
13
ifft| | 2013-9-27 16:28 | 只看该作者
用vs2008编译无法通过的。

使用特权

评论回复
14
ifft| | 2013-9-27 16:49 | 只看该作者
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了

使用特权

评论回复
15
aresc| | 2013-9-28 00:15 | 只看该作者
乌月明星稀 发表于 2013-9-27 14:29
No,我把它强制转成函数指针类型,那他一般函数时多少位,他就是多少位。 ...

假设函数a入口地址必须是16位的,你定义的char codeAddr[]是可以按字节分配,强制转换也是有问题的,能成功应该是其他巧合,比如可能你的char其实也是16位的等等。

使用特权

评论回复
16
easy_tm| | 2013-9-28 13:40 | 只看该作者
通常是给函数a()指定固定的地址,然后剩下的就简单了。。。

使用特权

评论回复
17
乌月明星稀|  楼主 | 2013-9-28 15:22 | 只看该作者
ifft 发表于 2013-9-27 16:28
用vs2008编译无法通过的。

如果无法通过,则做以下调整:(*(void(*)(void))&Code[0])();

使用特权

评论回复
18
乌月明星稀|  楼主 | 2013-9-28 15:27 | 只看该作者
aresc 发表于 2013-9-26 21:47
这个想法是可行的,但是你要注意函数的入口地址是按多少位来算的,像你这样按字节估计不行。 ...

貌似是地址赋值的时候出错,我用反汇编看了一下,a的地址为0x401080,但执行Pcopy后,Pcopy却等于0x401005;在这里出错,为什么!!!如果我直接将地址映射到0x401080那里开始拷贝代码,就能够完成运行。为什么会出现赋值时出问题?现在问题找出来了,新问题又出来了。

使用特权

评论回复
19
乌月明星稀|  楼主 | 2013-9-28 15:28 | 只看该作者
ifft 发表于 2013-9-27 16:49
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了

不会吧???你是怎么做到的???求代码贴出来

使用特权

评论回复
20
zhangmangui| | 2013-9-28 17:46 | 只看该作者
ifft 发表于 2013-9-27 16:49
嘿嘿。我找到了方法。实践证明100字节确实小了。我改成1000就OK了

看到就去实践的人   得真理也

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

127

帖子

1

粉丝