Manual - Unpacking.Safengine - Shielden-Licensor 2.xx - By.Sound

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

Sound Manual Unpacking Safengine Shielden / Licensor 2.

xx

Manual Unpacking
Safengine Shielden /
Licensor 2.xx

By: Sound

2016/8/4 22:39:11

http://www.safengine.com/index.php
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Catalog
Introduction.............................................................................................................................................. 3

Content........................................................................................................................................................ 3

Require Tools............................................................................................................................................3

Patch HardwareID ( Licensing Protect )...................................................................................3

Find HWID.......................................................................................................................................... 4

Replace Hex Code.......................................................................................................................... 6

Patched................................................................................................................................................ 7

Oep................................................................................................................................................................. 7

Find Method........................................................................................................................................ 7

Modify the first byte......................................................................................................................... 8

IAT...................................................................................................................................................................9

IAT encryption type...........................................................................................................................9

Found IAT........................................................................................................................................... 11

Fix Resource s.........................................................................................................................................15

Unpacked.................................................................................................................................................. 19

Magic JMP.........................................................................................................................................22

How to Find Magic Jmp..............................................................................................................22

Use SCR UnPacking...................................................................................................................... 23

Done............................................................................................................................................................ 25

Greetz to:.................................................................................................................................................. 26
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Introduction
Safengine 的代码分析引擎将在保护应用程序时提供完整的分析,从而对应用程序进行系统化的保护,将
您的原始代码移动和变形,并且加入无数垃圾代码和反调试、跟踪代码。

Safengine 处理的范围是整个程序,而不是程序里的某一个过程。所以,即使您的关键代码在保护后未经
变形,也需要耗费破解者很长的时间才能找到,而往往只是一行两行代码,穿插在数以万计的垃圾代码
中,是极其隐蔽和猥琐的。

Safengine 的代码虚拟机在同类产品中最稳定、最完善,整体运行架构线程安全,不会改变系统对受保护
代码的线程的调度。虚拟处理器采用了逻辑门级的指令拆分,使用与非和加法两个基础运算指令实现了大
部分复杂的 x86 指令,并且使用了随机的虚拟寄存器参与运算,极大程度提高了代码保护的安全性。

在同类的软件保护壳中,Safengine 提供了最完整的解决方案,集代码加密、虚拟化、授权于一体,并且
每一项功能都可圈可点。

Content
如果你对 Safengine Unpacking 未涉及分析或学习.请在浏览本 PDF 之前阅读此文章,也许会对你有帮
助 ! Unpacking Shielden 2.19 http://qwe.tw/?p=274 ,此文采用很简单的方式 对 Safengine
Shieden 2.19 保护的程序进行脱壳。

本文主要讲 Unpacking Shieden / Licensor 的一般 Unpacking 流程思路


样本选了 Delphi 、 Visual C++ 、 E 语言、MASM 分别不同介绍

Require Tools
 OllyDbg 1.10
http://www.ollydbg.de
Plugins:
StrongOD v0.48.892 by 海风月影
BreakOnExecution

 Exeinfo Pe -ver 0.0.039


 Universal Import Fixer v1.2 (FINAL) by : Magic_h2001
 Scylla x86 v0.97b
 LoadPe By yoda
 CFF Explorer VIII

Patch HardwareID ( Licensing Protect )


Safengine Shielden / Licensor 包含授权系统 , 目前很多的程序用 Shieden / Licensor 进行保护
都会添加授权功能 所以在对程序进行 Unpacking 时,,我们首先需要解决 Shieden / Licensor
Licensing Protect 的问题。
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
关于 Licensing Protect 的解决方法,在 2015 年我曾分享过一个动画,动画的内容是如何对一个用
了 Shielden / Licensor 授权系统保护的程序 KeyGen 的方法。
KeyGen Safengine Shielden+Licensor.2.3.X.X Licensing Protection http://qwe.tw/?p=108,
这里将不再阐述

样本下载地址:
http://release.crack4r.cc/Exercise/unpackme%20Safengine%20Licensor%202.3.7.0-
Pass%3A%20unpackme.rar

Find HWID
在对用了 Safengine 保护的样本 Patch HWID 时, 我们需要有一个正确使用的授权文件与相对应的机器码

运行我们的样本文件,提示机器码不匹配 ,记录当前机器的机器码 与授权文件对应的机器码

PC_Hwid: 1+LKtQAIAgDUBgMAAAECAwQFBgdLH9/tVEXf/Q==

