SMC代码自修改逆向分析(仅针对汇编语言分析)


title: SMC代码自修改逆向分析
category: 逆向


写在前面

  1. 加密代码在文末附件
  2. 用到的idc解密脚本:
#include <idc.idc>

static xor_setp1(){
    auto addr = 0x00414c3c;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414C7F;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x7D);   //异或的数字根据情况修改
    }
}

static xor_setp2(){
    auto addr = 0x00414be0;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414C3A;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x43);   //异或的数字根据情况修改
    }
}

static xor_setp3(){
    auto addr = 0x00414a84;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414a84 + 347;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x55);   //异或的数字根据情况修改
    }
}

static xor_setp4(){
    auto addr = 0x00414a30;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414a30 + 83;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x4D);   //异或的数字根据情况修改
    }
}

static main()
{
	xor_setp1();
}

实验分析

第一层

  1. 用IDA打开7-3的实验练习.exe,进入主函数如下图所示:
    在这里插入图片描述
  2. 主函数第一部分,主要的功能是按要求输入一串字符,并判断字符串长度是否等于28,如果不等于则输出"Try again……",等于28则入下一模块
lea     eax, [ebp+Str]   
push    eax
push    offset a100s    ; "%100s"
call    _scanf
add     esp, 8
lea     ecx, [ebp+Str]
push    ecx             ; Str
call    _strlen
add     esp, 4
mov     [ebp+var_4], eax
cmp     [ebp+var_4], 1Ch (28)
jz      short loc_40107F

在这里插入图片描述

  1. 接下来是判断字符串的最后一位(除\n)是否为7Dh("}"),如果不是则将eax置零并返回,之后跳转到最终的栈销毁操作。是则进入下一模块
    在这里插入图片描述
  2. 之后是for循环,条件为对byte_414C3C数组的前67个元素循环,在循环内部:
mov     edx, [ebp+var_70]
movsx   eax, byte_414C3C[edx]
xor     eax, 7Dh               //将byte_414C3C数组前67位元素每一位都异或7Dh(加密)
mov     ecx, [ebp+var_70]
mov     byte_414C3C[ecx], al        //异或结果覆盖原来的值
jmp     short loc_401095   

循环结束后:

loc_4010BC:
mov     dword ptr [ebp-6Ch], offset byte_414C3C //将byte_414C3C数组赋给dword ptr 					[ebp-6Ch]
mov     esi, esp
push    offset unk_414BE0       //将unk414BE0也就是下一层加密代码的地址压入栈
lea     edx, [ebp+Str]
push    edx
call    dword ptr [ebp-6Ch]
add     esp, 8
cmp     esi, esp
call    __chkesp
jmp     short loc_4010E1  

loc_4010E1:
xor     eax, eax     //返回结果eax=0
  1. 了解第一层结构后对第一层代码进行解密,双击byte_414C3C查看内容,推测为SMC加密代码,长度为67,起始地址为00414C3C,结束地址为00414C7F
    在这里插入图片描述
  2. 利用IDA执行idc解密脚本
#include <idc.idc>

static xor_setp1(){
    auto addr = 0x00414c3c;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414C7F;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x7D);   //异或的数字根据情况修改
    }
}
static main()
{
	xor_setp1();
}

点击File->Script file,打开解密脚本在这里插入图片描述
解密后byte_414C3C变为:
在这里插入图片描述
按快捷键C将字符串转换为汇编语言:
在这里插入图片描述
右键loc_414C3C,点击create function将汇编语言转换为函数,使其可以进行F5反汇编:
在这里插入图片描述
结果如下:
在这里插入图片描述
发现其逻辑为判断前五个字符是否为"flag{",不是则跳转到loc_414C7B,返回eax=0,是则进入loc_414C64,分析如下:

xor     byte ptr [ecx+edx], 43h      //将byte数组前90位逐位异或43h
inc     ecx							 //循环变量自增
cmp     ecx, 90               		 //循环条件:byte数组前90位
jl      short loc_414C64             // 即jump less指令,ecx小于90则跳转,do-while循环
add     eax, 5                
push    offset unk_414A84            //将偏移量unk_414A84压入栈,该地址对应的是第三层SMC函数地址
push    eax
call    edx
pop     ecx
pop     ecx

回到第一层main函数内给出的第二层自加密第二层代码:

loc_4010BC:
mov     dword ptr [ebp-6Ch], offset sub_414C3C
mov     esi, esp
push    offset unk_414BE0        //这里unk_414BE0嵌套在sub_414C3C,分析知为第二层的地址
lea     edx, [ebp+Str]
push    edx
call    dword ptr [ebp-6Ch]
add     esp, 8
cmp     esi, esp
call    __chkesp
jmp     short loc_4010E1

下面对unk_414BE0分析

第二层

  1. 双击unk_414BE0,如下:
    在这里插入图片描述
    根据代码格式推测为SMC,字符串起始位置的地址为00414BE0,结束地址为00414C3B。对unk_414BE0进行解密,使用idc脚本
#include <idc.idc>
static xor_setp2(){
    auto addr = 0x00414be0;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414C3A;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x43);   //异或的数字根据情况修改
    }
}
static main()
{
	xor_setp2();
}

解密后:
在这里插入图片描述
按快捷键C转换为汇编语言:
在这里插入图片描述
右键create function得汇编函数,进行分析:

