先引用下玩命老大的话:
0.什么是乱序
   乱序就是打乱原来的流程。
   很多朋友逆向程序时,会把一个程序直接丢到IDA里会出现一副流程图。我们现在要做的就是把这副
流程图打乱。但是并不影响原先流程的逻辑。乱序的原理其实比较简单。说白了就是做HOOK然后填充
花指令。最后在跳转会原先的地址。看下我们的代码,

代码:
#include<stdio.h>
typedef void(*My_Main)(void);
typedef void(*My_Main1)(void);
My_Main MyMain;  
My_Main1 MyMain1;
int Addr;
void Func1(void)
{
  printf("Func1\n");
  _asm jmp Addr   //跳回源地址
}
void Func(void)
{
  printf("Func\n");
  MyMain1=&Func1;
  _asm jmp MyMain1  //跳到上面的函数
}
int main(void)
{
  _asm mov esi,ebp  //保存ESP,以便返回到编译器的预处理代码
  MyMain=&Func;
               //这两条汇编代码保存最后个函数返回的地址
  _asm mov eax,a
  _asm mov Addr,eax 
  printf("Main:0x%x\n",MyMain);
  _asm jmp MyMain;
a:
  _asm mov ebp,esi //恢复ESP
  return 0;
}
在看下IDA的流程图