KeyHwid: yK/BrQAICAAgD2AA2MyMnr+9Bgdm51d1JTiyJQ==

对机器 码 DeCode , HWID 以 base 64 字节表 示

PC_Hwid DeCode: D7E2CAB500080200D406030000010203040506074B1FDFED5445DFFD


KeyHwid DeCode: C8AFC1AD00080800200F6000D8CC8C9EBFBD060766E757752538B225

配置 Strong OD 插件 ANTI ANTI Debuger 如下:


Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

载入 Ollydbg 停留在入口点。

005C6DA4 > $ E8 1C000000 CALL 005C6DC5 ; PUSH ASCII "Safengine Licensor v2.3.7.0"

005C6DA9 . 53 61 66 65 6>ASCII "Safengine Licens"


现在我们寻找模拟函数 RegQueryValueExA 使用 Ctrl+B 操作指令
ASCII 键入 RegQueryValueExA 或 HEX 键入 52 65 67 51 75 65 72 79 56 61 6C 75 65 45 78 41

第一次查找到的地址

0048127E . 52 65 ASCII "Re"


00481280 . 67 51 75 65 7>ASCII "gQueryValueExA",0

第二次查找到的地址

0048EA53 . F8 CLC
0048EA54 > E8 11000000 CALL 0048EA6A ; PUSH ASCII "RegQueryValueExA"

0048EA59 . 52 65 67 51 7>ASCII "RegQueryValueExA"


0048EA69 . 00 ASCII 0
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
0048EA6A >^ EB B8 JMP SHORT 0048EA24
0048EA6C > FF4424 08 INC DWORD PTR SS:[ESP+0x8]

0048EA70 . E9 AC000000 JMP 0048EB21

0048EA70 Follow

0048EB21 > \9D POPFD

0048EB22 . C3 RETN

0048EB22 BreakPoint , run 后 F7 , 来到模拟的 RegQueryValueExA 地址 ,

ASCII ( SystemBiosVersion ) 将会出现在 EAX 中 , 跟随 EAX 地址在 Dump 窗口( Follow In Dump ) ,搜索
PC_Hwid DeCode: D7E2CAB500080200D406030000010203040506074B1FDFED5445DFFD
如果搜索不到,第二次中断,重新搜索 或者内存中搜索。

Replace Hex Code

重载 Ollydbg , 0048EA54 BreakPoint > Run

数据窗口跟随地址 0012E50C 来到 KeyHwid DeCode 的最后一个字节 0012E527 处 设置 Hardware On Write


(Byte)

Run

第一次

第二次

一直到 0012E50C – 0012E527 字节与

D7E2CAB500080200D406030000010203040506074B1FDFED5445DFFD 匹配

此时 我们 把 Hex Code 替换为 KeyHwid DeCode:


C8AFC1AD00080800200F6000D8CC8C9EBFBD060766E757752538B25
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Patched.

删除我们的所有断点, run ,

Patch HWID Success !

Oep
Find Method

Oep 的寻找方法有很多, 这里我简单讲两种我最常用的方法 来寻找被 Safengine 保护后程序的 Oep.

第一种方法: 程序在 Ollydbg 已经运行, 如 1.3 此时我们把堆栈窗口往下拉动到最底处 往上翻查看堆栈信息


Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

0044CAD8 处 就是程序的 OEP 附近,

0044CA98 就是我们的 OEP 了 ,不过程序 加密被偷取了首字节 ,我们要给手动修改下

55 push ebp

Modify the first byte


第二种方法:对待有授权保护的程序,如 1.2 在替换了 HWID 的 Hex Code 时,删除所有断点

Code section Set Memory breakpoint on write > run > Code section Set Memory breakpoint on access >
Break On Execution > Apply (for this session only)
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

run , 来到 oep 的下一行

0044CA99 8BEC MOV EBP, ESP


0044CA9B 83C4 F0 ADD ESP, -0x10

0044CA9E B8 B8C84400 MOV EAX,0044C8B8

