yC 逆着看

本文详细解析了 Yoda's Protector 的源码,介绍了其如何通过对话框进行文件选择、设置保护选项及执行文件加密的过程。深入探讨了汇编语言中对话框消息处理机制、文件操作和加密调用等关键技术。

yC 有源码但是我们逆着看

 

.386
.model flat, stdcall
option casemap:none

include /masm32/include/kernel32.inc   ;<--------像c语言中的#include <stdio.h>
include /masm32/include/user32.inc
include /masm32/include/comdlg32.inc
include /masm32/include/shell32.inc
include /masm32/include/imagehlp.inc

includelib /masm32/lib/kernel32.lib   ;<---------像c语言中的#pragma   comment(lib,"Ws2_32.lib")
includelib /masm32/lib/user32.lib
includelib /masm32/lib/comdlg32.lib
includelib /masm32/lib/shell32.lib
includelib /masm32/lib/imagehlp.lib

include /masm32/include/windows.inc
include resource.inc

DlgProc PROTO :HWND, :UINT, :WPARAM, :LPARAM  <---自定义函数,传说中的callback()函数

;------------ CONST --------- <---常量(#define PI 3.141)
.const
CHECK_SI_FLAG           equ 1   
ERASE_HEADER_FLAG       equ 2
DESTROY_IMPORT_FLAG     equ 4
CHECK_HEADER_CRC        equ 8
ANTI_DUMP_FLAG          equ 16
API_REDIRECT_FLAG       equ 32

szFilter                db "ExE files",0,"*.exe",0,"All files",0,"*.*",0,0
szCurDir                db ".",0
szNoFile                db "No file selected up to now !",0
szErr                   db "ERROR",0

;------------ DATA ---------- <------变量 (int a=0;)
.data
hInst                   dd 0   
hDLG                    dd 0
ofn                     OPENFILENAME <>
cFname                   db MAX_PATH dup (0)

;------------ CODE ----------<------从这里开始运行
.code

include CryptStuff.ASM
include PER.ASM

main:
        invoke GetModuleHandle,0
        mov hInst,eax
        invoke DialogBoxParam,eax,IDD_MAINDLG,0,offset DlgProc,0
THEEND:
        invoke ExitProcess,0

DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        LOCAL  hDrop : HANDLE

        pushad
        .IF uMsg == WM_INITDIALOG
           invoke LoadIcon,hInst,IDI_ICON
           invoke SendMessage,hDlg,WM_SETICON,TRUE,eax
           push hDlg
           pop hDLG
           ; check the checkboxes :)
           invoke CheckDlgButton,hDlg,IDC_CHECKHEADERCRC,TRUE
           invoke CheckDlgButton,hDlg,IDC_DESTROYIMPORT,TRUE
           invoke CheckDlgButton,hDlg,IDC_ANTIDUMP,TRUE
           INVOKE CheckDlgButton,hDlg,IDC_APIREDIRECT,TRUE
           invoke DragAcceptFiles,hDlg,TRUE
           
        .ELSEIF uMsg == WM_DROPFILES
           push wParam
           pop hDrop
           invoke DragQueryFile,hDrop,0,offset cFname,sizeof cFname
           invoke DragFinish,hDrop
           invoke SetDlgItemText,hDlg,IDC_TARGETFILE,offset cFname
           
        .ELSEIF uMsg == WM_COMMAND
           mov eax,wParam
           
           .IF ax == IDC_CLOSE
              invoke SendMessage,hDlg,WM_CLOSE,NULL,NULL
              
           .ELSEIF ax == IDC_CHOOSEFILE
              ; get a file path
              mov ofn.lStructSize,SIZEOF ofn 
              mov ofn.lpstrFilter,offset szFilter
              push hDlg
              pop ofn.hwndOwner
              mov ofn.lpstrFile, offset cFname 
              mov ofn.nMaxFile,SIZEOF cFname
              mov ofn.lpstrInitialDir,offset szCurDir
              mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_HIDEREADONLY
              push offset ofn
              call GetOpenFileName
              test eax,eax
              jz @@ExitDlgProc
              invoke SetDlgItemText,hDlg,IDC_TARGETFILE,offset cFname  
                          
           .ELSEIF ax == IDC_CRYPT
              ; ----- was a file selected ? -----
              mov eax,offset cFname
              .IF byte ptr [eax] == 0
                 invoke MessageBox,hDlg,offset szNoFile,offset szErr,MB_ICONERROR
                 jmp @@ExitDlgProc
              .ENDIF
              
              ; ---- build the protection flag -----
              xor edi,edi
              invoke IsDlgButtonChecked,hDlg,IDC_SICHECK
              .IF eax == BST_CHECKED
                 or edi,CHECK_SI_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_ERASEPEHEADER
              .IF eax == BST_CHECKED
                 or edi,ERASE_HEADER_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_DESTROYIMPORT
              .IF eax == BST_CHECKED
                 or edi,DESTROY_IMPORT_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_CHECKHEADERCRC
              .IF eax == BST_CHECKED
                 or edi,CHECK_HEADER_CRC
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_ANTIDUMP
              .IF eax == BST_CHECKED
                 or edi,ANTI_DUMP_FLAG
              .ENDIF
              INVOKE IsDlgButtonChecked,hDlg,IDC_APIREDIRECT
              .IF EAX == BST_CHECKED
                 OR  EDI, API_REDIRECT_FLAG
              .ENDIF
              push edi
              push hDlg
              push offset cFname
              call CryptFile
           .ENDIF
           
        .ELSEIF uMsg == WM_CLOSE
           invoke EndDialog,hDlg,0
        .ENDIF
        popad
        
  @@ExitDlgProc:
        xor eax,eax
        ret
