首页
社区
课程
招聘
[原创]写花指令
发表于: 2013-8-16 15:41 12660

[原创]写花指令

2013-8-16 15:41
12660

花指令,就是一串用来迷惑反编译器的汇编指令,它是利用编译器线性扫描算法的缺陷来达到的,比如说反编译器读取到E8(对应CALL汇编码)这机器码,接着会往下读取四个字节的数据作为跳转地址,如果我们在写程序的时候嵌入_asm _emit 0E8,反编译器就会把下一条指令当做地址数据,不管下一条指令的四个字节是地址数据还是操作指令。

在EXE中加入花指令,只要记住程序原入口点,在程序中找个地方写一段保持堆栈平衡的花指令,然后跳转回原入口点,再用PE工具改写下入口点,使花指令开头段为程序入口点。

在源码中加入花指令,可以加个头文件,用定义的方式#define来写,在cpp中包含进来直接使用,下面是一些代码。

//添加花指令开关  注释掉 就可以无花指令调试程序
#define _start_add_FLOWER

#ifndef _start_add_FLOWER
#define _FLOWER_XX0 _asm nop      
#else
#define _FLOWER_XX0 _asm \
{\
_asm jle $+0dh \               //  如果小于或等于 就跳转到当前地址加13的地址
_asm jg $+07h \               //如果大于  就跳转到当前地址加7的地址
_asm _emit 0E8h \                //花指令 程序执行前面两条指令会直接跳转过去,不会执行这条语句,只是迷惑反编译器
#endif

#ifndef _start_add_FLOWER
#define _FLOWER_XX1 _asm nop
#else
#define _FLOWER_XX1 _asm \
{\
   _asm  _emit 090h\        
   _asm _emit 090h \
   _asm _emit 090h \
   _asm pushad\                   //保持堆栈平衡
   _asm jmp $+36h\                //直接跳到popad处 这条指令开始往下数一共有36个字节
   _asm mov ebp,esp \
   _asm push -1 \
   _asm push 112233h \
   _asm push 332211h \
   _asm mov eax,DWORD ptr fs:[0] \
   _asm push eax \
   _asm mov DWORD ptr fs:[0],esp \
   _asm pop eax \
   _asm mov dword ptr fs:[0],eax \
   _asm pop eax \
   _asm pop eax \
   _asm pop eax \
   _asm pop eax \
   _asm mov ebp,eax\
   _asm mov eax,401050h\
   _asm push eax\
    _asm _emit 0xE8\
   _asm retn\
   _asm popad\        // 保持堆栈平衡
}
#endif

……

可以定义从_FLOWER_XX0到_FLOWER_XX9等多个花指令

然后在CPP中使用

void test()
{
_FLOWER_XX0;
printf("you are writing flower_xx0,\n");
_FLOWER_XX1;
printf("you are writing flower_xx1,\n");

……

}

也可以定义花指令组,

#ifndef _start_add_FLOWER
#define _FLOWER_XX_GROUP0
#else
#define _FLOWER_XX_GROUP0 _FLOWER_XX0;_FLOWER_XX1;_FLOWER_XX2

#endif

第一次写,写的不好请见谅。


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

收藏
免费 5
支持
分享
最新回复 (14)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文!~~~
2013-8-16 16:41
0
雪    币: 6
活跃值: (1282)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
QQ就是这个花  不过去花好像没有什么难度
2013-8-16 18:17
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用异常做花效果好一些~~~还可以做一些假的花……
俺发一个花献上

        __try
        {
                _asm mov esi,0
                _asm mov eax,dword ptr ds:[esi]
                _asm push eax
                _asm mov ebp,esp
                _asm push -1
                _asm push 3223
                _asm push 1331131
                _asm mov eax,fs:[0]
                _asm push eax
                _asm mov fs:[0],esp
                _asm pop eax
                _asm mov fs:[0],eax
                _asm pop eax
                _asm pop eax
                _asm pop eax
                _asm pop eax
                _asm mov ebp,eax
                _asm nop
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                _asm nop
        }

这个连ida都能忽悠到~~
2013-8-16 19:24
0
雪    币: 1392
活跃值: (5137)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
5
VC中能直接用$表示当前地址?我这里编译不通过诶
2013-8-16 22:20
0
雪    币: 1392
活跃值: (5137)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=rqqeq;1211218]用异常做花效果好一些~~~还可以做一些假的花……
俺发一个花献上

        __try
        {
                _asm mov esi,0
                _asm mov eax,dword ptr ds:[esi]
                _asm push eax
                _asm mov ebp,esp
                _asm pu...[/QUOTE]

00401048   . /7E 03                 JLE SHORT TestFlow.0040104D
0040104A   . |7F 01                 JG SHORT TestFlow.0040104D
0040104C     |E8                       DB E8
0040104D   > \8B0D F8984000  MOV ECX,DWORD PTR DS:[4098F8]

为什么我这样没有忽悠到OD??
e8直接识别为一个
2013-8-16 22:50
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果你玩过指令级的虚拟机就会知道,异常处理是最不好识别的
像流程指令直接从函数入口一个个读过来就行了
而且异常花可以做假的(比如替换掉一些判断语句)批量处理的后果就是自己代码乱了

流程指令其实也可以忽悠到od……不过比较难……
2013-8-16 23:25
0
雪    币: 14
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
__try
  {
    _asm mov esi,0
    _asm mov eax,dword ptr ds:[esi]
    _asm push eax
    _asm mov ebp,esp
    _asm push -1
    _asm push 3223
    _asm push 1331131
    _asm mov eax,fs:[0]
    _asm push eax
    _asm mov fs:[0],esp
    _asm pop eax
    _asm mov fs:[0],eax
    _asm pop eax
    _asm pop eax
    _asm pop eax
    _asm pop eax
    _asm mov ebp,eax
    _asm nop
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    _asm nop
  }

学习了~
2013-8-19 14:55
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=kgxxx;1212098]__try
  {
    _asm mov esi,0
    _asm mov eax,dword ptr ds:[esi]
    _asm push eax
    _asm mov ebp,esp
    _asm push -1
    _asm push 3223
    _asm...[/QUOTE]

花指令还是要自动生成的爽……不然变变参数做做假花什么的,有经验的人用脚本一下就去掉了
2013-8-19 16:17
0
雪    币: 14
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
用脚本怎么去花指令啊?
2013-8-20 09:14
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你说ida还是od
如果是od的话直接用DeJunk模版即可,不用用到脚本……
2013-8-20 11:31
0
雪    币: 81
活跃值: (100)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
花在od里都没有去的必要一般= =
2013-8-20 14:39
0
雪    币: 14
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
刚试了下  DeJunk模版不行
2013-8-20 16:24
0
雪    币: 14
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
赞同~运行的时候会自动识别出来 跳出花指令
2013-8-20 16:26
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你要自己加啊~~~~
不过这种异常花就不好弄了……弄不好就去掉正常东西了
2013-8-20 16:52
0
游客
登录 | 注册 方可回帖
返回
//