x86花指令

打印 上一主题 下一主题

主题 1875|帖子 1875|积分 5625

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
花指令

参考: https://bbs.kanxue.com/thread-279604.htm#msg_header_h3_21
两种反编译算法
线性扫描算法:逐行反汇编(无法将数据和内容进行区分)
递归进行算法:当遇到分支指令时,会递归进入分支进行反汇编。
简单花指令--跳转
  1. //互补
  2. _asm{
  3.         jnz tag1;
  4.         jz tag1;
  5.         _emit 0xE8;
  6. tag1:
  7. }
  8. //跳转
  9. _asm {
  10.         push ebx;
  11.         xor ebx, ebx;
  12.         test ebx, ebx;
  13.         jnz tag1;  //一定不会跳转,但是可以迷惑递归算法,**递归算法会跳转到0xE8然后解析call指令
  14.         jz tag2;   //一定会跳转
  15. tag1:
  16.         _emit 0xE8;//0xE8 是call的机器码
  17. tag2:
  18.         pop ebx;
  19. }
复制代码
简单花指令--call,ret
用Call构造跳转轻易让动态调试跟丢可以有用的恶心动态调试
  1. //通过call跳转后将压栈的地址去除,达到jmp的效果
  2. _asm{
  3.         call tag1;
  4.         _emit 0x83;
  5. tag1:
  6.         sub esp, 0x8;
  7. }
  8. //通过操控压栈的地址改变将要跳转到地方再ret实现跳转
  9. _asm{
  10.         call tag1;
  11.         _emit 0x83;
  12. tag1:
  13.         add dword ptr ss : [esp] , 0x8;
  14.         ret;
  15.     __emit 0xF3;
  16. }
复制代码
通过JMP和CALL指令结合
  1. _asm{
  2.         call LABEL9;
  3.         _emit 0xE8;
  4.         _emit 0x01;
  5.         _emit 0x00;
  6.         _emit 0x00;
  7.         _emit 0x00;
  8.      LABEL9:
  9.         push eax;
  10.         push ebx;
  11.         lea  eax, dword ptr ds : [ebp - 0x0];
  12.         //将ebp的地址存放于eax        
  13.         add dword ptr ss : [eax-0x50] , 26;
  14.         //该地址存放的值正好是函数返回值,
  15.         //不过该地址并不固定,根据调试所得。
  16.         //加26正好可以跳到下面的mov指令,该值也是调试计算所得
  17.         pop eax;
  18.         pop ebx;
  19.         pop eax;
  20.         jmp eax;
  21.         _emit 0xE8;
  22.         _emit 0x03;
  23.         _emit 0x00;
  24.         _emit 0x00;
  25.         _emit 0x00;
  26.         mov eax,dword ptr ss:[esp-8];
  27.         #将原本的eax值返回eax寄存器
  28.     }
复制代码
其他花指令思绪
1.通过当前标志寄存器状态构造花指令
2.利用函数返回固定值构造跳转条件
3.将特征码插入花指令中用于SMC自解码的搜索解密
  1. _asm{
  2.   Jz Label
  3.   Jnz Label
  4.   _emit 'h'
  5.   _emit 'E'
  6.   _emit 'l'
  7.   _emit 'L'
  8.   _emit 'e'
  9.   _emit 'w'
  10.   _emit 'o'
  11.   _emit 'R'
  12.   _emit 'l'
  13.   _emit 'D'
  14. Label:
  15. }
复制代码
JMP/CALL结归并且用到变量
  1. int a = 0;
  2. __asm {
  3.         push eax;****
  4.         xor eax, eax;
  5.         test eax, eax;
  6.         jnz  LABEL1;
  7.         jz LABEL2;
  8. LABEL1:
  9.         _emit 0xE8;    //与call助记符的机器码相同
  10. LABEL2:
  11.         mov byte ptr[a], 0;****
  12.         call LABEL3;
  13.         _emit 0xFF;     //与adc助记符的字节码相同
  14. LABEL3:
  15.         add dword ptr ss : [esp] , 8;
  16.         ret;
  17.         __emit 0x11;
  18.         mov byte ptr[a], 2;
  19.         pop eax;
  20. }
复制代码
去除花指令
1.花指令一般都是跳转形式,不管是call/ret照旧jcc指令
2.一般会保存环境push和pop出现
一些花指令干扰符号
  1. _asm{
  2.         _emit 0xE8;
  3.         _emit 0xC7;
  4.         _emit 0x21;
  5.         _emit 0xFF;
  6.         _emit 0x11;
  7.         _emit 0xF3;
  8.         _emit 0x83;
  9.         _emit 0x74;
  10.         _emit 0x50;
  11. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表