DlgProc endp
end main


这里是网站和源码
Yoda's Protector Source

 

 

这个工具的工作原理,它的壳特征和编译器特征保存在HackFans.txt里面,能识别出来的壳,基本上都有对应的脱壳函数,用壳特征脱壳,可以脱壳,对于一些不好特殊的壳你可以用OEP侦测来脱壳,这要依赖编译器特征,你也可以自己添加编译器特征到HackFans.txt 对某些未知壳,可能能用未知壳脱壳选项搞定,它里面的原理也是用了编译器入口处信息. 修改历史: 1.对有IAT加密情况的,才进行IAT解密,避免了有时候不需要解密也去解密,导致脱后程序不能执行 2.支持文件拖拽功能 3.脱未知壳时,如果IAT加密了,请选上解密加密IAT项,进行IAT还原 下面是它能脱的壳: upx 0.5x-3.00 aspack 1.x--2.x PEcompact 0.90--1.76 PEcompact 2.06--2.79 NsPack nPack FSG 1.0--1.3 v1.31 v1.33 v2.0 VGCrypt0.75 expressor 1.0--1.5 dxpack v0.86 v1.0 !Epack v1.0 v1.4 mew1.1 packMan 1.0 PEDiminisher 0.1 pex 0.99 petite v1.2 - v1.4 petite v2.2 petite v2.3 winkript 1.0 pklite32 1.1 pepack 0.99 - 1.0 pcshrinker 0.71 wwpack32 1.0 - 1.2 upack v0.10 - v0.32 upack v0.33 - v0.399 RLPack Basic Edition 1.11--1.18 exe32pack v1.42 kbys 0.22 0.28 morphine v1.3 morphine v1.6 morphine v2.7 yoda's protector v1.02 yoda's protector v1.03.2 yoda's crypt v1.2 yoda's crypt v1.3 EXE Stealth v2.72--v2.76 bjfnt v1.2 - v1.3 HidePE 1.0--1.1 jdpack v1.01 jdpack v2.0 jdpack v2.13 PEncrypt v3.1 PEncrypt v4.0 Stone's PE Crypt v1.13 telock v0.42 telock v0.51 telock v0.60 telock v0.70 telock v0.71 telock v0.80 telock v0.90 telock v0.92 telock v0.95 v0.96 v0.98 v0.99 ezip v1.0 hmimys-packer v1.0 jdprotect v0.9b lamecrypt UPolyX v0.51 StealthPE 1.01 StealthPE 2.2 depack 涛涛压缩器 polyene 0.01 DragonArmour EP Protector v0.3 闪电壳(expressor) BeRoEXEPacker PackItBitch 木马彩衣 mkfpack anti007 v2.5 v2.6 yzpack v1.1 v1.2 v2.0 spack_method1 v1.0 v1.1 v1.2 v1.21 spack_method2 v1.1 v1.2 v1.21 xj1001 xj1000 xj看雪测试版 xj1003 xpal4 仙剑-凄凉雪 仙剑-望海潮 mslrh0.31 v0.32 [G!X]'s Protect
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值