[ 登录注册 ]

Java

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

2016/09/06 09:58 [db:作者] 返回上一页

;=======================我的加密程序 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:masm32INCLUDEwindows.inc
INCLUDE        E:masm32INCLUDEkernel32.inc
INCLUDE        E:masm32INCLUDEuser32.inc
           
includelib     E:masm32libkernel32.lib
includelib        E:masm32libuser32.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
   &nbs
点击复制链接 与好友分享!回本站首页

文章来源:http://www.bozhiyue.com/java/2016/0906/450532.html
评论
发表评论