根据提供的文件信息,我们可以推断出这是一段与软件逆向工程相关的脚本代码,具体而言,它涉及到了一种称为“VMP脱壳”的过程。VMP(Virtual Machine Protection)是一种常用的软件保护技术,用于在运行时动态地解密代码,并通过虚拟机执行这些解密后的代码,从而增加破解难度。而“脱壳”则是指去除这类保护层的过程,让被保护程序恢复到其未加壳状态的一种技术。 ### 关键知识点解析 #### 1. **脚本目的** - **目标**:从标题和描述来看,该脚本由一位被称为“德国大神”的开发者编写,旨在帮助其他逆向工程师或安全研究人员实现对采用VMP技术保护的程序进行分析和研究。 - **应用场景**:通常应用于软件安全领域,特别是针对那些使用了VMP技术保护其核心代码或逻辑的商业软件、游戏等,以便于对其进行漏洞发现、功能研究或是合法的逆向工程活动。 #### 2. **关键指令解析** - **BC / BPMC / BPHWC / dbh**:这些命令似乎是自定义或者非标准的指令,可能是特定于某个逆向工具或者是作者自己定义的一套指令集。它们的具体含义无法直接从上下文中推断出来,但可以推测这些命令可能涉及到内存操作、数据处理等方面。 - **callVAR / pause**:`callVAR` 可能是调用一个预先定义好的函数或过程,`pause` 则表示暂停执行,通常用于调试时手动控制程序执行流程。 - **GPIEXEFILENAME / movEXEFILENAME / lenEXEFILENAME**:这些指令用于获取当前被执行文件的完整路径,并计算该路径的长度。其中,“GPI”可能是“Get Process Information”的缩写,即获取进程信息。 - **scmpi / je / msg**:这些指令用于比较字符串并基于比较结果执行跳转操作或显示消息。例如,`scmpi[testsec],"exe"` 会比较指定内存地址中的内容是否为 "exe",如果是,则执行 `jeFOUNDEND` 跳转到标号 `FOUNDEND` 处。 - **alloc / free**:分别代表分配和释放内存空间的操作。 - **GPICURRENTDIR / GPICURRENTDIR / GMAPROCESSNAME**:这些指令用于获取当前目录、进程名等信息,以及通过进程名映射得到模块基地址。 - **mov / add / sub / cmp / je / jne / jmp**:这些是常见的处理器指令,用于数据移动、算术运算、条件判断和跳转等操作。 #### 3. **脚本流程概述** - **文件检查**:首先检查加载的文件是否为 DLL 或 EXE 文件格式,如果不是则提示错误并退出。 - **获取当前目录和进程名**:然后获取当前工作目录和当前进程名。 - **名称标准化**:对进程名进行处理,将其中包含的空格替换为下划线,同时去掉点号(`.`),使得名称更符合某些系统的要求。 - **模块基地址获取**:利用处理后的进程名获取其模块基地址。 - **内存操作**:读取 PE 头信息,计算各个段的大小和位置,为进一步分析做准备。 ### 总结 这段脚本提供了一个基础框架来识别和处理受 VMP 保护的文件。通过对文件类型的初步验证、获取关键的文件信息以及进行必要的内存操作,为后续更深入的分析奠定了基础。需要注意的是,由于使用的指令集较为特殊且上下文信息有限,对于初学者来说理解这段代码可能存在一定难度。因此,在实践中还需要结合实际经验和相关文档资料来进行深入学习。
BPMC
BPHWC
dbh
//////////////////////////////
call VAR
pause
//////////////////////////////
GPI EXEFILENAME
mov EXEFILENAME, $RESULT
len EXEFILENAME
mov EXEFILENAME_COUNT, $RESULT
sub EXEFILENAME_COUNT, 03
alloc 1000
mov testsec, $RESULT
mov [testsec], EXEFILENAME
add testsec, EXEFILENAME_COUNT
scmpi [testsec], "exe"
je FOUNDEND
scmpi [testsec], "EXE"
je FOUNDEND
scmpi [testsec], "dll"
je FOUNDEND
scmpi [testsec], "DLL"
je FOUNDEND
msg "Your loaded file is no DLL or Exe so fix this and try it again!"
pause
ret
//////////////////////////////
FOUNDEND:
str CHAR
mov CHAR, CHAR
sub testsec, EXEFILENAME_COUNT
free testsec
GPI CURRENTDIR
mov CURRENTDIR, $RESULT
GPI PROCESSNAME
mov PROCESSNAME, $RESULT
mov PROCESSNAME_2, $RESULT
len PROCESSNAME
mov PROCESSNAME_COUNT, $RESULT
buf PROCESSNAME_COUNT
alloc 1000
mov PROCESSNAME_FREE_SPACE, $RESULT
mov PROCESSNAME_FREE_SPACE_2, $RESULT
mov EIP_STORE, eip
mov eip, PROCESSNAME_FREE_SPACE
mov [PROCESSNAME_FREE_SPACE], PROCESSNAME
//////////////////////////////
PROCESSNAME_CHECK:
cmp [PROCESSNAME_FREE_SPACE],00
je PROCESSNAME_CHECK_02
cmp [PROCESSNAME_FREE_SPACE],#20#, 01
je PROCESSNAME_CHECK_01
cmp [PROCESSNAME_FREE_SPACE],#2E#, 01
je PROCESSNAME_CHECK_01
inc PROCESSNAME_FREE_SPACE
jmp PROCESSNAME_CHECK
//////////////////////////////
剩余91页未读,继续阅读
- 黄林1990092021-03-12一点反应都没有
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- asm-西电微机原理实验
- Arduino-arduino
- C语言-leetcode题解之70-climbing-stairs.c
- C语言-leetcode题解之68-text-justification.c
- C语言-leetcode题解之66-plus-one.c
- C语言-leetcode题解之64-minimum-path-sum.c
- C语言-leetcode题解之63-unique-paths-ii.c
- C语言-leetcode题解之62-unique-paths.c
- C语言-leetcode题解之61-rotate-list.c
- C语言-leetcode题解之59-spiral-matrix-ii.c