免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flightbird
打印 上一主题 下一主题

[函数] 计算函数大小/长度,移动到新位置并执行? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-12-27 15:57 |只看该作者
Create a function calls vector just like the interrupt vector.
The actual address of the function is pointed by the right item of the vector table.

论坛徽章:
0
12 [报告]
发表于 2005-12-27 16:35 |只看该作者

回复 7楼 ktdid 的帖子

为mcu做程序,所以希望不带c库。

另外 unsigned char *p = a; 应该编译不过去吧?

论坛徽章:
0
13 [报告]
发表于 2005-12-27 16:48 |只看该作者
原帖由 kernelxu 于 2005-12-27 15:57 发表
Create a function calls vector just like the interrupt vector.
The actual address of the function is pointed by the right item of the vector table.


In fact, the original function code locate at flash, and I want to copy these code to ram, and execute it. So what you say seems irrelevant with the subject.

论坛徽章:
0
14 [报告]
发表于 2005-12-28 16:20 |只看该作者
原帖由 aero 于 2005-12-27 14:34 发表
&, memcpy, change the EIP register?



在C语言下,你能改变Eip值?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2005-12-28 16:25 |只看该作者
原帖由 mik 于 2005-12-28 16:20 发表



在C语言下,你能改变Eip值?


嵌入汇编呗,嘿嘿。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
16 [报告]
发表于 2005-12-28 16:26 |只看该作者
函数调用不就可以改变EIP吗?

entry = 0x12345678;

((void(*)())entry)(); // 危险

论坛徽章:
0
17 [报告]
发表于 2005-12-28 16:35 |只看该作者
原帖由 flightbird 于 2005-12-27 14:23 发表
如题。

    如果想把一个函数从一个位置转移到另一个位置,并执行之,在c中如何实现?这个问题在汇编中很容易实现。如果想用c来写的话,该如何做?


  1. void f() {
  2. }

  3. void foo(void (*p)()) {
  4.       p();
  5. }


  6. main() {
  7.        void (*p)() = f;
  8.        int i = 0;
  9.        char *pbuf = 0;      

  10.        while (p[i++] != 0xc3);

  11.        pbuf = (char *)malloc(i);

  12.        while (i--)
  13.             *pbuf = *p++;

  14.        foo(pbuf);
  15.       
  16. }
复制代码



这样不知行不行? 很可能不行,.text段里的内容是不可读的。

[ 本帖最后由 mik 于 2005-12-28 16:39 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2005-12-28 16:41 |只看该作者
原帖由 cobras 于 2005-12-28 16:26 发表
函数调用不就可以改变EIP吗?

entry = 0x12345678;

((void(*)())entry)(); // 危险



这样能造型出 0x12345678 EIP值吗?

论坛徽章:
0
19 [报告]
发表于 2005-12-28 16:45 |只看该作者
原帖由 mik 于 2005-12-28 16:41 发表



这样能造型出 0x12345678 EIP值吗?


:)不好意思,没看清楚

论坛徽章:
0
20 [报告]
发表于 2005-12-28 17:13 |只看该作者
.text段可读的啦,不能写而已……
c3是ret指令,找这个字节我也想过,如果函数复杂点,再加上优化等等因素,很难保证函数中间不出现ret
我写的那段freebsd上测试过,unsigned char *p = a;可以编译过去
写成unsigned char *p = (unsigned char *)a;能消除一个警告
还有算长度的时候改成ptrdiff_t diff = (char *)b - (char *)a;好些,不需要b()和a()的类型一致
当然这么计算的前提是,a()和b()依次出现在同一个源文件里,一般而言编译器都会把b放在a后面吧
要是不在一个文件里,那就看链接器了,没保证的,再或者在a()后面加个空函数,又多了些废代码占空间
干脆汇编得了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP