我的PE程序加密核心代码(MASM 6.0

《Windows PE》第一章 PE学习环境搭建 可以看出,当程序调试的时候,如果修改了 test1.asm,也就是说test1.obj的文件时间比test1.asm 要早,就需要重新执行步骤(1)和(4)。隐含规则不能有依赖文件,所以下面没有内容,例子中的第17、18行定义了从 asm文件建立obj文件的隐含规则,第19和20行定义了从rc文件建立res文件的隐含规则,隐含规则中无法指定确定的输入文件名,因为输入文件名是泛指的有相同扩展名的一整类文件,这时候就要用到几个特殊的内定宏来指定文件名,这些宏是$@,$*, $?为了能存放自己编写的汇编代码。 阅读详情
;=======================我的加密程序 2.5版ASM源程序================
;本程序是将被加壳到被加密的程序中的主要部分
;2.5版的程序将处理原程序中的输入表的修正工作
;==================================================================
;程序主要流程
;    1.进行反动态跟踪,破坏INT1.检测是否有跟踪程序存在
;    2.修正原程序的输入表
;    3.加载mkey.dll
;    4.在mkey.dll中查找名为error 的过程
;    5.运行error过程
;    6.返回到原程序
;
;===================================================================

        
        .486
        .model flat, stdcall
        option casemap :none  ; case sensitive

INCLUDE        E:/masm32/INCLUDE/windows.inc
INCLUDE        E:/masm32/INCLUDE/kernel32.inc
INCLUDE        E:/masm32/INCLUDE/user32.inc
           
includelib     E:/masm32/lib/kernel32.lib
includelib        E:/masm32/lib/user32.lib
;==============================================================================
;自定义过程
RVAtoAddr proto  :DWORD ;将相对地址(RVA)转化为内存实际地址
SetprocAddr proto :DWORD,:DWORD  ;取出每一个DLL中的涵数名,将正确地址写入FirstThunk中


DEBUG=FALSE
;=============================================================================

.code     ;代码开始           
start:  ;--------------------------------------------------
;在以下段占写入程序的代码;           
            call      @1
           
data1:
            ver db        1    ;
            main_ver db        2
            sub_ver db        5
        impRVA dd 4a000h  ;输入表地址,装配时需修改
        impSize dd 1c14h ;输入表的大小,装配时需修改
        imagebase dd 60000h  ;被加入代码段的RVA,装配时需修改

        
            call_ep dd        0c1e92h  ;被加壳程序的入口经计算后的值,装配时需修改
            key dd        0b8420000h          ;加密的密码经计算后的值,装配时需修改
        diskey dd 0  ;是否用钥匙盘的变量,为0时不用,1为A:,2为B:,装配时需修改
            hdll dd        ?  ;保存DLL句柄的变量
        lpszfmt db "%s%s",0
            dll_name db        "mkey.dll",0
            error db        "错误",0
            caption1 db        "mkey.dll 没有找到!",0
        lpszKNL db "KERNEL32.DLL",0
        lpszGetVer db "GetVersion",0
            call_name db        "Error",0
        lpszLoadError db "程序启动时出错!",0
        lpszError db "找不到所需的 .DLL 文件 - ",0
        sint1 dd ?
            int1    dd        ?

IF DEBUG
        d_caption        db "测试",0
        d_sz        db "现在处于调试状态,请修改程序section(节表)的属性(改为0XE0000020),不然就会出现非法操作",0
        d_sz1        db "现在开始修正输入表",0
ENDIF
           
           
           
      @1:
            pop      EBX

IF DEBUG
        pusha
        push MB_OK
        lea eax,[offset d_caption-data1][ebx]
        push eax
        lea eax,[offset d_sz-data1][ebx]
        push eax
        push 0
        call MessageBox
        popa

ELSE


            call      anti_debug
ENDIF
        mov    eax,ebx
        mov edx,[offset imagebase-data1][ebx]
        sub eax,edx
        sub eax,5h
        mov [offset imagebase-data1][ebx],eax ;将计算后的载入基址存入变量imagebase中
        mov eax,[offset impRVA-data1][ebx]
        invoke RVAtoAddr,eax
        mov [offset impRVA-data1][ebx],eax
        call import ;修正原程序的输入表

            lea      ECX,[OFFSET dll_name-data1][EBX]
            invoke LoadLibraryA,ecx ;加载mkey.dll
        .if eax==0      ;加载不成功
                  push      MB_OK
              LEa      EAX,[OFFSET error-data1][ebx]
            push      EAX
            lea      EAX,[OFFSET caption1-data1][ebx]
            push      EAX
            push      0 
            call MessageBoxA ;显示错误信息框
            push      0
            call    ExitProcess  ;退出
        .endif

IF DEBUG
ELSE
            call      deint
ENDIF
            mov      dword PTR[OFFSET hdll-data1][EBX],EAX           
            lea      ECX,[OFFSET call_name-data1][EBX]
            push      ECX
            push      EAX
                         
            call      GetProcAddress  ;取得DLL中显示对话框的函数
            .if eax!=0
                    mov      EDX,[OFFSET key-data1][EBX]
            push      EDX
            mov edx,[offset diskey-data1][ebx]
            push edx
            call      EAX
        .endif           
freelibrary:
            mov      EAX,dword PTR[OFFSET hdll-data1][EBX]
            push      EAX
            call      FreeLibrary      ;卸载mkey.dll

            call      bw            ;防bw2000
IF DEBUG
ELSE
              mov      edx,[offset int1-data1][EBX]
          mov      ecx,[offset sint1-data1][ebx ]
              mov      [edx],ecx            ;修改INT1中断门,破坏跟踪环境
ENDIF
            mov      EAX,dword PTR[OFFSET call_ep-data1][EBX]
        xor    eax,80586h
        invoke RVAtoAddr,eax
        push      eax ;计算出原程序的入口值,压入堆栈
           
            ret
           
;----------------------------------------------------------
;以下用于编写一些反跟踪的代码:
            anti_debug:
                call      trw
                
                ret           
;-----------------------------------------------------------
;防TRW,SOFTICE等的反跟踪:
            trw:
                push      EdX
                sidt      [esp-2]
                pop      edx
                add      edx,8
        mov      dword PTR[OFFSET int1-data1][EBX],EdX                
            ret
;------------------------------------------------------------
;防bw2000找入口点:
              bw:
                lea edx, [OFFSET lpszKNL-data1][ebx]
        push edx
        call GetModuleHandle
                lea ecx,[offset lpszGetVer-data1][ebx]
        push ecx
        push eax
        call GetProcAddress
                cmp word ptr[eax],30cdh
                jnz nobw2000
        mov eax,0bff70451h
        jmp dword ptr[eax]
                    ;退出                             
                               
  nobw2000:
        ret
  deint: 
                  mov      edx,[offset int1-data1][EBX]
                    mov      ecx,[edx]
              mov      dword ptr[offset sint1-data1][ebx],ecx   
                  add      dword ptr[edx],2
              ret
           
  ;-----------------------------------------------------------------------------------------------------
  ;以下为重载原程序的输入表内的涵数地址
  import proc uses eax ecx edi edx
IF DEBUG
        pusha
        push MB_OK
        lea eax,[offset d_caption-data1][ebx]
        push eax
        lea eax,[offset d_sz1-data1][ebx]
        push eax
        push 0
        call MessageBox
        popa
ENDIF
        
        mov edi,[offset impRVA-data1][ebx]
        mov ecx,[offset impSize-data1][ebx]
        xor edx,edx
        assume edi:ptr IMAGE_IMPORT_DESCRIPTOR   
        .while !([edi].OriginalFirstThunk==0 && [edi].TimeDateStamp==0 && [edi].ForwarderChain==0 && [edi].Name1==0 && [edi].FirstThunk==0)
            .if edx>=ecx
                jmp impend
            .endif
            mov eax,[edi].Name1
            invoke RVAtoAddr,eax
            mov esi,eax
            push edx
IF DEBUG
            pusha
            push MB_OK
            push eax
            lea eax,[offset d_sz1-data1][ebx]
            push eax
            push 0
            call MessageBox
            popa
ENDIF
            invoke GetModuleHandle,esi
            .if eax==0
                invoke LoadLibraryA,esi
                .if eax==0
                    push esi
                    lea eax,[offset lpszError-data1][ebx]
                    push eax
                    lea eax,[offset lpszfmt-data1][ebx]
                    push eax
                    lea eax,[offset dll_name-data1][ebx]
                    push eax
                    call wsprintf

                    push MB_ICONEXCLAMATION+MB_OK
                    mov eax,[offset lpszLoadError-data1][ebx]
                    push eax
                    mov eax,[offset dll_name-data1][ebx]
                    push eax
                    push NULL
                    call MessageBox
                    invoke ExitProcess,NULL

                .endif
            .endif
            mov dword ptr[esi],0
            mov [offset hdll-data1][ebx],eax
            mov eax,[edi].FirstThunk
            invoke RVAtoAddr,eax
            push eax                    ;FirstThunk的偏移量压栈,
            .if [edi].OriginalFirstThunk!=0      ;有的连接器会将OriginalFirstThunk的值置0,这时取FirstThunk所指的数组的值指向涵数名
                mov eax,[edi].OriginalFirstThunk
                invoke RVAtoAddr,eax
                push eax                  ;OriginalFirstThunk的偏移量压栈,这时eax所指数组的值指向IMAGE_IMPORT_BY_NAME
            .else
                push eax    ;这时eax所指数组的值指向IMAGE_IMPORT_BY_NAME
            .endif
            call SetprocAddr
            pop edx
            add edx,sizeof IMAGE_IMPORT_DESCRIPTOR
            add edi,sizeof IMAGE_IMPORT_DESCRIPTOR
        .endw
impend:

      ret
import endp

RVAtoAddr proc  RVA:DWORD
    mov eax,RVA
    ADD eax,DWORD PTR[offset imagebase-data1][ebx]
    ret
RVAtoAddr endp
           
SetprocAddr proc uses edi ecx esi edx naddr:DWORD ,faddr:DWORD

        mov edi,naddr
        mov esi,faddr
        .while DWORD PTR[edi]!=0
            .if dword ptr[edi]&80000000h ;判断涵数是以序号方式引入,还是用名称的方式引入。
                mov eax,dword ptr[edi]
                and eax,7fffffffh ;得到引入函数的序号
                push eax
            .else
                mov eax,DWORD PTR[edi]
                invoke RVAtoAddr,eax            
                assume eax:ptr IMAGE_IMPORT_BY_NAME

                IF DEBUG
                    pusha
                    push MB_OK
                    lea ecx,[offset d_sz1-data1][ebx]
                    push ecx
                    lea ecx,[eax].Name1
                    push ecx
                    push 0
                    call MessageBox
                    popa
                ENDIF

                lea ecx,[eax].Name1    
                push ecx
                push ecx
            .endif

                mov ecx,[offset hdll-data1][ebx]
                push ecx
            call GetProcAddress
            .if eax==0
                lea eax,[offset lpszLoadError-data1][ebx]
                push MB_ICONEXCLAMATION+MB_OK
                push eax
                push eax
                push 0
                call MessageBox
                invoke ExitProcess,0
            .endif
            .if !(dword ptr[edi] & 80000000h)
                pop ecx
                mov DWORD PTR[ecx-2],0
            .endif
            mov DWORD PTR[esi],eax
            add esi,sizeof IMAGE_THUNK_DATA
            add edi,sizeof IMAGE_THUNK_DATA
          .endw

        ret
SetprocAddr endp
           
           
;----------------------------------------------------------
           
        END    start 
 
汇编语言MASM masm6.0 汇编语言MASM  MASM 6.0是1991年推出的,支持80486处理器,它对MASM 进行重新组织,并提供了许多类似高级语言的新特点。MASM 6.0之后又有一些改进,微软又推出MASM 6.11,利用它的免费补丁程序可以升级到MASM 6.14,支持到Pentium III指令系统。 立即下载

相关推荐

MASM6.0集成汇编环境

MASM6.0集成汇编开发环境,可视化编辑

汇编软件MASM和调试工具DEBUG的使用

第一部分 汇编软件MASM简介 (备注:MASM汇编软件不区分大小写字母) 1.1 MASM简介 汇编就是把汇编语言编写的源代码(扩展名为.asm)翻译成计算机能够识别的二进制语言序列,目前常用的汇编程序是MASM,简称宏汇编程序。宏汇编程序目前有两个版本MASM5.0和MASM6.0 汇编步骤: 第一步:将源程序翻译成等价的二进制语言,形成的文件扩展名为.obj 备注: 用MASM5

NullObject 6726

MASM6.0安装文件

微软的宏汇编器MASM6.0,需要的可以研究一下,主要针对dos汇编

《Windows PE权威指南》学习之第1章 Windows PE开发环境

本章首先要为大家详细介绍学习Windows PE所需要的软件开发环境,以及相关辅助软件的使用方法。然后利用我们搭建的开发环境开发第一个基于MASM32的汇编程序,并通过字节码阅读器初步认识本书中的主人公——PE文件。

chenyijun的专栏 3127

汇编语言编译器masm6.0

汇编语言编译器masm6.0是学习汇编不可或缺的工具

MASM6.0(Microsoft ASM)

MASM6.0文件,包含TASM中的Turbo Debuger 调试工具 最小,功能最强的汇编编译器

[读书][笔记]WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解

文章目录前言1.1 开发语言MASM321.1.1 设置开发环境1.1.2 开发第一个源程序HelloWorld.asm 前言 1.1 开发语言MASM32 1.1.1 设置开发环境 1.1.2 开发第一个源程序HelloWorld.asm

二次元怪兽的博客 4767

masm 6.0+汇编工具集合

masm编程必备工具,只能在32位系统中操作,可以安装虚拟机进行使用。包括DOSXNT.exe EDIT.exe LIB.exe LINK.exe MASM.exe ML.exe等执行程序

《Windows PE权威指南》学习之第13章 PE补丁技术(1)

第12章介绍了PE变形技术,该技术研究的是程序的字节码;本章来研究PE补丁技术,该技术侧重于研究使用Masm32编写的补丁程序,而非程序字节码。PE补丁技术被广泛应用于PE病毒、PE加密解密等领域,通过对目标程序嵌入不同的补丁程序,可以实现不同的目的。 PE补丁分为动态补丁和静态补丁,其中静态补丁框架由两部分组成:补丁程序和将补丁程序附加到目标PE的补丁工具。

chenyijun的专栏 2702

MASM6.0 DOS环境下汇编工具

MASM6.0 DOS环境下汇编工具

Masm Editor 6.0

一个非常不错的汇编工具。 编辑与运行集一体的汇编编译软件

awesome-claude-skills:收录1000+个Claude技能的目录与安装指南

Claude 擅长写,让它"整理这个文件夹的发票"时却只给方法、不碰文件。awesome-claude-skills 是一个收录了 1000+ 个现成 Claude 技能的开源目录,每个技能是一个独立文件夹,装好后 Claude 就能按固定流程把事做完。 ## 项目速览 这是一个 awesome list 形态的技能目录,仓库本身不是运行中的服务,而是一组标准化技能包。每个技能遵循同一格式:一

gitblog_00713的博客 936

MASM 6.0 汇编语言工具

微软宏汇编。的安装,解压后,分批拷入待安装机器吧。

NASM 2.16.01 与 MASM 汇编器对比:Windows/Linux 双平台 5 大核心差异解析

本文深入对比了NASM 2.16.01与MASM汇编器在Windows和Linux平台上的五大核心差异,包括语法设计、宏系统、目标文件格式、平台特定功能和调试支持。通过详细解析,帮助开发者根据项目需求选择最适合的汇编语言工具,提升开发效率和代码性能。

weixin_34049948的博客 324

如何处理MIGO取消物料凭证报错:“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”

记录一次处理MM模块的报错。这次连续处理了两个错误,“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”。把过程和操作步骤记录下一。方便日后回头查找。

IT小职员 6232

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 286

PE文件中打“内嵌补丁”练习

底部有练习下载链接 1.先运行程序,查壳发现该程序是用MASM写的,查看区段信息 2.接下来简单分析一下,该程序是否存在恶意代码:第一步查看API函数,发现没有提权API和对系统产生破坏的API,第二步查看程序运行会不会导致 溢出,发现没有。 2.OD载入,搜索字符串,发现字符串都处于加密状态,f7单步,进入解密部分 3.解密完之后,f7单步,进入 unpackme.0040103...

qq_33526144的博客 459

802.1AS时间同步机制深度解析:从Sync报文到多域冗余设计

本文深度解析了802.1AS时间同步机制,从Sync与Follow_Up报文的核心交互原理入手,详细阐述了其如何通过精确的时钟频率比测量、链路延迟计算和驻留时间补偿来实现微秒乃至纳秒级同步。文章进一步探讨了802.1AS-2020版本引入的多时钟域冗余设计,为构建高可靠的车载TSN网络提供了关键见解和实战配置指南。

pytorch8learner的博客 464

lzma打包exe_【原创】手写PE文件,打造史上最小LZMA解压DLL

因程序需求,需要在VB中调用LZMA解压数据,经过N天研究出此成果~什么是LZMA:LZMA应该是目前世界上数一数二的压缩算法——压缩时相同的时间得到压缩比最高,解压时速度极快且几乎不占内存。如果你对LZMA算法并无耳闻,那么7z总听说过吧。。没错,LZMA即7z作者发明的,7z使用的算法。什么?7z也没听说过?这样吧,你在网上下的软件,比如旺旺、暴风影音、人人桌面,它们的安装程序都是清一色的NS...

weixin_39757893的博客 687

使用MKL+Eigen求解稀疏矩阵方程组

问题:求解Ax=b的解,其中,A为大型稀疏矩阵,长和宽分别为1500^2。 一般思路: (1)A为对称正定矩阵,对A使用cholesky分解。 (2)A为对称不定矩阵,使用LDL‘分解,即: PAP'=LDL' 其中,L为单位下三角矩阵,D由阶数为1或者2的对角块构成,P是置换矩阵。 (3)不对称矩阵:LU分解。 (4)长方形矩阵(长...

薛晓伟 3446

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 410

[转]OpenSSL 使用指南

  OpenSSL 使用指南     目录 •  介绍 •  编译 •  运行 OpenSSL.exe •  算法编程 API 4.1 对称算法 4.1.1 DES 4.1.2 A ES 4.1.3 RC4 4.1.4 EVP_ 4.2 公钥算法 4.3 Hash 算法 4.4 随机数算法 •  SSL 协议编程 API • 

wuhran的Blog-C++,Linux,MySQL,PHP 1万+

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1915

OpenSSL 使用指南

•  介绍 OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。 1.1 SSL SSL(Secure Socket Layer) 安全协议是由 Netscape 公司首先提出,最初用在保护 Navigator 浏览器和 Web 服务器之间的 HTTP 通信 ( 即 HTTPS) 。

Lce的专栏 2195

Python爬虫实战:逆向工程与异步爬虫技术,高效抓取国家知识产权局专利数据

相比于传统的Selenium,Playwright由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度更快,并且能轻松录制用户操作生成代码。通常,列表中的摘要信息是缩略的,我们需要进入每个专利的详情页获取完整信息(如主权要求、法律状态等)。我们的第一步是手动操作一遍搜索流程,并用Playwright的“录制”功能或开发者工具,找出真正返回专利数据的那一个或多个网络请求。以友好的、对人类行为模拟的方式爬取数据是基本的网络礼仪,也能有效避免你的IP被封锁。

2201_76125261的博客 2424

079、LVGL基础控件:消息框(Msgbox)

《LVGL消息框控件深度解析与避坑指南》 文章深入剖析了LVGL消息框控件的核心特性和使用技巧。消息框本质是带按钮的模态容器,而非独立窗口。作者分享了创建消息框的正确姿势、标题/内容设置方法、安全的按钮事件处理方式(避免直接调用close函数导致栈溢出),并详细介绍了模态/非模态实现、样式自定义、动态更新等实用技巧。针对常见问题如内存管理、按钮数量限制、动画效果等给出了专业建议,特别强调了消息框作为用户交互关键环节的优化重要性,建议通过异步删除、合理父对象选择等方式提升稳定性。文章包含大量实际项目经验总结,

m0_50546716的博客 153
上一篇: 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
下一篇: 用进程注入来实现一个壳(原理)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值