.data:00414BE0 sub_414BE0      proc near               ; DATA XREF: _main_0+B5↑o
.data:00414BE0
.data:00414BE0 var_8           = dword ptr -8
.data:00414BE0 var_4           = byte ptr -4
.data:00414BE0 arg_0           = dword ptr  8
.data:00414BE0 arg_4           = dword ptr  0Ch
.data:00414BE0
.data:00414BE0                 push    ebp
.data:00414BE1                 mov     ebp, esp
.data:00414BE3                 push    ecx
.data:00414BE4                 push    ecx
.data:00414BE5                 push    ebx
.data:00414BE6                 mov     ebx, [ebp+arg_0]
.data:00414BE9                 lea     eax, [ebp+var_8]
.data:00414BEC                 push    esi
.data:00414BED                 push    edi
.data:00414BEE                 xor     edx, edx           //edx变量置0
.data:00414BF0                 mov     [ebp+var_8], 93A9A498h  //[ebp+var_8]设 
.data:00414BF7                 mov     edi, ebx     			//为-1817598824
.data:00414BF9                 mov     [ebp+var_4], dl
.data:00414BFC                 mov     esi, edx
.data:00414BFE                 sub     edi, eax     //edi减去eax结果存入edi   
.data:00414C00
.data:00414C00 loc_414C00:                             ; CODE XREF: sub_414BE0+32↓j
.data:00414C00                 lea     ecx, [ebp+var_8]
.data:00414C03                 add     ecx, esi   		//将ecx,esi相加
.data:00414C05                 mov     al, [edi+ecx] //将edi和ecx对应的数赋给al寄存器
.data:00414C08                 xor     al, 0CCh      //al 异或0CCh
.data:00414C0A                 cmp     al, [ecx]     //判断al的值是否和
.data:00414C0C                 jnz     short loc_414C31  //这里为while循环的标志,如果不相等跳到loc_414C31进行栈销毁,否则进入循环内部
.data:00414C0E                 inc     esi           //esi自增
.data:00414C0F                 cmp     esi, 4        //判断esi是否和4相等
.data:00414C12                 jl      short loc_414C00   //如果esi小于4则进行下一层,否则进入if语句内部
.data:00414C14                 mov     ecx, [ebp+arg_4]
.data:00414C17
.data:00414C17 loc_414C17:                             ; CODE XREF: sub_414BE0+42↓j
.data:00414C17                 xor     byte ptr [edx+ecx], 55h  //将edx和ecx相加的结果与55h异或
.data:00414C1B                 inc     edx     //edx自增
.data:00414C1C                 cmp     edx, 15Bh        //循环变量edx和15BH比较
.data:00414C22                 jl      short loc_414C17  //do-while循环入口,如果edx小于15BH则进入循环,跳转到loc_414C17,否则跳出循环
.data:00414C24                 lea     eax, [ebx+4]   //ebx参数和4相加存入eax
.data:00414C27                 push    offset unk_414A30  //将地址unk_414A30压入栈传入下面的ecx
.data:00414C2C                 push    eax     
.data:00414C2D                 call    ecx      //调用ecx函数
.data:00414C2F                 pop     ecx
.data:00414C30                 pop     ecx
.data:00414C31
.data:00414C31 loc_414C31:                             ; CODE XREF: sub_414BE0+2C↑j
.data:00414C31                 pop     edi
.data:00414C32                 pop     esi
.data:00414C33                 xor     eax, eax
.data:00414C35                 pop     ebx
.data:00414C36                 mov     esp, ebp
.data:00414C38                 pop     ebp
.data:00414C39                 retn
.data:00414C39 sub_414BE0      endp
.data:00414C39

根据分析可知while代码执行的条件为: *(a1+v3)^0xCC == (&v5+v3), 也就是输入的字符异或0xCC对应与v5中的数0x93A9A498相等,求得字符为_ehT, 由于与输入的字符顺序相反,故输入的第6-9个字符为The_

回到第二层sub_414C3C函数,对于传入的地址unk_414A84进行分析

第三层

  1. 双击unk_414A84
    在这里插入图片描述
  2. 分析代码逻辑为SMC自加密,同理使用idc脚本:
#include <idc.idc>

static xor_setp3(){
    auto addr = 0x00414a84;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414a84 + 347;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x55);   //异或的数字根据情况修改
    }
}
static main()
{
	xor_setp3();
}

解密结果为:
在这里插入图片描述
按快捷键C转换为汇编语言:
在这里插入图片描述
右键点击create function转换为函数:
在这里插入图片描述
发现出现很多诸如"A-Z",“a-z”,“0-9"以及结尾出现的”="推测进行的是base64加密,分析汇编语言结构:前几个loc函数都有cmp和jle等循环标志,继续分析,注意到

.data:00414AD2                 mov     dword ptr [ebp+var_10], 'hVmc'
.data:00414AD9                 mov     dword ptr [ebp+var_10+4], '0NEb'
.data:00414AE0                 mov     dword ptr [ebp+var_10+8], '=8lR'
.data:00414AE7                 stosd
.data:00414AE8                 mov     [ebp+var_10+0Ch], cl
.data:00414AEB                 stosd
.data:00414AEC                 mov     edi, ecx

这里传入了固定字符串"cmVhbEN0Rl8="推测为flag的第10到17位,接下来的几个loc函数为base64的右移运算部分。在函数的末尾,注意到
在这里插入图片描述
dl和固定字符串在while循环内进行了相等判断,同时可以用OD进行动态运行该程序到第三个函数随便输入的字符串加密后的结果仍为固定字符串,因此对字符串base64解密得:realCtF_,如果比较正确后则对sub_414A30函数解密并编译,即该程序的第三层嵌套:
回到第二层给出的地址 unk_414A30,进入下一层分析