IAT
IAT encryption type
F7
0044CAA3 E8 2091FBFF CALL 00405BC8 00405BC8 53 PUSH EBX
00405BC9 8BD8 MOV EBX, EAX
00405BCB 33C0 XOR EAX, EAX
00405BCD A3 9CD04400 MOV DWORD PTR DS:[0x44D09C], EAX
00405BD2 6A 00 PUSH 0x0
00405BD4 E8 4B581700 CALL 0057B424
0057B424 /EB 7CJMP SHORT 0057B4A2
0057B426 |886424 01 MOV BYTE PTR SS:[ESP+0x1], AH
0057B42A |892C24 MOV DWORD PTR SS:[ESP], EBP
0057B42D |8D2C2E LEA EBP, DWORD PTR DS:[ESI+EBP]
0057B430 |EB 50 JMP SHORT 0057B482
0057B432 |B6 32 MOV DH, 0x32
0057B503 837C24 04 00 CMP DWORD PTR SS:[ESP+0x4], 0x0 这里在判断 IAT
是否已经初始化完毕
0057B508 ^ 0F85 44FFFFFF JNZ 0057B452

F8

0057B580 E8 DA85EFFFCALL 00473B5F Se_GetModuleHandle

0057B585 EB 04 JMP SHORT 0057B58B


EAX= 加密后的模块,F7
0057B912 E8 2CA3EFFF CALL 00475C43 Se_GetProcess
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
0057B917 ^ E9 B6EBFFFF JMP 0057A4D2 EAX= 被模拟的 API 存放地址
Ctrl+ G

00DCB468 8BFF MOV EDI, EDI


00DCB46A 55 PUSH EBP
00DCB46B 8BEC MOV EBP, ESP
00DCB46D 837D 08 00 CMP DWORD PTR SS:[EBP+0x8], 0x0
00DCB471 74 18 JE SHORT 00DCB48B
00DCB473 FF75 08 PUSH DWORD PTR SS:[EBP+0x8]
00DCB476 E8 C0290000 CALL 00DCDE3B
00DCB47B 85C0 TEST EAX, EAX
00DCB47D 74 08 JE SHORT 00DCB487
00DCB47F FF70 04 PUSH DWORD PTR DS:[EAX+0x4]
00DCB482 E8 7D2D0000 CALL 00DCE204
00DCB487 5D POP EBP
00DCB488 C2 0400 RETN 0x4
Copy 下 Hex Code 我们在内存中进行搜索
8B FF 55 8B EC 83 7D 08 00 74 18 FF 75 08 E8 C0 29 00 00 85 C0 74 08 FF 70 04 E8 7D
2D 00 00 5D
C2 04 00
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Found IAT
找到地址

7C8DB741 发现代码与被模拟的 API 存放地址一致 。


这里就是 00405BD4 E8 4B581700 CALL 0057B424 的真实 API 了

7C80B741 > 8BFF MOV EDI, EDI


7C80B743 55 PUSH EBP
7C80B744 8BEC MOV EBP, ESP
7C80B746 837D 08 00 CMP DWORD PTR SS:[EBP+0x8], 0x0
7C80B74A 74 18 JE SHORT 7C80B764
7C80B74C FF75 08 PUSH DWORD PTR SS:[EBP+0x8]
7C80B74F E8 C0290000 CALL 7C80E114
7C80B754 85C0 TEST EAX, EAX
7C80B756 74 08 JE SHORT 7C80B760
7C80B758 FF70 04 PUSH DWORD PTR DS:[EAX+0x4]
7C80B75B E8 7D2D0000 CALL GetModuleHandleW 7C80B760 5D
POP EBP
7C80B761 C2 0400 RETN 0x4

原指令是 FF25 形式 被加密后 字节相同


原 IAT 类型是
CALL [address ] Call Dword ptr [IAT]

用 Visual C++ 加了个样本,004183FD E8 99FE0B00 CALL 004D829B


这里是 OEP 后的第一个 API,
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
我们来看下无壳 VC++程序的入口点

这里我们发现 API 是 GetVersion , 于是 F8 到 004183FD 处 同时这个 CALL 占用了 5 个


byte,第六个 byte 是一个垃圾指令。
原指令是 FF15 调用形式 被加密后多了一个字节

这样的 CALL 有很多 类似

004183FD E8 99FE0B00 CALL 004D829B


0041844B E8 FC3C0D00 CALL 004EC14C
00418476 E8 963D0D00 CALL 004EC211
原 IAT 类型是

Call Dword ptr [IAT]


被替换
CALL Sedata-section+ByteRandom

F7 跟进 CALL 004D829B F7 来到
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
004D793D 837C24 04 00 CMP DWORD PTR SS:[ESP+0x4], 0x0 判断 IAT 是否已
经初始化完毕
Push EAX 模拟的 API 存放地址压入 EAX
004D7779 ^\EB E2 JMP SHORT 004D775D EAX=00D00E2 被模拟后的 API 存放
地址

可以一直单步下去 会来到

004D79D POPFD
004D7 C3 RETN

00D00E21 64:A1 18000000 MOV EAX, DWORD PTR FS:[0x18]


00D00E27 8B48 30 MOV ECX, DWORD PTR DS:[EAX+0x30]
00D00E2A 8B81 B0000000 MOV EAX, DWORD PTR DS:[ECX+0xB0]
00D00E30 0FB791 AC000000 MOVZX EDX, WORD PTR DS:[ECX+0xAC]
00D00E37 83F0 FE XOR EAX, 0xFFFFFFFE
00D00E3A C1E0 0E SHL EAX, 0xE
00D00E3D 0BC2 OR EAX, EDX
00D00E3F C1E0 08 SHL EAX, 0x8
00D00E42 0B81 A8000000 OR EAX, DWORD PTR DS:[ECX+0xA8]
00D00E48 C1E0 08 SHL EAX, 0x8
00D00E4B 0B81 A4000000 OR EAX, DWORD PTR DS:[ECX+0xA4]
00D00E51 C3 RETN

最终停留在 第一个 API CALL 的下一行 00418403 33D2 XOR EDX, EDX
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

用 MASM 加了个样本,选 MASM 编译器的原因 : 代码简洁,便于阅读,方便操作。


我们来进行一次完全的手工脱壳吧。 载入 Ollydbg, 停留在入口点。

Code section Set Memorybreakpoint on write > run > near oep

00401000 6A 00 PUSH 0x0


00401002 E8 8D010000CALL 00401194
00401007 A3 30304000 MOV DWORD PTR DS:[0x403030], EAX
0040100C E8 7D010000 CALL 0040118E
00401011 A3 34304000 MOV DWORD PTR DS:[0x403034], EAX
00401016 6A 0A PUSH 0xA
00401018 FF35 34304000 PUSH DWORD PTR DS:[0x403034]
0040101E 6A 00 PUSH 0x0
00401020 FF35 30304000 PUSH DWORD PTR DS:[0x403030]
00401026 E8 06000000 CALL 00401031
0040102B 50 PUSH EAX
0040102C E8 57010000 CALL 00401188
00401002 E8 8D010000CALL 00401194 设置硬件断点重新载入
原指令是 FF25 形式 被加密后 多了一个字节
原 IAT 类型是
CALL [ address ]
Call Dword ptr [IAT]
被替换
CALL Sedata-section+ByteRandom

00401194 - E9 A8A5407C JMP kernel32.GetModuleHandleA


00401199 90 NOP
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

前文有讲过

Se_GetProcess ,我们可以直接在 Se_GetProcess 处 设置个断点 中断在这里后,堆栈窗


口反汇编回溯一下
此时得到的地址 每次模拟的 API 都会存放在 EAX 并经过这里,这种方法省却了 单步跟踪
的繁琐

一共只有 14 个 API,暂时手工处理完毕 ,
一种更便捷的方法 :
仅仅替换 SE_GetModuleHandleA 与 GetProcAddress 不需要去修 IAT 就可以
Unpacked
这种方式 Unpacking 既有优点也有缺点
优点: 不需要修 IAT 与 VM CALL,而且 Unpack 速度快,
缺点: 体积大, Unpack 不干净.
Unpacking 的目的 >>>正常运行 / 运行速度快 / 修改内部代码 /不使用 Patch / 再
一次加壳 / Etc

Fix Resource s
现在看看资源需不需要处理 数据窗口 跟随到 基址 00400000,
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

其次往下拉动 查看资源信息,

我们也可以使用 Lord Pe 进行查看资源

这个样本并没有什么资源文件

对于有资源文件的 我们应该怎么处理资源 都是一些简单的 PE 知识,其实我们只需要照搬资源,然后修改指针指向新


搬资源地址即可,只要修改正确就可以了。

当然对待 Anti-Dump 也可以对 PointerToSymbolTable 和 NumberOfSymbols 进行清空 资源的处理有很多此


类脚本 这里贴出 小组成员 L4nce 的脚本 ,

_FINDRESBASE_:
VAR DosHead VAR
NTHead VAR
DataTable VAR
ResBase
VAR MODULEBASEADDR
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

GMI eip,MODULEBASE

MOV MODULEBASEADDR,$RESULT MOV


DosHead,MODULEBASEADDR

MOV NTHead,[DosHead+3C] //PE HEAD


ADD NTHead,DosHead

ADD NTHead,78
MOV DataTable,NTHead ADD
DataTable,10
MOV ResBase,[DataTable] ADD
ResBase,DosHead RET

_GETFIXRESADDR_:

VAR ResNumber VAR


StructBase VAR
ResPoint VAR
ResFix_Start VAR
ResFix_End

MOV StructBase,ResBase //一 级 目录 ADD


StructBase,10
MOV ResNumber,[ResBase+0E],2 //获 取 数量
MOV Temp,[ResBase+0C],2
ADD ResNumber,Temp
MOV ResPoint,[StructBase+4] AND
ResPoint,7FFFFFFF
ADD ResPoint,ResBase //二 级目 录 开始

MOV StructBase,ResPoint ADD


StructBase,10
MOV ResPoint,[StructBase+4] AND
ResPoint,7FFFFFFF
ADD ResPoint,ResBase //三级目录

MOV StructBase,ResPoint ADD


StructBase,10
MOV ResPoint,[StructBase+4]
ADD ResPoint,ResBase //定位 到 第 一个 指 针 处

MOV ResFix_Start,ResPoint

MOV StructBase,ResBase //一 级 目录 ADD


StructBase,10
DEC ResNumber MUL
ResNumber,8
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
ADD StructBase,ResNumber
MOV ResPoint,[StructBase+4]
AND ResPoint,7FFFFFFF
ADD ResPoint,ResBase //二 级目 录 开始

MOV StructBase,ResPoint
MOV ResNum ber,[StructBase+0E],2 //获 取 数量
MOV Temp,[StructBase+0C],2 ADD
ResNumber,Temp
ADD StructBase,10 DEC
ResNumber MUL
ResNumber,8
ADD StructBase,ResNumber MOV

ResPoint,[StructBase+4]

AND ResPoint,7FFFFFFF
ADD ResPoint,ResBase //三级目录

MOV StructBase,ResPoint
MOV ResNum ber,[StructBase+0E],2 //获 取 数量
MOV Temp,[StructBase+0C],2 ADD

ResNumber,Temp
ADD StructBase,10 DEC
ResNumber MUL
ResNumber,8

ADD StructBase,ResNumber MOV


ResPoint,[StructBase+4]
ADD ResPoint,ResBase //定位 到 第 一个 指 针 处
MOV ResFix_End,ResPoint RET

_FIXRES_:
var Fix_Addr var
Souce_Addr var
Des_Addr var Res_Size
ASK "Do you have a place to save fixed Res?IF you input 0,script will alloc"
CMP $RESULT,0

JNE HAVE_SPACE
ASK "input Res Size" ALLOC
$RESULT HAVE_SPACE:
mov Des_Addr,$RESULT mov
Fix_Addr,ResFix_Start
FixResLoop:
mov Souce_Addr,[Fix_Addr]

add Souce_Addr,MODULEBASEADDR mov


Res_Size,[Fix_Addr+4]
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
MEMCPY Des_Addr,Souce_Addr,Res_Size mov
[Fix_Addr],Des_Addr

sub [Fix_Addr],MODULEBASEADDR add


Fix_Addr,10

add Des_Addr,Res_Size inc


Des_Addr

cmp Fix_Addr,ResFix_End JBE


FixResLoop
RET

Unpacked
用 Universal import Fixer 来修复指针类型!

修复指针完成如下
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Dump:

Unpacked:
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

优化体积

使用 CFF Explorer

Delete 2 个 Sedata 区段,

然后 选择 Rebuilder 重建 Pe
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Expand
Magic JMP
magic JMP 每个加密壳保护后的程序代码里,基本上都有这个指令,它的作用:程序被壳保护,外壳会写获取原
始 IAT 再加密,

而这个指令就是壳加不加密原始 IAT 的控制指令,如果让壳在获取原始 IAT 后不加密 那么对于我们的 Unpacking 工作

会省心省时很多, 当然最直接的方式是在 Se_GetProcAddress 直接进行 inline Patch

How to Find Magic Jmp


第一种方法:可以直接内存中先搜索 EM_API 当 Eax == EM_API 时、地址就是 Magic Jmp,此时我们把add ,r32,r32
nop掉即可!

