飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4466|回复: 4

SMC的学习!

[复制链接]
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-6-2 17:42:38 | 显示全部楼层 |阅读模式
    本帖最后由 whypro 于 2010-6-2 18:32 编辑

    SMC是什么意思?它的英文名叫“Self Modifying Code”,顾名思义,就是“代码自修改”
    先来个简单的,来改数据
    代码:
    CString cs1,cs2;
    cs1="123456789";
    cs2="abcdefghi";
    __asm
    {
      mov esi,cs1//A函数地址
      mov edi,cs2//B函数地址
      mov ecx,9h
      rep movsb
    }
    MessageBox(cs2);
    通过MOVSB命令来改变数据
    下面来看怎样代码:
    代码:
    void CSMCDlg::OnOK()
    {
      msgboxB();
      BOOL (CSMCDlg::*pa)(void)=&CSMCDlg::msgboxA;
      BOOL (CSMCDlg::*pb)(void)=&CSMCDlg::msgboxB;
         __asm
         {
           mov esi,pa
           mov edi,pb
          mov ecx,pb
          sub ecx,esi//长度要注意,这里因为A.B写得很近所以可以这样得出
          rep movsb
        }
      msgboxB();  
    }
    BOOL CSMCDlg::msgboxA()
    {  
      ::MessageBox(m_hWnd,"123456789","LILI",0);
      return true;
    }
    BOOL CSMCDlg::msgboxB()
    {
      ::MessageBox(m_hWnd,"987654321","LILI",0);
      return true;
    }
    #pragma comment(linker, "/SECTION:.text,ERW")//.text段一定要改成可读写
    这就是SMC的基本原理,用一段代码来覆盖别一段代码(注意代码的长度)
    希望大家给点建议!
    SMC.rar (26.69 KB, 下载次数: 2)
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-6-2 18:51:47 | 显示全部楼层
    高手啊~膜拜~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-6-2 19:27:49 | 显示全部楼层
    一回来就膜拜啊~高手~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-6-2 19:43:58 | 显示全部楼层
    W兄能在壳上使劲打SMC的
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2010-6-2 19:43:58 | 显示全部楼层
    本帖最后由 whypro 于 2010-6-2 19:46 编辑

    ;FASM汇编 自修改 SMC 代码测试

    format pe console
    entry start
    include 'F:\fasmw\INCLUDE\WIN32AXP.INC'
    ;include 'Win32AXP.inc'
    ;include 'List.inc'

    section '.text' code readable writeable executable ;确保代码段有写入权限,必须的

    start:
      call  f1
      call  f2

      ;memcpy(f1.Start,f2.Start,f2.CodeLen)
      mov  esi,f2.Start
      mov  edi,f1.Start
      mov  ecx,f2.End-f2.Start
      rep  movsb
      
      ;再次调用f1和f2
      call  f1
      call  f2

      ret

    f1:
    .Start=$
      cinvoke  printf,buf1
      ret
    .End=$
      ;确保有足够的空间来存放f2的代码
      repeat  (f2.End-f2.Start)-(f1.End-f1.Start)
        nop
      end  repeat

    f2:
    .Start=$
      cinvoke  printf,buf2
      ret
    .End=$

    data import
      library  msvcrt,'msvcrt.dll'
      import  msvcrt,\
        printf,'printf'
    end data


    buf1  db  "SMC 前",0dh,0ah,0
    buf2  db  "SMC 后",0dh,0ah,0
    smc.zip (395 Bytes, 下载次数: 0)
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表