第四层

  1. 双击unk_414A30查看
    在这里插入图片描述

同理分析其为SMC自加密,使用idc脚本解密:

#include <idc.idc>

static xor_setp4(){
    auto addr = 0x00414a30;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414a30 + 83;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x4D);   //异或的数字根据情况修改
    }
}
static main()
{
	xor_setp4();
}

解密结果:
在这里插入图片描述

按快捷键C转换为汇编代码:
在这里插入图片描述
右键create function生成汇编函数:
在这里插入图片描述
分析逻辑,注意到函数压入了6FF22h,68344360h,7574766Bh,转换为字符串为"kvtu`C4h\"o",在loc_414A55函数中,edx自增后,将byte ptr [ebp+edx+var_C]和bl(之前存入得三串字符串)判断是否相等,并且如果不相等则跳转到本身,分析为while循环,在循环内部,edi减去了esi,而esi为参数地址,edi为字符串,而在loc_414A68中又进行了dec ecx即ecx自减,可知逻辑为将参数地址所有的字符减1和字符串比较,所以输入的字符串应该为"just_B3g!n"。

总结

综上所述,flag为 :flag{The_realCtF_just_B3g!n}

附件

链接:https://pan.baidu.com/s/1WsgS9GHjbZOjjS6YuJiYhQ
提取码:j2km

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
软件加密技术内幕 要花时间看 第1章 PE文件格式深入研究 1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative Virtual Addresses) 1.1.3 数据目录 1.1.4 输入函数(Importing Functions) 1.2 PE文件结构 1.2.1 The MS-DOS头部 1.2.2 IMAGE_NT_HEADERS头部 1.2.3 区块表(The Section Table) 1.2.4 各种块(Sections)的描述 1.2.5 输出表 1.2.6 输出转向(Export Forwarding) 1.2.7 输入表 1.2.8 绑定输入(Bound import) 1.2.9 延迟装入数据(Delayload Data) 1.2.10 资源 1.2.11 基址重定位(Base Relocations) 1.2.12 调试目录(DebugDirectory) 1.2.13 NET头部 1.2.14 TLS初始化 1.2.15 程序异常数据 第2章 PE分析工具编写 2.1 文件格式检查 2.2 FileHeader和OptionalHeader内容的读取 2.3 得到数据目录(Data Dircetory)信息 2.4 得到块表(SectionTable)信息 2.5 得到输出表(ExportTable)信息 2.6 得到输入表(ImportTable)信息 第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 Windows下的异常处理 4.1 基本概念 4.1.1 Windows下的软件异常 4.1.2 未公开的可靠吗 4.2 结构化异常处理(SEH) 4.2.1 异常处理的基本过程 4.2.2 SEH的分类 4.2.3 相关API 4.2.4 SEH相关数据结构 4.3 异常处理程序设计 4.3.1 顶层(top-level)异常处理 4.3.2 线程异常处理 4.3.3 异常处理的堆栈展开(Stack unwind) 4.3.4 异常处理程序设计中的几个注意事项: 4.4 SEH的简单应用 4.4.1 Win9x下利用SEH进ring0 4.4.2 利用SEH实现对自身的单步自跟踪 4.4.3 其它应用 4.5 系统背后的秘密 4.6 VC是如何封装系统提供的SEH机制的 4.6.1 扩展的EXCEPTION_REGISTRATION级相关结构 4.6.2 数据结构组织 4.7 Windows XP下的向量化异常处理(VEH) 第5章 软件加密技术 5.1 反调试技术(Anti-Debug) 5.1.1 句柄检测 5.1.2 SoftICE后门指令 5.1.3 int68子类型 5.1.4 ICECream子类型 5.1.5 判断NTICE服务是否运行 5.1.6 INT 1 检测 5.1.7 利用UnhandledExceptionFilter检测 5.1.8 INT 41子类型 5.2 反跟踪技术(Anti-Trace) 5.2.1 断点检测 5.2.2 利用SEH反跟踪 5.2.3 SMC技术实现 5.3 反加载技术(Anti-Loader) 5.3.1 利用TEB检测 5.3.2 利用IsDebuggerPresent函数检测 5.3.3 检查父进程 5.4 反DUMP技术(Anti
[Trial version] 加密解密技术内幕.htm [Trial version] 目录.htm [Trial version] 第1章 PE文件格式深入研究 [Trial version] 1.1 PE文件格式格式纵览 [Trial version] PE文件格式一览.html [Trial version] 1.2 PE文件结构 [Trial version] 1. 检验PE文件的有效性.html [Trial version] 2. File Header (文件头).html [Trial version] 3. Optional Header.html [Trial version] 4. Section Table(节表).html [Trial version] 5. Import Table(引入表).html [Trial version] 6. Export Table(引出表).html [Trial version] 7.Debug信息节.htm [Trial version] DocNet 学习笔记之Anti ILDASM 研究.htm [Trial version] PE 档的基底重定位(Base Relocations).htm [Trial version] PE 格式学习总结(一)-- PE文件概述.htm [Trial version] PE 格式学习总结(二)-- PE文件中的输出函数.htm [Trial version] PE 格式学习总结(三)-- PE文件中的输入函数.htm [Trial version] PE 格式学习总结(四)-- PE文件中的资源.htm [Trial version] TLS.htm [Trial version] 基址从定位.htm [Trial version] 异常处理.htm [Trial version] 第2章 PE分析工具编写 [Trial version] 关于PE可执行文件的修改.htm [Trial version] 手工构造一个超微型的 PE 文件.htm [Trial version] 第3章 Win32 调试API [Trial version] 病毒是如何抗动态测试.htm [Trial version] 3.1 Win32调试API原理 [Trial version] Win32调试API第一部分.htm [Trial version] Win32调试API第二部分.htm [Trial version] Win32调试API第三部分.htm [Trial version] Win32调试API学习心得(一).htm [Trial version] Win32调试API学习心得(二).htm [Trial version] win32调试API学习心得(三).htm [Trial version] 用调试函数跟踪API.htm [Trial version] 3.2 利用调试API编写脱壳机 [Trial version] DEF分析与打造其脱壳软件----我的一篇析文.htm [Trial version] 用调试函数跟踪API.htm [Trial version] 3.3 利用调试API制作内存补丁 [Trial version] 利用DebugAPI做一些原先手工完成的动作,我用这种方法做过内存补丁,内存注册机等,完全VC编译.htm [Trial version] 第4章 Windows下的异常处理 [Trial version] 4.1 基本概念 [Trial version] SEH基本概念.htm [Trial version] 什么是异常.htm [Trial version] 4.2 结构化异常处理(SEH) [Trial version] 初步实战演习.htm [Trial version] 4.3 异常处理程序设计 [Trial version] 传递给异常处理例程的参数.htm [Trial version] 异常处理的堆栈展开.htm [Trial version] 4.4 SEH的简单应用 [Trial version] Win9x下利用SEH进ring0.htm [Trial version] 利用SEH实现对自身的单步自跟踪.htm [Trial version] 异常死亡进程的自动复活.htm [Trial version] 用 SEH 技术实现 API Hook.htm [Trial version] 4.6 VC是如何封装系统提供的SEH机制的 [Trial version] VC++编译器怎么实现异常处理.htm [Trial version] 4.7 Windows XP下的向量化异常处理(VEH [Trial version] windows XP下的向量化异常处理.htm [Trial version] 第5章 软件加密技术 [Trial version] 5.1 反调试技术(Anti-Debug) [Trial version] 5.1.1 句柄检测.htm [Trial version] 5.1.4 ICECream子类型.htm [Trial version] 5.1.5 判断NTICE服务是否运行.htm [Trial version] anti-debug技术探讨.htm [Trial version] AntiSoftICE.htm [Trial version] VB中实现检测ICE.htm [Trial version] 测试ICE是否在运行.htm [Trial version] 检测debugger的方法补遗.htm [Trial version] 另外一种检测SOFTICE的方法.htm [Trial version] 通过PEB实现AntiDebug.htm [Trial version] 5.2 反跟踪技术(Anti-Trace) [Trial version] tELock中的SEH反跟踪代码.htm [Trial version] 利用SEH改变程序流程以达到反跟踪的目的.htm [Trial version] 5.2.3 SMC技术实现 [Trial version] 浅析SMC技术.htm [Trial version] 5.3 反加载技术(Anti-Loader) [Trial version] VB anti-loader 2种常用方法介绍.htm [Trial version] 5.3.1 利用TEB检测 [Trial version] 浅谈利用 TEB 实现的反跟踪.htm [Trial version] 5.4 反DUMP技术(Anti-Dump) [Trial version] 理论知识.htm [Trial version] 5.5 文件完整性检验 [Trial version] PE 头部校验和(checksum)的计算.htm [Trial version] 5.5.1 CRC校验实现 [Trial version] 矛与盾的较量(1)——CRC原理篇.htm [Trial version] 矛与盾的较量(2)——CRC实践篇.htm [Trial version] 5.7 反静态分析技术 [Trial version] Fooling Disassemblers.htm [Trial version] 5.7.2 花指令 [Trial version] 矛与盾的较量(1)——花指令.htm [Trial version] 5.8 代码与数据结合技术 [Trial version] 与破解过招,保护你的共享软件.htm [Trial version] 5.9 软件保护的若干忠告 [Trial version] WIN下动态注册码实现方法.htm [Trial version] 安全程序设计.htm [Trial version] 如何用简单方法防止破解.htm [Trial version] 第6章 加壳软件编写 [Trial version] 6.1 外壳编写基础 [Trial version] 加壳软件实现.htm [Trial version] 6.2 加壳程序综合运用的实例 [Trial version] 浅谈壳的加载步骤及手动脱壳。.htm [Trial version] 第7章 如何让壳与程序融为一体 [Trial version] 7.2 欺骗检查壳的工具 [Trial version] 让侦测工具把壳识别为VC++.htm [Trial version] 7.4 使用sdk把程序和壳溶为一体 [Trial version] 实现调用加壳的外壳中的子程序的一点见解.htm [Trial version] 7.5 后记关于壳和程序的思考 [Trial version] 加壳技术探讨-加壳时处理IAT.htm [Trial version] 第8章 Visual Basic 6 逆向工程 [Trial version] VB的Native Code的传奇.htm [Trial version] VB网址大全.htm [Trial version] Visual Basic 6 逆向工程与反逆向工程 (1).htm [Trial version] Visual Basic 6 逆向工程与反逆向工程 (2).htm [Trial version] 《真是想不到系列》.htm [Trial version] 关于VB P-CODE的一些总结.htm [Trial version] 关于在VB中进行COM组件的开发(一、了解COM).htm [Trial version] 未公开API函数揭秘--通用对话框.htm [Trial version] VB与COM [Trial version] 如何用VB6写COM组件(一).htm [Trial version] 如何用VB6写COM组件(二).htm [Trial version] 附录A 在Visual C++中使用内联汇编 [Trial version] Visual C++ 内嵌汇编.htm [Trial version] Visual C++ 内嵌汇编二.htm [Trial version] 附录B 在Visual Basic中使用汇编 [Trial version] 完全用VB进行ASM编程的示例.htm [Trial version] 附录C COM技术 [Trial version] 《COM 原理与应用》学习笔记 - 第一部分 COM原理.htm [Trial version] 附录D 通过崩溃地址找出出错的代码行 [Trial version] 如何通过崩溃地址找到出错的代码行.htm [Trial version] 附录E 堆栈修正 [Trial version] 堆栈修正.htm
第1章 PE文件格式深入研究<br/><br/>1.1 PE文件格式格式纵览<br/><br/> 1.1.1 区块(Section)<br/><br/> 1.1.2 相对虚拟地址(Relative Virtual Addresses)<br/><br/> 1.1.3 数据目录<br/><br/> 1.1.4 输入函数(Importing Functions)<br/><br/>1.2 PE文件结构<br/><br/> 1.2.1 The MS-DOS头部<br/><br/> 1.2.2 IMAGE_NT_HEADERS头部<br/><br/> 1.2.3 区块表(The Section Table)<br/><br/> 1.2.4 各种块(Sections)的描述<br/><br/> 1.2.5 输出表<br/><br/> 1.2.6 输出转向(Export Forwarding)<br/><br/> 1.2.7 输入表<br/><br/> 1.2.8 绑定输入(Bound import)<br/><br/> 1.2.9 延迟装入数据(Delayload Data)<br/><br/> 1.2.10 资源<br/><br/> 1.2.11 基址重定位(Base Relocations)<br/><br/> 1.2.12 调试目录(DebugDirectory)<br/><br/> 1.2.13 NET头部<br/><br/> 1.2.14 TLS初始化<br/><br/> 1.2.15 程序异常数据<br/><br/> <br/><br/>第2章 PE分析工具编写<br/><br/>2.1 文件格式检查<br/><br/>2.2 FileHeader和OptionalHeader内容的读取<br/><br/>2.3 得到数据目录(Data Dircetory)信息<br/><br/>2.4 得到块表(SectionTable)信息<br/><br/>2.5 得到输出表(ExportTable)信息<br/><br/>2.6 得到输入表(ImportTable)信息<br/><br/> <br/><br/>第3章 Win32 调试API<br/><br/>3.1 Win32调试API原理<br/><br/> 3.1.1 调试相关函数简要说明<br/><br/> 3.1.2 调试事件<br/><br/> 3.1.3 如何在调试时创建并跟踪一个进程<br/><br/> 3.1.4 最主要的循环体<br/><br/> 3.1.5 如何处理调试事件<br/><br/> 3.1.6 线程环境详解<br/><br/> 3.1.7 如何在另一个进程中注入代码<br/><br/>3.2 利用调试API编写脱壳机<br/><br/> 3.2.1 tElock 0.98脱壳简介<br/><br/> 3.2.2 脱壳机的编写<br/><br/>3.3 利用调试API制作内存补丁<br/><br/> 3.3.1 跨进程内存存取机制<br/><br/> 3.3.2 Debug API机制<br/><br/> <br/><br/>第4章 Windows下的异常处理<br/><br/>4.1 基本概念<br/><br/> 4.1.1 Windows下的软件异常<br/><br/> 4.1.2 未公开的可靠吗<br/><br/>4.2 结构化异常处理(SEH)<br/><br/> 4.2.1 异常处理的基本过程<br/><br/> 4.2.2 SEH的分类<br/><br/> 4.2.3 相关API<br/><br/> 4.2.4 SEH相关数据结构<br/><br/>4.3 异常处理程序设计<br/><br/> 4.3.1 顶层(top-level)异常处理<br/><br/> 4.3.2 线程异常处理<br/><br/> 4.3.3 异常处理的堆栈展开(Stack unwind)<br/><br/> 4.3.4 异常处理程序设计中的几个注意事项:<br/><br/>4.4 SEH的简单应用<br/><br/> 4.4.1 Win9x下利用SEH进ring0<br/><br/> 4.4.2 利用SEH实现对自身的单步自跟踪<br/><br/> 4.4.3 其它应用<br/><br/>4.5 系统背后的秘密<br/><br/>4.6 VC是如何封装系统提供的SEH机制的<br/><br/> 4.6.1 扩展的EXCEPTION_REGISTRATION级相关结构<br/><br/> 4.6.2 数据结构组织<br/><br/>4.7 Windows XP下的向量化异常处理(VEH)<br/><br/> <br/><br/> <br/><br/>第5章 软件加密技术<br/><br/>5.1 反调试技术(Anti-Debug)<br/><br/> 5.1.1 句柄检测<br/><br/> 5.1.2 SoftICE后门指令<br/><br/> 5.1.3 int68子类型<br/><br/> 5.1.4 ICECream子类型<br/><br/> 5.1.5 判断NTICE服务是否运行<br/><br/> 5.1.6 INT 1 检测<br/><br/> 5.1.7 利用UnhandledExceptionFilter检测<br/><br/> 5.1.8 INT 41子类型<br/><br/>5.2 反跟踪技术(Anti-Trace)<br/><br/> 5.2.1 断点检测<br/><br/> 5.2.2 利用SEH反跟踪<br/><br/> 5.2.3 SMC技术实现<br/><br/>5.3 反加载技术(Anti-Loader)<br/><br/> 5.3.1 利用TEB检测<br/><br/> 5.3.2 利用IsDebuggerPresent函数检测<br/><br/> 5.3.3 检查父进程<br/><br/>5.4 反DUMP技术(Anti-Dump)<br/><br/>5.5 文件完整性检验<br/><br/> 5.5.1 CRC校验实现<br/><br/> 5.5.2 校验和(Checksum)<br/><br/> 5.5.3 内存映像校验<br/><br/>5.6 反监视技术(Anti-Monitor)<br/><br/> 5.6.1 窗口方法检测<br/><br/> 5.6.2 句柄检测<br/><br/>5.7 反静态分析技术<br/><br/> 5.7.1 扰乱汇编代码<br/><br/> 5.7.2 花指令<br/><br/> 5.7.3 信息隐藏<br/><br/>5.8 代码与数据结合技术<br/><br/>5.9 软件保护的若干忠告<br/><br/> <br/><br/>第6章 加壳软件编写<br/><br/>6.1 外壳编写基础<br/><br/> 6.1.1 判断文件是否是PE格式的EXE文件<br/><br/> 6.1.2 文件基本数据的读入<br/><br/> 6.1.3 额外数据保留<br/><br/> 6.1.4 重定位数据的去除<br/><br/> 6.1.5 文件的压缩<br/><br/> 6.1.6 资源区块的处理<br/><br/> 6.1.7 区块的融合<br/><br/> 6.1.8 输入表的处理<br/><br/> 6.1.9 外壳部分的编写<br/><br/> 6.1.10 将外壳部分添加至原程序<br/><br/> 6.1.10 小结<br/><br/>6.2 加壳程序综合运用的实例<br/><br/> 6.2.1 程序简介<br/><br/> 6.2.2 加壳子程序(WJQ_ShellBegin())<br/><br/> 6.2.3 PE外壳程序<br/><br/> 6.2.4 加进Anti技术<br/><br/> 6.2.5 通过外壳修改被加壳PE<br/><br/> 6.2.6 VC++调用汇编子程序<br/><br/> <br/><br/>第7章 如何让壳与程序融为一体<br/><br/>7.1 序<br/><br/> 7.1.1 为何需要壳和程序一体化<br/><br/> 7.1.2 为阅读此章节需要的知识<br/><br/> 7.1.3 基于此章节用的的例子程序说明<br/><br/>7.2 欺骗检查壳的工具<br/><br/> 7.2.1 fi是如何检查壳的<br/><br/> 7.2.2 欺骗fi<br/><br/>7.3 判断自己是否给脱壳了<br/><br/> 7.3.1 判断文件尺寸<br/><br/> 7.3.2 检查标记<br/><br/> 7.3.3 外部检测(使用dll)<br/><br/> 7.3.4 hook 相关的api(防止loader和调试api)<br/><br/>7.4 使用sdk把程序和壳溶为一体<br/><br/> 7.4.1 sdk的意义<br/><br/> 7.4.2 做一个带sdk的壳<br/><br/>7.5 后记:关于壳和程序的思考<br/><br/> <br/><br/> <br/><br/>第8章 Visual Basic 6 逆向工程<br/><br/>8.1 简介<br/><br/>8.2 P-code传奇<br/><br/>8.3 VB编译奥秘<br/><br/>8.4 VB与COM<br/><br/>8.5 VB可执行程序结构研究<br/><br/>8.6 VB程序事件解读<br/><br/>8.7 VB程序图形界面(GUI)解读 <br/><br/>8.8 VB程序执行代码研究<br/><br/>8.9 我们的工具<br/><br/>8.10 VB程序保护篇<br/><br/> <br/><br/>附录A 在Visual C++中使用内联汇编<br/><br/>附录B 在Visual Basic中使用汇编<br/>
chm格式,目录如下。 第1章 PE文件格式深入研究 1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative Virtual Addresses) 1.1.3 数据目录 1.1.4 输入函数(Importing Functions) 1.2 PE文件结构 1.2.1 The MS-DOS头部 1.2.2 IMAGE_NT_HEADERS头部 1.2.3 区块表(The Section Table) 1.2.4 各种块(Sections)的描述 1.2.5 输出表 1.2.6 输出转向(Export Forwarding) 1.2.7 输入表 1.2.8 绑定输入(Bound import) 1.2.9 延迟装入数据(Delayload Data) 1.2.10 资源 1.2.11 基址重定位(Base Relocations) 1.2.12 调试目录(DebugDirectory) 1.2.13 NET头部 1.2.14 TLS初始化 1.2.15 程序异常数据 第2章 PE分析工具编写 2.1 文件格式检查 2.2 FileHeader和OptionalHeader内容的读取 2.3 得到数据目录(Data Dircetory)信息 2.4 得到块表(SectionTable)信息 2.5 得到输出表(ExportTable)信息 2.6 得到输入表(ImportTable)信息 第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 Windows下的异常处理 4.1 基本概念 4.1.1 Windows下的软件异常 4.1.2 未公开的可靠吗 4.2 结构化异常处理(SEH) 4.2.1 异常处理的基本过程 4.2.2 SEH的分类 4.2.3 相关API 4.2.4 SEH相关数据结构 4.3 异常处理程序设计 4.3.1 顶层(top-level)异常处理 4.3.2 线程异常处理 4.3.3 异常处理的堆栈展开(Stack unwind) 4.3.4 异常处理程序设计中的几个注意事项: 4.4 SEH的简单应用 4.4.1 Win9x下利用SEH进ring0 4.4.2 利用SEH实现对自身的单步自跟踪 4.4.3 其它应用 4.5 系统背后的秘密 4.6 VC是如何封装系统提供的SEH机制的 4.6.1 扩展的EXCEPTION_REGISTRATION级相关结构 4.6.2 数据结构组织 4.7 Windows XP下的向量化异常处理(VEH) 第5章 软件加密技术 5.1 反调试技术(Anti-Debug) 5.1.1 句柄检测 5.1.2 SoftICE后门指令 5.1.3 int68子类型 5.1.4 ICECream子类型 5.1.5 判断NTICE服务是否运行 5.1.6 INT 1 检测 5.1.7 利用UnhandledExceptionFilter检测 5.1.8 INT 41子类型 5.2 反跟踪技术(Anti-Trace) 5.2.1 断点检测 5.2.2 利用SEH反跟踪 5.2.3 SMC技术实现 5.3 反加载技术(Anti-Loader) 5.3.1 利用TEB检测 5.3.2 利用IsDebuggerPresent函数检测 5.3.3 检查父进程 5.4 反DUMP技术(Anti-Dump) 5.5 文件完整性检验 5.5.1 CRC校验实现 5.5.2 校验和(Checksum) 5.5.3 内存映像校验 5.6 反监视技术(Anti-Monitor) 5.6.1 窗口方法检测 5.6.2 句柄检测 5.7 反静态分析技术 5.7.1 扰乱汇编代码 5.7.2 花指令 5.7.3 信息隐藏 5.8 代码与数据结合技术 5.9 软件保护的若干忠告 第6章 加壳软件编写 6.1 外壳编写基础 6.1.1 判断文件是否是PE格式的EXE文件 6.1.2 文件基本数据的读入 6.1.3 额外数据保留 6.1.4 重定位数据的去除 6.1.5 文件的压缩 6.1.6 资源区块的处理 6.1.7 区块的融合 6.1.8 输入表的处理 6.1.9 外壳部分的编写 6.1.10 将外壳部分添加至原程序 6.1.10 小结 6.2 加壳程序综合运用的实例 6.2.1 程序简介 6.2.2 加壳子程序(WJQ_ShellBegin()) 6.2.3 PE外壳程序 6.2.4 加进Anti技术 6.2.5 通过外壳修改被加壳PE 6.2.6 VC++调用汇编子程序 第7章 如何让壳与程序融为一体 7.1 序 7.1.1 为何需要壳和程序一体化 7.1.2 为阅读此章节需要的知识 7.1.3 基于此章节用的的例子程序说明 7.2 欺骗检查壳的工具 7.2.1 fi是如何检查壳的 7.2.2 欺骗fi 7.3 判断自己是否给脱壳了 7.3.1 判断文件尺寸 7.3.2 检查标记 7.3.3 外部检测(使用dll) 7.3.4 hook 相关的api(防止loader和调试api) 7.4 使用sdk把程序和壳溶为一体 7.4.1 sdk的意义 7.4.2 做一个带sdk的壳 7.5 后记:关于壳和程序的思考 第8章 Visual Basic 6 逆向工程 8.1 简介 8.2 P-code传奇 8.3 VB编译奥秘 8.4 VB与COM 8.5 VB可执行程序结构研究 8.6 VB程序事件解读 8.7 VB程序图形界面(GUI)解读 8.8 VB程序执行代码研究 8.9 我们的工具 8.10 VB程序保护篇 附录A 在Visual C++中使用内联汇编 附录B 在Visual Basic中使用汇编
光盘: ├─chap01....................................第1章 PE文件格式的深入分析 │ └─PEDump.zip ;Matt Pietrek的PEDUMP程序 │ ├─chap02....................................第2章 PE分析工具编写 │ ├─PEInfo_example ;PE分析工具样例 │ └─Test ;TestSH.exe,这个程序的OptionalHeader的大小为0xD0 │ ├─chap03....................................第3章 Win32 调试API │ ├─内存补丁 │ │ ├─进程间内存共享机制应用.txt │ │ ├─使用Dr X调试寄存器框架程序.txt │ │ └─bpm example code ;yoda的实例,演示利用Ntdll.ntcontinue作为跳板在入口点处中断 │ └─脱壳机 │ ├─Unlock.asm ;脱壳机的源程序 │ ├─unlock.exe ;己编译好的脱壳机程序 │ └─locked.exe ;被tElock 0.98保护的记事本程序 │ ├─chap04....................................第4章 Windows下的异常处理 │ ├─sehRelease │ │ ├─sehdef.inc ;完整的异常代码列表 │ │ ├─s1.asm ;例子1.演示Final型异常处理及参数获取 │ │ ├─s2.asm ;例子2.演示Per_Thread型异常处理 │ │ ├─s3.asm ;例子3.演示Per_Thread型异常处理的嵌套处理 │ │ └─S4.ASM ;例子4.演示异常处理的堆栈展开 │ ├─ring ;例子5.演示Windows9x进特权级Ring0 │ ├─singlestep ;例子6.演示SEH实现单步自跟踪 │ └─veh ;例子7.VEH代码演示 │ ├─chap05....................................第5章 反跟踪技术 │ ├─Anti-Debug ;5.1 反调试技术 │ │ ├─MeltICE ;句柄检测 │ │ ├─Back Door ;SoftICE后门指令 │ │ ├─int 68 ;int68子类型 │ │ ├─ICECream ;ICECream子类型 │ │ ├─NticeService ;判断NTICE服务是否运行 │ │ ├─int1 ;INT 1 检测 │ │ ├─UnhandledExceptionFilter ;利用UnhandledExceptionFilter检测 │ │ └─int41 ;INT 41子类型 │ ├─DetectBreakpoint ;5.2 断点检测技术 │ │ ├─SEHbpx ;利用SEH防范BPX断点 │ │ ├─SEHbpm ;利用SEH防范BPM断点 │ │ └─IsBPX ;检测函数首地址 │ ├─Anti-Loader ;5.3 反加载技术 │ │ ├─TEB ;利用TEB检测 │ │ ├─IsDebuggerPresent ;利用IsDebuggerPresent函数检测 │ │ └─CheckParentProc ;检查父进程 │ ├─Anti-Monitor ;5.4 反监视技术 │ │ ├─AntiProcDump ;窗口方法检测ProcDump │ │ └─Anti-Filemon&Regmon ;句柄检测Filemon和Regmon │ ├─Anti-Disassemble ;5.5 反静态分析技术 │ │ ├─pushre ;扰乱汇编代码 │ │ ├─SMC ;SMC技术实现 │ │ └─花指令 ;花指令样例 │ ├─CRC ;5.7 文件完整性校验 │ │ ├─磁盘文件校验 │ │ │ ├─add2crc32 ;计算文件CRC32的工具,可以将结果写进文件里 │ │ │ └─crc32 ;待校验的程序 │ │ ├─内存映像校验 │ │ │ ├─memcrc32 │ │ │ │ └─src │ │ │ │ ├─add2memcrc32 ;计算PE文件代码区块CRC32的工具,可以将结果写进文件里 │ │ │ │ └─memcrc32 ;需要校验内存代码数据的程序 │ │ │ └─Detect Breakpoint ;校验内存中的片段代码的样例 │ │ └─CRC原理 ;arbin翻译的《CRC原理及其逆向分析方法》 │ └─codeEncrypt ;5.8 代码与数据结合技术 │ ├─codeEncrypt ;代码与数据结合的实例 │ └─tools ;Encrypter.exe工具及其源码 │ ├─Chap06....................................第6章 加壳软件编写 │ ├─prot ;本章实例加壳工具prot v0.46及其源码 │ ├─aPLib引擎 ;aPLib压缩引擎 │ └─TestUseVC ;Spring的加壳程序综合运用的实例 │ ├─Chap07....................................第7章 如何让壳与程序融为一体 │ ├─7.1 欺骗检查壳的工具 │ │ ├─aspack212压缩 │ │ ├─aspack212压缩后更改入口代码 │ │ ├─aspack压缩后再修改过的壳加壳 │ │ ├─aspack压缩后再自己加壳 │ │ ├─实例(没加壳) │ │ ├─自己加的壳 │ │ ├─自己的加壳工具 │ │ │ ├─原版壳的程序 │ │ │ └─更改后的壳的程序程序 │ │ └─tools │ │ ├─fi ;测试用的FileInfo工具 │ │ └─aspack212 ;测试用的Aspack加壳工具 │ ├─7.2判断自己是否给脱壳 │ │ ├─7.2.1 判断文件尺寸 │ │ ├─7.2.4 使用存储映像文件检查标记 │ │ ├─7.2.2 使用同步对象检查标记 │ │ ├─7.2.3 使用原子(ATOM)检查标记 │ │ ├─7.2.5 使用线程优先权检查标记 │ │ ├─7.2.6 使用外部文件检查标记 │ │ └─7.2.8 注入一个定时器 │ └─7.3 使用SDK把程序和壳溶为一体 │ ├─test ;实例 │ └─sdk壳的程序 │ ├─chap08....................................第8章 Visual Basic 6 逆向工程 │ ├─example1 ;演示虚函数表的概念 │ ├─example2 ;如何处理事件的虚函数表 │ ├─example3 ;利用SEH反加载 │ ├─example4 ;演示如何更改程序结构 │ ├─example5 ;本例简单说明了如何直接修改vb6程序的控件属性值 │ ├─example6 ;一个VB6 P-code Crackme分析实例 │ └─example7 ;VB“自锁”功能实现的实例 │ ├─附录A.....................................附录A 在Visual C++中使用内联汇编 │ ├─InlineASM ;内联汇编实例 │ └─SeparateASM ;VC 中调用 MASM 独立汇编实例 │ └─附录B.....................................附录B 在Visual Basic中使用汇编 ├─TweakVB ;TweakVB 控件(http://www.tweakvb.com/) ├─VBInlineAsm ;VBInlineAsm控件 └─Compile Controller ;Compile Controller控件 ;(http://www.fawcette.com/archives/premier/mgznarch/vbpj/1999/11nov99/jc1199/jc1199.asp)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y1seco

我们都在慢慢进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值