第二种方法: Code 段 设置内存写入断点,会写入 API ,其次跟随获取 IAT 的 地址 与大小,用 trace 进行跟踪,查


找 EAX 与写入 API 相等地址, 这时寻找到的是 add r32,r32

第三种方法: 总结了一个特征码,8D 64 24 ?? 0F ?? ?? ?? FB FF

样本采用 E 语言编译器编译。
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

查找
到的地址 全部设置 Int3 断点,

当运行到 004F27FA ^\0F85 5E1CFBFF JNZ 004A445E 此处时候 条件与上述几种方法符合,

这里就是我们需要的 Magic Jmp 了,我们只需要修改 ZF 标志位 实现转移指令不成功 或者 NOP 掉,这时


SE_GetProcAddress 处 就是我们的真实 API,

Use SCR UnPacking


这里我写了个脚本对 Magic JMP 进行处理 0F85 改为了 0F84 转移不成功,执行完毕并且来到 OEP

此时我们去 Se_GetProcAddress 处看看效果。

00445177 E8 B0AA1200 CALL 0056FC2C

这里我们知道是 GetVersion ,

0056FC86 E8 E539F3FF CALL 004A3670 SE_GetModuleHandleA


0056FC8B ^ EB D1 JMP SHORT 0056FC5E

0056FC8E E8 955BF3FF CALL 004A5828 Se_GetProcAddress


0056FC93 ^ E9 40E3FFFF JMP 0056DFD8

经过 Se_GetProcAddress 时, 中段在 Magic Jmp 处 , 此时 EAX = GetVersion,

我们在 0056FC93 设置 Int3 断点, run,


Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

0056E002 894424 24 MOV DWORD PTR SS:[ESP+0x24], EAX ;


0056E006 E9 341D0000 JMP 0056FD3F

0056FD3F 61 POPAD
0056FD40 FF4424 08 INC DWORD PTR SS:[ESP+0x8]
0056FD44 9D POPFD
0056FD45 C3 RETN

这里我们可以发现 返回的地址不是被模拟的 API 地址了,是真实的 API 地址。

00445177 E8 B0AA1200 CALL 0056FC2C


0044517C 90 NOP
0044517D 33D2 XOR EDX, EDX ; GetVersion

利用以上的知识写了一个修 IAT 的脚本, 就用它再来一次 Unpacking 吧。

直接运行脚本 修复所有 E8????1?00 这种类型的 CALL ,硬编码,执行速度大概得 10 分钟。

脚本运行完毕, 有一些 SDK 未修复,不过没有影响!


Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

这时候只需要用 Scylla ,填写 OEP,IAT VA / SIZE ,Fix Dump 即可,修复后的文件优化后与未加密版本无差


别。

Done .
1: 观察加密后 IAT CALL / JMP / FF15 /FF25 等 与加密前的差别
2: 寻找 Magic JMP 可以使我们的 Unpacking 更方便
3: 注意寻 找 SE_GetModuleHandleA Se_GetProcAddress
4: 我们还需要处理一个 Se_CreateThread 这样方便跑脚本 设置 Int3 断点在 KiUserExceptionDispatcher 查
找CreateThread
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx

Greetz to:
- Apuromafo
- Bughoho
- 半斤八兩
- c0rk
- CCU
- CriticalError

- Danilo Scala
- Emil
- evernick
- fly
- giv
- Hmily
- JoyChou
- Kido
- L4nce
- MistHill

- OrdinAry
- Peace
- Raham
- The_Wolf
- wgz001
- White
- 19nuclear91
- XiaoWeiMe
- XiMo
- yoza
- ZeNix
Team/Forum

- [ASA]
- [CCG]
- [CLS]
- [CUG]
- [IPB]
- [LCG]
- [URET]
- [RET]

- [SnD]
- [TSRh]

- [UPK]
- [PEDIY]
- [Exetools]
Sound Manual Unpacking Safengine Shielden / Licensor 2.xx
- [tuts4you]
- [Black Storm]
- [DebugMan]
- [gERMAN rEVERSING nEWBIES]

Beautify:LzSkyline@LzSkyline.com

All [UPK]'ers that can't be mentioned one by


one. All [RET]'ers that can't be mentioned one
by one. All our personal friends on the scene .
You know who you are ..

Blog..: http://qwe.tw
E.Mail:Sound@Crack4r.cc
Distro: release.crack4r.cc

2016/8/5 08:13:38
Reverse Engineering Team
By:Sound [R.E.T]

You might also like