首页
社区
课程
招聘
[讨论]C++中如何在当前代码加入一定量字节的空代码
发表于: 2009-11-29 13:30 5192

[讨论]C++中如何在当前代码加入一定量字节的空代码

2009-11-29 13:30
5192
记得前几天在论坛有个朋友问:C++中如何在当前代码加入一定量字节的空代码?当时我一听就想到用内嵌汇编中的_emit伪指令:
      __asm
{
     _emit 0x90
     _emit 0x90
     _emit 0x90
     ......

     但是,如果要嵌入大量的空代码呢?比如100字节。难道要写100条_emit 0x90指令吗?有没有更好的方法能在代码段嵌入大量的空代码呢?我写了一个程序试验了一下,但最终都没法实现... 现在发个帖子跟大家讨论一下,怎么才能实现这个功能。希望大虾们能提供一个好的方法或者思路
     下面是我试验的C代码:
#include <stdio.h>
#pragma comment(linker,"/section:.text,rwe")
int main()
{
     printf("开始\n");
     __asm
{
//   int 3
     call XX
XX:
     pop edi
     sub edi, 5
     mov ecx, 0x64 //(十进制100)
     mov eax, 0x90
     rep stosb
     //到这一步, eip指向地址处指令被nop掉了
}
     printf("结束\n");
     return 0;
}

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

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
嘿嘿~~··
2009-11-29 13:56
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哈哈 2楼现身了
2009-11-29 14:00
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
我写驱动写的电脑报废了
2009-11-29 14:01
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
怎么不在虚拟机上调试?
2009-11-29 14:08
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
开不起DNF........
2009-11-29 14:10
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
问题解决了没
2009-11-29 14:15
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没有啊... 解决了也不会在这里求助了
2009-11-29 14:18
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
我现在的方法是先做好一个生成工具,生成N句 _emit XXXX,然后把生成的代码直接拷贝到我的代码里面........................
2009-11-29 14:19
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
难道除了使用_emit就没别的方法了吗?我想按照上面代码的思路,把rep stosb指令的机器码压进堆栈,借助ret指令(pop esp to eip)去执行rep stosb指令,可惜失败了
2009-11-29 14:29
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
不懂~~~~~~~~
2009-11-29 14:32
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我想让__asm{...}这里面指令 等效于 __asm{_emit 0x90 ......}
2009-11-29 14:32
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
VC++6.0里内嵌ASM汇编文件里用
  Value_1     DB    64h   dup(90h)
可以做到。我想类似的把汇编代码内嵌到C语言代码里也可以吧。
你可以试试。
2009-11-29 14:49
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢怀特迈恩啊
但我不想用宏汇编,我只想用VC内联汇编实现,难道内联汇编的局限性就这么大吗?
2009-11-29 15:02
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
有两点供楼主参考:
  1.楼主一定要填90吗? NOP等效指令可以吗?如7字节的lea esp,[esp],这样可以加快速度
  2.楼主可以用宏来简化,示例如下:

  #define NOP2BLK __asm nop __asm nop
  #define NOP4BLK NOP2BLK NOP2BLK
  #define NOP8BLK NOP4BLK NOP4BLK
  #define NOP16BLK NOP8BLK NOP8BLK
  #define NOP32BLK NOP16BLK NOP16BLK
  #define NOP64BLK NOP32BLK NOP32BLK

  void test()
  {   //一次填64个NOP
      NOP64BLK
      //一次填96个NOP,在__asm块中也可以用
      __asm{
        NOP64BLK NOP32BLK
      }
  }
2009-11-29 16:42
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
楼上好思维,我刚也在MSDN上看到了宏
2009-11-29 16:45
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
15楼威武,这办法不错。
2009-11-29 17:03
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习下·呵呵
2009-11-29 17:17
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
哈哈
半道出家厉害哈~ 就使用宏了
2009-11-30 11:05
0
游客
登录 | 注册 方可回帖
返回
//