当前位置: 首页 > news >正文

SMC自修改

目录

简介

编写SMC程序

测试patch后的程序

参考


简介

自修改代码(Self-Modified Code)是一类特殊的代码加密技术,即在运行时修改自身代码或数据,从而使得程序实际行为与反汇编结果不符,同时修改前的代码段数据也可能非合法指令,从而无法被反汇编器识别,这加大了软件逆向工程的难度

基本原理是在编译可执行文件时,将需要加密的代码区段(如函数、代码块) 单独编译成一个section(段),并将其标记为可读,可写,不可执行,然后通过某种方法在程序运行的时候将section解密为可执行代码,并将其标记为可读、可执行、不可写,这样就不能直接在内存里面找到加密的代码,从而无法执行或修改加密的代码

SMC的实现方式有很多种,可以通过修改PE文件的Section Header、使用API Hook实现代码加密和解密、使用VMProtect等第三方加密工具等

SMC两种破解方式,第一种是根据静态分析结果直接修改程序二进制文件,第二种则是在动态调试时将解密后的程序从内存中 dump 下来

编写SMC程序

一般smc程序的执行流程(假设关键函数为func)

  1. main函数中获取func函数的地址

  2. 取消func函数处的页面保护

  3. 对func进行解密操作之后再调用func

为了编写smc程序,我们需要进行如下操作

  1. 先写好func函数和main函数中的解密代码(此时不能真正解密,还需要矫正)

  2. 编译后用ida打开exe程序,找到func地址及大小,从而修正主函数的参数

  3. 用ida对func函数进行patch,保存patch后的程序

#include<stdio.h>
#include<Windows.h>
int func(int x, int y) {
    unsigned int z = 0x12345678;
    x = y ^ z;
    y = x ^ z;
    char flag[] = "helloworld";
    printf("%s", flag);
    return x ^ y ^ z;
}
int main() {
    DWORD64 old;
    byte* pfunc = (byte*)func;//函数地址
    VirtualProtect(func,0xE1, PAGE_EXECUTE_READWRITE, &old);//第二个参数为大小,可以编译后通过ida查看得到
    pfunc = pfunc + *(DWORD*)(pfunc+1) + 5;//加上偏移值才是真实func地址+5是由于e9 jmp指令后的四字节是相对偏移
    for (int i = 0; i < 0xE1; i++)//解密操作 也需要修正大小 这里是修正后的
        pfunc[i] ^= 0x12;
​
    func(5, 6);
    return 0;
}

如果直接运行该程序肯定会出错,因为此时相当于对func函数加密而非解密,所以需要用ida进行patch,idapython脚本进行patch

import idc
import ida_bytes
addr=0x140011890
for i in range(0xe1):
    tmp=idc.get_wide_byte(addr)
    ida_bytes.patch_byte(addr,tmp^0x12)
    addr=addr+1

记得保存patch后的程序,再用ida打开patch后的程序,在解密func函数可用脚本解密或下断点动调观察

测试patch后的程序

解密前的func函数,无法正常识别

解密后的func,ida重新识别可反编译

参考

smc动态加密技术

风信子培训smc

相关文章:

  • 二进制安装指定版本的MariaDBv10.11.6
  • 珠算之珠心算观想算盘
  • 基于Python+Vue开发的鲜花商城管理系统源码+运行步骤
  • 深度学习基础:线性代数本质4——矩阵乘法
  • 机器学习之超参数优化(Hyperparameter Optimization)
  • 【leetcode hot 100 23】合并K个有序链表
  • 图像识别技术与应用-YOLO
  • AI日报 - 2025年3月13日
  • Spring Boot 整合 Druid 并开启监控
  • 软件版本号设计
  • IEC61850标准下MMS 缓存报告控制块 ResvTms详细解析
  • 十种处理权重矩阵的方法及数学公式
  • python-leetcode 49.二叉树中的最大路径和
  • 【ES6】ES6中的类
  • 侯捷C++课程学习笔记:构造函数那些事儿(四)
  • 微信h5环境使用开放标签(wx-open-launch-weapp)打开三方小程序
  • 【商城实战(25)】解锁UniApp移动端适配秘籍,打造完美商城体验
  • 第一章:Tailwind CSS基础与项目设置 - 第一节:Tailwind CSS入门 - 核心理念与工作流
  • BGP 规划问题、路由黑洞与环路
  • 面试之《前端常见的设计模式》
  • 美国新泽西客运公司遭遇罢工:40年来首次,35万人受影响
  • 女子七年后才知银行卡被盗刷18万元,警方抓获其前男友
  • 张汝伦:康德和种族主义
  • 北京13日冰雹过后,已受理各险种报案近3万件
  • 日月谭天丨这轮中美关税会谈让台湾社会看清了什么?
  • 美国务卿鲁比奥将前往土耳其参加俄乌会谈