# 破解基础知识之认识壳与程序的特征

一个程序从编译出来的时候一般都是没有壳的,不同编译器编译出的无壳程序也是不相同的,认识了不同编译器编译出来的无壳的程序,再去看无壳程序被加壳程序加壳后的样子就轻松很多,经过对比从而了解不同语言无壳程序和加壳后程序的特征是什么,特征主要从 “入口点代码”、“程序区段” 和 “加载模块” 等信息来确定。
一:程序是什么语言编译的
从目前国内接触到程序看,比较流行的编译器有:VC 系列、易语言、.NET、Delphi,一些曾经用的很多但渐渐少了有:VB、ASM、BC++,还有一些用的比较少的有:AutoIt、PB、QT 等,结合实例来看看 “入口点代码”、“程序区段” 和 “加载模块” 等特征。

一般使用 exeinfo PE 来识别壳和编译程序,但是还需要根据区段信息 (比如.data,.text),并且结合代码入口特征来充分判断。

PEinfo 也可以识别,但是由于已经暂停维护,可能会导致误报

# vc6.0

VC++ 6.0 编译,无壳程序
image-20230822081440427

** 入口特征:** 入口点代码是固定的代码,入口调用的 API 也是相同的,其中有的 push 地址不同程序可能不同;区段有四个也是固定的.text、.rdata、.data 和.rsrc。

image-20230822081500143

区段特征:

image-20230822081516456

特征码: 55 8B EC 6A FF 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00

# VC++

1
2
3
4
55            PUSH EBP
8BEC MOV EBP,ESP
83EC 44 SUB ESP,44
56 PUSH ESI

# VC 7

1
2
3
4
6A 70              push 70
68 50110001 push hh.01001150
E8 1D020000 call hh.010017B0
33DB xor ebx,ebx

# VS 2008 & VS2013

  • VS 版本的不同会导致编写出的程序特征(链接器、入口点、区段)
  • debug 下编译的程序区段的数量相对于 Release 多一些
  • release 的入口存在 call ??? jmp ???,debug 可能是两个 call
VS 版本 链接器版本
VC 6.0 6.0
VC2003 7.0 / 7.1
VS2005 8.0
VS2008 9.0
VS2010 10.0
VS2012 11.0
VS2013 12.0
VS2015 14.0
VS2017 14.1
VS2019 14.2

vs2008

image-20230822081537484

image-20230822081552368

image-20230822081608085

image-20230822081624203

VS 特点:入口点只有两行代码,一个 CALL 后直接 JMP,第一个 CALL 进去后调用的 API 也是相同的;区段相对于 VC6 多了一个.reloc (重定位表)。

vs2013

image-20230822081651343

image-20230822081706723

image-20230822081723924

# 易语言

分为独立编译和非独立编译

独立编译后被识别别 VC6 (ver 0.0.3.8)

由于易语言独立编译是调用 VC 的链接程序编译的,所以从区段和入口代码特征和 VC 相同

image-20230822081745844

image-20230822081802797

新版 exeinfoPE 识别为 E language/EPL

非独立编译

能识别到下面的 ascii,并且有 krnln.fnr 的字符,程序入口会有很多 jmp

image-20230822081822439

image-20230822081836097

搜索中文区段可以看到特征

push ->call ->jump

image-20230822081850049

运行之后加载 krmln.fnr

image-20230822081904654

独立编译

image-20230822082005089

还是会有很多 jmp 调用 api

独立编译 / 非独立编译都被识别为四个区段

image-20230822082017114

易语言特点:可以从程序里找一些 call 的调用最终都会走到上面核心代码图位置,这个方法可以区分和 VC 的区别,非独立编译比较容易识别,入口特征和模块特征都有 krnln.fnr。

# Delhpi

image-20230822082030859

code + data + bss (未初始化的数据)

image-20230822082042537

OEP:

image-20230822082121357

特征:入口点有五个 call,第一个 call 的内部调用了 GetModuleHandleA,最后有一堆 00

第一个 call 内部:

image-20230822082142314

和 BC++ 特征相同,都是使用 FF25 调到函数。

image-20230822082155469

特征码: 55 8B EC 83 C4 F0 B8 ?? ?? ?? ?? E8 ?? ?? ?? ??

# .NET

image-20230822082215761

image-20230822082227320

E 中加载了很多.NET 运行库

# ASM

image-20230822082250064

image-20230822082315269

特征:小,入口点直接就是逻辑代码

image-20230822082328241

# BC++ 6.0

image-20230822082346333

image-20230822082358971

特征:第一行是一个短跳转,跳过了字符串 fb:C++HOOK,跳转的最后一行是 CPPdebugHook,第一个调用的函数是 GetModuleHandleA

image-20230822082412419

BC++ 编写的程序,调用 IAT 函数会使用到 FF25 ?? ?? ?? ??

image-20230822082423700

PEID 匹配特征码

1
EB 10 66 62 3A 43 2B 2B 48 4F 4F 4B 90

# VB

image-20230822082434530

image-20230822082445276

特征:push - call - 一堆 00

image-20230822082457006

# 各种软件优缺点

1、通过 [PEiD](http://down.52pojie.cn/Tools/PEtools/PEiD 0.95.rar)、Exeinfo PE查壳工具内置各种壳的十六进制特征码进行对比查壳,说下优缺点吧。

PEiD、FFI、FastScanner、RDG Packer Detector 这类程序都是通过目录下的 userdb.txt(查壳程序不同可能数据库名有出入)数据库进行加壳程序特征对比的,由于 userdb.txt 文件都是好多年前的了,全球基本都在用 fly 在 09 年发布的 UpKPEiDSign,即使有新的也都基于他制作的版本之上进行更新的,而且更新都没有太好效果,由于原理都是通过加壳程序的特征进行对应,而这些加壳特征都是个人总结而来,对加壳程序的模糊搜索对比造成可靠性不高,特别是对于 VMProtect 这类加密壳程序,经常被识别成一些算七八糟都没见过的加壳内容,特别是显示 UPolyX,基本都是误报,对新手的误导很严重,但对于传统的一些压缩壳的识别效果还是很好的,当然了,有利有弊,正是由于它的开放性特征库,也方便给大家提供自己编写特征的方法,来识别一些新的壳,期待大家能做出自己的加壳特征来。

\2. Exeinfo PE 属于新一代查壳工具,作者目前还在更新,它和 PEiD 的区别可能就在于它的特征库是作者自己维护,不支持外部修改,新版好像也开始支持外部特征库了,这款查壳工具的加壳特征库比较准确而且范围很广,如 Themida、WinLicense、VMProtect、ZProtect、Shielden 都可以轻松识别出来,但对于具体加壳程序的版本都是模糊的,其实个人认为加壳版本真的不重要,这个后面再具体说道,Exeinfo PE 可以说是目前可以说最好的查壳工具了,推荐大家使用。

入口特征可以通过 OllyDBG 载入获得,载入后可以按一下 “Ctrl+A”,让 OD 分析一下代码,就可以把入口点一些特征字符串分析出来,从下图的入口信息可以轻松看出,这是一款 Safengine 加壳的程序,对于 Shielden、Safengine、VProtect 这类加壳程序都可以使用这种方法判断出来。

https://www.xxhack.top/archives/ni-xiang-ji-chu--bu-tong-yu-yan-cheng-xu-de-ru-kou-te-zheng

https://blog.csdn.net/liwen930723/article/details/49472377

https://www.52pojie.cn/thread-234739-1-1.html

windows 程序状态大体可以分为以下几种类型:未加壳、压缩壳、传统加密壳、代码虚拟化保护、.Net 程序加密

加壳的目的:为了隐藏程序真正的 OEP(入口点),防止被破解。

1、查壳:用于分析软件有没有加壳,加壳是所使用的哪种壳。常用工具(PEID、Ollydbg、)。详细操作过程可参看《破解基础 - 你到底有没有》。

2、寻找 OEP:OEP 是程序加壳前真正的入口点,外壳初始化的现场环境(各寄存器值)和原程序的现场环境是相同的,加壳程序初始化时保存各寄存器的值,外壳执行完毕,会恢复各寄存器内容。

3、抓取内存映像文件(Dump):完成外壳程序解压还原后,在内存中找到运行的目标 PE 进程数据,从内存中抓取出来,然后在用文件的形式保存下来。保存下来的文件可能不能正常运行,有可能是壳对 IAT 进行了加密。

抓取内存映像文件详细介绍可参考:浅谈脱壳中的 Dump 技术

4、输入表重建(修改 IAT):一些加密壳为了防止输入表被还原,会在 IAT 里填充一些扰乱解析的地址(例如:壳中用来 HOOK-API 的外壳代码地址),为了获得没有加密的 IAT,一般可跟踪加壳程序对 IAT 处理过程,修改相关指令,阻止外壳加密 IAT。

输入表重建详细介绍可参考文件:重建输入表 - 百度文库

压缩 ==》 减小程序体积【ASPacK、UPX、PECompack 等】 保护程序 ==》 用了各种反跟踪技术保护程序不被调试、脱壳等【ASProtect、Armadillo、EXECryptor 等】

# upx

image-20230822082556084

# 单步跟踪

1. 找到 OEP

不能向上跳转,向下跳如果下一行还是跳转 (jmp,call) 就再隔一行。只需要看红线跳转

直到看到大跨度跳转,就是跳往 OEP

image-20230822082607763

jmp 0047738C

image-20230822082642574

2. 脱壳

可以使用 OD 或者 loadpe

OD 有两种方式:方式 1 和方式二。使用 ollydump

image-20230822082702108

loadpe

修正镜像大小 -> 完整转存

image-20230822082719412

输入表重建,修复转存文件

# ESP

image-20230822082743504

dd esp 或者在数据窗口中跟随 esp

image-20230822082756289

在数据窗口中下硬件访问断点,word

image-20230822082810312

跳转到 oep

删除硬件断点

# 二次内存镜像

先解压 rsrc 以前的所有内容,在对上面的内容下段

image-20230822082835523

先对 rsrc 下 F2,在对 upx0 下 F2

# 查找

image-20230822082851190

直接找 popad,适用于大部分 upx 和 asp

# ASP

# 1. 单步跟踪

和脱 upx 一样。但是如果碰到 call 程序直接执行,需要 F7 跟进去,一直到 popad,ret 之后就是 oep 了

image-20230822082905760

image-20230822082921137

使用 ollydump 脱壳

image-20230822082932908

# 2.ESP

和 upx 一样,下硬件访问断点,断下之后,下面的 retn 就是跳转到 oep

image-20230822082954787

# 查找 popad

image-20230822083008532

如果有多个 popad,ctrl+L 查找下一个

# 内存镜像

memory 中 rsrc 下一次断,401000 第二次下段

然后单步法

# 模拟跟踪

tc eip < .aspack 地址

image-20230822083024652

# SFX

选项中

image-20230822083039582

image-20230822083052191

# NSP

# ESP

1. 找到 oep

image-20230822083104779

2. 在 loadpe 中修正镜像大小,完整转存

3. 修复

image-20230822083129331

image-20230822083139488

# 单步跟踪

和前两个方法一样

# 模拟跟踪

tc eip<nsp1 地址

# 两次内存镜像

nsp0 下段,在单步

# 特殊方法

at GetVersion

image-20230822083157718

在 retn 出下段,执行到该行,在执行一次到 oep 之后

适用于北斗 3 前版本

# FSG

# 修复

image-20230822083212702

首先通过单步法找到连续的 jmp,最下面一个 jmp 就会 jmp 到 oep 的位置

image-20230822083228686

进行转存并修复

image-20230822083243079

手动查找 IAT。使用任意函数找到 IAT

image-20230822083303882

425000 开始是 iat

image-20230822083317145

425284 是结束

image-20230822083332766

25000-25284。更改 rva,大小不想算可以直接写 1000

image-20230822083347811

获取导入表,显示无效的,剪切指针,修正转存,即可修复 IAT

# esp

image-20230822083402143

运行到 push 之后使用 esp

# 特殊 esp

运行扫 push 上一行后,堆栈中第四行即为 OEP

image-20230822083418966

反汇编窗口中跟随,下硬件断点,shitf+f9, 即可调到 oep

image-20230822083432375

# PE compact 2.x

# 单步

有会执行的 call 就跟进去,直到这个 jmp 调到 oep

image-20230822083453982

# esp

image-20230822083507205

#

BP VirtualFree

shitf + f9

取消断点

alt + F9 执行到用户代码

查找 push 8000

单步

# ??

BP VirtualFree

shift + f9

shift + f9

取消断点

alt + f9

# ???

image-20230822083520274

BP 0045DE74

shift + f9

断点下到执行到 retn 下面一行,shift + f9

image-20230822083531604

单步

# ????

BP VirtualFree

shift + f9

取消断点

alt + F9

找到下一个 jmp,单步

# 异常

image-20230822083547111

重新运行程序,多次 shift + f9 直到程序运行

那么在程序运行前的一次 shift + f9,在堆栈窗口中找 se 句柄,在反汇编窗口中跟随

找到 retn 下一行,运行到,单步

# 两次内存

rsrc 第一次下段

text 第二次下段

执行到 retn 下一行,单步

# at getversion

at GetVersion 之后

image-20230822083606646

运行到 retn,F8,即可到达程序。向上翻就是 oep

# ezip

# 单步

不要管开局那堆 jmp

如果修复完不能运行,使用重建 pe

image-20230822083621475

# esp

运行到这一行使用 esp 法

image-20230822083635266

# telock 0.98b1

# 最后一次异常

第 n-1 次异常,转到 se

image-20230822083648254

下段,shift + f9,单步

找到大跳转

记下 oep

使用带壳程序进 irce 原版,查找无效的,L3 修复,修不了的就剪切,修复转存完整镜像的

image-20230822083659624

# 模拟跟踪

第 n-1 次异常,转到 se

image-20230822083719816

下段,shift + f9

tc eip < 42c000

image-20230822083735883

# 两次内存

rsrc

text

# exe32

# esp

image-20230822083751223

# IsDeubggerPresent

BP IsDebuggerPresent

shift + F9

取消断点

alt+f9

image-20230822083802156

两个 edi 相加的值就是 oep

image-20230822083813219

# win

# 条件断点

单步到 je 0040A41E 下条件断点 eax == 0

image-20230822083836244

image-20230822083847088

https://www.yii666.com/blog/352695.html

https://www.cnblogs.com/z5onk0/p/17287215.html

https://zhuanlan.zhihu.com/p/597893560?utm_id=0

# 附加数据处理方法

显示 overlay 标识带有附加数据

image-20230822083909084

先脱壳,脱壳玩之后已经不能打开,接着找附加数据,打开源程序 8c00 之后的附加数据,一直复制到最后

image-20230823202125880

在脱壳后的程序最后粘贴即可

image-20230823202143088

建议使用 hex workshop

计算开始位置

image-20230823202203988

最后一个区段的大小的偏移 8800+400

或者使用 overlay 最终版

# 去除自校验

程序脱壳后,和源程序对比,找到和源程序不一样的地方

两个程序都用 od 打开,下 bp CreateFileA

运行;

alt + f9

image-20230823202221116

逐行对比找到不一样的地方

image-20230823202234145

脱壳后的跳转实现了,把脱壳后改成和原来改成一样的,保存

即可正常执行

# 脱壳简单应用 - 汉化 - diy

vb 类软件用 getvbresource

image-20230823202249108

c 类汉化用 reource hacker peexploer xnresoure

如果不能显示说明脱壳没脱干净,需要 fix

image-20230823202304474

image-20230823202316491

C++ 类

XNRreoute

# ASP 变形壳

# 单步

近 call F7 远 call F8

# 脱 ASP 变形壳 0.1 汉化版

跟进第一个 jmp

image-20230823202332415

单步之后进入循环,统计多少次跳转之后会执行。注意下段

image-20230823202357774

58 次之后程序运行,指定到第 57 次

image-20230823202408619

image-20230823202420672

image-20230823202429950

OEP

image-20230823202448642

# 脚本脱壳

image-20230823202505697

# ACProtect

image-20230823202517781

1。设置异常,隐藏 OD

image-20230823202532446

image-20230823202543177

shift + f9 到程序运行前的最后一次异常, 即 int

image-20230823202558623

2。SE 处下内存访问断点

image-20230823202610173

3。SHIFT+F9,F2,再一次 SHIFT+F9,下断,再一次 SHIFT+F9。运行到下面

image-20230823202621786

4,取消所有断点

总共删除三个断点,两个 F2 一个内存访问

image-20230823202633995

5,内存,00401000。F2,SHIFT+F9

image-20230823202651096

6,直达 OEP!!

7。修复,脱壳成功

# ACProtect (stolen)

image-20230823202701371

和正常的 acprotect 一样,但是在第四步到 retn 之后需要找被偷的代码

编辑条件,c++ 入口特征为 push ebp

image-20230823202716512

ctrl + f11 跟踪进入 ,到被偷的代码,一共被偷了 6 个字节

image-20230823202729791

004254C9 55 push ebp

004254CA 8BEC mov ebp,esp

004254CC 83EC 44 sub esp,44

重新到 oep,修复

image-20230823202743559

image-20230823202757044

指定 10cc 为新的 eip

image-20230823202812165

脱壳,不要选择重建输入表

image-20230823202824896

修复:使用源程序修复,不要使用脱壳后的修复

image-20230823202838534

修复完修正转存即可

image-20230823202854598

# 寻找修饰的 stolen code

1。设置异常(忽略除 INT3 中断的所有异常),隐藏 OD

image-20230823202905273

2。来到入口点,F9 运行

004AC000 > 60 pushad // 记住这个

004AC001 4E dec esi

004AC002 D3D6 rcl esi,cl

004AC004 4E dec esi

004AC005 66:D3E8 shr ax,cl

004AC008 4E dec esi

004AC009 8BC3 mov eax,ebx

004AC00B 48 dec eax

3。程序中断在这里

004BAB23 90 nop // 这其实也是最后一次异常

004BAB24 64:67:8F06 0000 pop dword ptr fs:[0]

004BAB2A 83C4 04 add esp,4

004BAB2D 60 pushad

004BAB2E E8 00000000 call NetClean.004BAB33

004BAB33 5E pop esi

004BAB34 83EE 06 sub esi,6

004BAB37 B9 5B000000 mov ecx,5B

004BAB3C 29CE sub esi,ecx

004BAB3E BA 09E5B87E mov edx,7EB8E509

004BAB43 C1E9 02 shr ecx,2

004BAB46 83E9 02 sub ecx,2

004BAB49 83F9 00 cmp ecx,0

004BAB4C 7C 1A jl short NetClean.004BAB68

004BAB4E 8B048E mov eax,dword ptr ds:[esi+ecx*4]

4。看堆栈,找 SE 句柄,数据窗口跟随,下硬件访问断点,shift+F9

5. 下断,再次 SHIFT+F9,下断,再次 SHIFT+F9,取消所有断点,直接 F4 到 RETN 处

image-20230823202918479

6。下 d 12ffc0,下硬件断点。SHIFT+F9。

image-20230823202932026

7。记下 Stolen Code 。

image-20230823203013137

004C9B31 55 push ebp

004C9B32 8BEC mov ebp,esp

004C9B34 6A FF push -1

8。找到内存,在 00401000 处下断,F2,SHIFT+F9。

image-20230823203022284

004431F9 68 D8B24400 push NetClean.0044B2D8 // 这里其实是假的 OEP!!

004431FE 68 B4334400 push NetClean.004433B4 ; jmp 到

00443203 64:A1 00000000 mov eax,dword ptr fs:[0]

00443209 50 push eax

0044320A 64:8925 0000000>mov dword ptr fs:[0],esp

00443211 83EC 68 sub esp,68

00443214 53 push ebx

9。写入真实的代码!!

注意先分析,在按字节滚动,不然代码会乱

ctrl + 方向键

image-20230823203035385

10。OD 插件脱壳,注意,修正 OEP 地址!!

11。IR 修复,用等级 3。不能修复的 CUT 掉。抓取修复。程序还是抱错!

12。用 OD 打开 11 步修复过得程序,做下处理。来到壳的入口。也就是第一步记下的地址

CTRL+G,004AC000

13,写入真的 OEP 代码。保存

image-20230823203053278

14。Lord PE 修正入口点

image-20230823203103610

15。保存,脱壳成功!

# ACProtect 2.x

VB 程序:

先根据 ACP 上面的方法找到 oep

image-20230823203115600

修复:

image-20230823203133544

VB 第一个 push 是堆栈中第二行的值

第二个 call 是最后一个 jmp 的值

程序二:

1. 下断:bp GetCurrentProcessId,F9

img

2。

7C809940 > 64:A1 18000000 mov eax,dword ptr fs:[18] // 断在这,取消断点

7C809946 8B40 20 mov eax,dword ptr ds:[eax+20]

7C809949 C3 retn

3。用 Lord PE 查 OD 的 PID。

4。把 2 中的代码改为

7C809940 > B8 3C150000 mov eax,153C (当然,PID 号每次都会变)

7C809945 90 nop

7C809946 90 nop

7C809947 90 nop

7C809948 90 nop

7C809949 C3 retn

image-20230823203215898

5。下断,BP GetModuleHandleA,F9

6。

7C80B6C1 > 8BFF mov edi,edi // 断在这

7C80B6C3 55 push ebp

7C80B6C4 8BEC mov ebp,esp

7C80B6C6 837D 08 00 cmp dword ptr ss:[ebp+8],0

7C80B6CA 74 18 je short kernel32.7C80B6E4

7C80B6CC FF75 08 push dword ptr ss:[ebp+8]

7C80B6CF E8 C0290000 call kernel32.7C80E094

7C80B6D4 85C0 test eax,eax

7C80B6D6 74 08 je short kernel32.7C80B6E0

7C80B6D8 FF70 04 push dword ptr ds:[eax+4]

image-20230823203229480

7。来到内存,在 CODE 断下内存访问断点,F9 运行,出现 NAG 窗口,点确定后,来到 OEP!!!

00402150 55 push ebp //OEP!!

00402151 8BEC mov ebp,esp

00402153 83C4 F0 add esp,-10

00402156 53 push ebx

00402157 B8 10214000 mov eax,ACP_Feed.00402110

0040215C E8 4FFCFFFF call ACP_Feed.00401DB0

00402161 68 C4214000 push ACP_Feed.004021C4 ; ASCII “ACProtect Feedback Form”

00402166 6A 00 push 0

00402168 6A 00 push 0

image-20230823203240237

8。脱壳,修复。用等级 3!或者手动找 MessageBoxA

9。抓取,脱壳成功!!

#

# 特殊的 ACProtect

取消忽略 int3,程序断在这边

image-20230823203249815

使用堆栈窗口中 se 大法

image-20230823203259109

取消所有断点

找到假的 oep

重新载入,使用 esp 大法

运行到程序执行前

image-20230823203310181

脱壳

修正,完整转存

修复,oep 写假的 oep

image-20230823203322391

修复 IAT 未果,剪切 iat,修复转存,转存之前把 oep 改到运行之前的地址

image-20230823203332596

# anti protect

补区段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
1、忽略所有异常

2、打开内存镜像,在.rdata处F2,SHIFT+F9

没有.rdata用.idata

3、
0043383D 8B46 0C mov eax,dword ptr ds:[esi+C] //中断在这里
00433840 0BC0 or eax,eax
00433842 0F84 25020000 je NgaMy.00433A6D
00433848 8366 0C 00 and dword ptr ds:[esi+C],0
0043384C 03C2 add eax,edx
0043384E 8BD8 mov ebx,eax
00433850 56 push esi
00433851 57 push edi
00433852 50 push eax
00433853 8BF3 mov esi,ebx
00433855 8BFB mov edi,ebx
00433857 AC lods byte ptr ds:[esi]
00433858 C0C0 03 rol al,3
0043385B AA stos byte ptr es:[edi]
0043385C 803F 00 cmp byte ptr ds:[edi],0
0043385F ^ 75 F6 jnz short NgaMy.00433857
00433861 58 pop eax
00433862 5F pop edi
00433863 5E pop esi
00433864 50 push eax
00433865 FF95 90E24100 call dword ptr ss:[ebp+41E290]
0043386B 0BC0 or eax,eax
0043386D 75 43 jnz short NgaMy.004338B2
0043386F 90 nop
00433870 90 nop
00433871 90 nop
00433872 90 nop
00433873 53 push ebx
00433874 FF95 94E24100 call dword ptr ss:[ebp+41E294]
0043387A 0BC0 or eax,eax
0043387C 75 34 jnz short NgaMy.004338B2
0043387E 90 nop
0043387F 90 nop
00433880 90 nop
00433881 90 nop
00433882 8B95 1FFC4000 mov edx,dword ptr ss:[ebp+40FC1F]
00433888 0195 1D1F4000 add dword ptr ss:[ebp+401F1D],edx
0043388E 0195 211F4000 add dword ptr ss:[ebp+401F21],edx
00433894 6A 00 push 0
00433896 FFB5 1D1F4000 push dword ptr ss:[ebp+401F1D]
0043389C FFB5 211F4000 push dword ptr ss:[ebp+401F21]
004338A2 6A 00 push 0
004338A4 FF95 9CE24100 call dword ptr ss:[ebp+41E29C]
004338AA 6A 00 push 0
004338AC FF95 98E24100 call dword ptr ss:[ebp+41E298]
004338B2 60 pushad
004338B3 2BC0 sub eax,eax
004338B5 8803 mov byte ptr ds:[ebx],al
004338B7 43 inc ebx
004338B8 3803 cmp byte ptr ds:[ebx],al
004338BA ^ 75 F9 jnz short NgaMy.004338B5
004338BC 61 popad
004338BD 8985 17FC4000 mov dword ptr ss:[ebp+40FC17],eax
004338C3 C785 1BFC4000 00000>mov dword ptr ss:[ebp+40FC1B],0
004338CD 8B95 1FFC4000 mov edx,dword ptr ss:[ebp+40FC1F]
004338D3 8B06 mov eax,dword ptr ds:[esi]
004338D5 0BC0 or eax,eax
004338D7 75 07 jnz short NgaMy.004338E0
004338D9 90 nop
004338DA 90 nop
004338DB 90 nop
004338DC 90 nop
004338DD 8B46 10 mov eax,dword ptr ds:[esi+10]
004338E0 03C2 add eax,edx
004338E2 0385 1BFC4000 add eax,dword ptr ss:[ebp+40FC1B]
004338E8 8B18 mov ebx,dword ptr ds:[eax]
004338EA 8B7E 10 mov edi,dword ptr ds:[esi+10]
004338ED 03FA add edi,edx
004338EF 03BD 1BFC4000 add edi,dword ptr ss:[ebp+40FC1B]
004338F5 85DB test ebx,ebx
004338F7 0F84 62010000 je NgaMy.00433A5F
004338FD F7C3 00000080 test ebx,80000000
00433903 75 1D jnz short NgaMy.00433922
00433905 90 nop
00433906 90 nop
00433907 90 nop
00433908 90 nop
00433909 03DA add ebx,edx
0043390B 83C3 02 add ebx,2
0043390E 56 push esi
0043390F 57 push edi
00433910 50 push eax
00433911 8BF3 mov esi,ebx
00433913 8BFB mov edi,ebx
00433915 AC lods byte ptr ds:[esi]
00433916 C0C0 03 rol al,3
00433919 AA stos byte ptr es:[edi]
0043391A 803F 00 cmp byte ptr ds:[edi],0
0043391D ^ 75 F6 jnz short NgaMy.00433915
0043391F 58 pop eax
00433920 5F pop edi
00433921 5E pop esi
00433922 3B9D 1FFC4000 cmp ebx,dword ptr ss:[ebp+40FC1F]
00433928 7C 11 jl short NgaMy.0043393B
0043392A 90 nop
0043392B 90 nop
0043392C 90 nop
0043392D 90 nop
0043392E 83BD 02244000 00 cmp dword ptr ss:[ebp+402402],0
00433935 75 0A jnz short NgaMy.00433941
00433937 90 nop
00433938 90 nop
00433939 90 nop
0043393A 90 nop
0043393B 81E3 FFFFFF0F and ebx,0FFFFFFF
00433941 53 push ebx
00433942 FFB5 17FC4000 push dword ptr ss:[ebp+40FC17]
00433948 FF95 8CE24100 call dword ptr ss:[ebp+41E28C]
0043394E 3B9D 1FFC4000 cmp ebx,dword ptr ss:[ebp+40FC1F]
00433954 7C 0F jl short NgaMy.00433965
00433956 90 nop
00433957 90 nop
00433958 90 nop
00433959 90 nop
0043395A 60 pushad
0043395B 2BC0 sub eax,eax
0043395D 8803 mov byte ptr ds:[ebx],al
0043395F 43 inc ebx
00433960 3803 cmp byte ptr ds:[ebx],al
00433962 ^ 75 F9 jnz short NgaMy.0043395D
00433964 61 popad
00433965 0BC0 or eax,eax
00433967 ^ 0F84 15FFFFFF je NgaMy.00433882
0043396D 3B85 9CE24100 cmp eax,dword ptr ss:[ebp+41E29C] //处理MessageBoxA
00433973 74 20 je short NgaMy.00433995 //NOP掉
00433975 90 nop
00433976 90 nop
00433977 90 nop
00433978 90 nop
00433979 3B85 9D014100 cmp eax,dword ptr ss:[ebp+41019D] //处理RegisterHotKey
0043397F 74 09 je short NgaMy.0043398A //NOP掉
00433981 90 nop
00433982 90 nop
00433983 90 nop
00433984 90 nop
00433985 EB 14 jmp short NgaMy.0043399B
00433987 90 nop
00433988 90 nop
00433989 90 nop
0043398A 8D85 0A024100 lea eax,dword ptr ss:[ebp+41020A]
00433990 EB 09 jmp short NgaMy.0043399B
00433992 90 nop
00433993 90 nop
00433994 90 nop
00433995 8D85 24024100 lea eax,dword ptr ss:[ebp+410224]
0043399B 56 push esi
0043399C FFB5 17FC4000 push dword ptr ss:[ebp+40FC17]
004339A2 5E pop esi
004339A3 39B5 FA234000 cmp dword ptr ss:[ebp+4023FA],esi
004339A9 74 15 je short NgaMy.004339C0
004339AB 90 nop
004339AC 90 nop
004339AD 90 nop
004339AE 90 nop
004339AF 39B5 FE234000 cmp dword ptr ss:[ebp+4023FE],esi
004339B5 74 09 je short NgaMy.004339C0
004339B7 90 nop
004339B8 90 nop
004339B9 90 nop
004339BA 90 nop
004339BB EB 63 jmp short NgaMy.00433A20
004339BD 90 nop
004339BE 90 nop
004339BF 90 nop
004339C0 80BD D2594100 00 cmp byte ptr ss:[ebp+4159D2],0
004339C7 74 57 je short NgaMy.00433A20 //magic跳,改JMP
004339C9 90 nop
004339CA 90 nop
004339CB 90 nop
004339CC 90 nop
004339CD EB 07 jmp short NgaMy.004339D6
004339CF 90 nop
004339D0 90 nop
004339D1 90 nop
004339D2 0100 add dword ptr ds:[eax],eax
004339D4 0000 add byte ptr ds:[eax],al
004339D6 8BB5 E4FC4000 mov esi,dword ptr ss:[ebp+40FCE4]
004339DC 83C6 0D add esi,0D
004339DF 81EE EA1B4000 sub esi,NgaMy.00401BEA
004339E5 2BF5 sub esi,ebp
004339E7 83FE 00 cmp esi,0
004339EA 7F 34 jg short NgaMy.00433A20
004339EC 90 nop
004339ED 90 nop
004339EE 90 nop
004339EF 90 nop

4、在00401000处内存访问断点,SHIFT+F9

00403D38 68 8C3D4000 push NgaMy.00403D8C //中断在这里
00403D3D 64:A1 00000000 mov eax,dword ptr fs:[0]
00403D43 50 push eax
00403D44 8B4424 10 mov eax,dword ptr ss:[esp+10]
00403D48 896C24 10 mov dword ptr ss:[esp+10],ebp
00403D4C 8D6C24 10 lea ebp,dword ptr ss:[esp+10]
00403D50 2BE0 sub esp,eax
00403D52 53 push ebx
00403D53 56 push esi
00403D54 57 push edi
00403D55 8B45 F8 mov eax,dword ptr ss:[ebp-8]
00403D58 8965 E8 mov dword ptr ss:[ebp-18],esp
00403D5B 50 push eax
00403D5C 8B45 FC mov eax,dword ptr ss:[ebp-4]
00403D5F C745 FC FFFFFFFF mov dword ptr ss:[ebp-4],-1
00403D66 8945 F8 mov dword ptr ss:[ebp-8],eax
00403D69 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00403D6C 64:A3 00000000 mov dword ptr fs:[0],eax
00403D72 C3 retn //运行到这里,然后F8

5、接着SHIFT+F9

00405560 3D 00100000 cmp eax,1000 //中断在这里
00405565 73 0E jnb short NgaMy.00405575
00405567 F7D8 neg eax
00405569 03C4 add eax,esp
0040556B 83C0 04 add eax,4
0040556E 8500 test dword ptr ds:[eax],eax
00405570 94 xchg eax,esp
00405571 8B00 mov eax,dword ptr ds:[eax]
00405573 50 push eax
00405574 C3 retn //F4,然后F8

6。再SHIFT+F9

0040305C 83F9 02 cmp ecx,2 //中断在这里,这里就是假OEP
0040305F 74 0C je short NgaMy.0040306D
00403061 81CE 00800000 or esi,8000
00403067 8935 B0DE4000 mov dword ptr ds:[40DEB0],esi
0040306D C1E0 08 shl eax,8
00403070 03C2 add eax,edx
00403072 A3 B4DE4000 mov dword ptr ds:[40DEB4],eax
00403077 33F6 xor esi,esi
00403079 56 push esi
0040307A 8B3D B0A04000 mov edi,dword ptr ds:[40A0B0] ; kernel32.GetModuleHandleA
00403080 FFD7 call edi
00403082 66:8138 4D5A cmp word ptr ds:[eax],5A4D


7。脱壳,修复

8、重新载入,在pushad 下用ESP定律

hr 0012ffa4,SHIFT+F9(5次),来到这里

004365F4 8915 F5FD4100 mov dword ptr ds:[41FDF5],edx ; ntdll.KiFastSystemCallRet
004365FA FF35 F5FD4100 push dword ptr ds:[41FDF5]
00436600 8F05 2DFE4100 pop dword ptr ds:[41FE2D]
00436606 FF35 2DFE4100 push dword ptr ds:[41FE2D]
0043660C C70424 60000000 mov dword ptr ss:[esp],60
00436613 56 push esi
00436614 890C24 mov dword ptr ss:[esp],ecx
00436617 68 8DFD4100 push NgaMy.0041FD8D
0043661C 59 pop ecx
0043661D 8919 mov dword ptr ds:[ecx],ebx
0043661F 8B0C24 mov ecx,dword ptr ss:[esp]
00436622 8F05 ADFE4100 pop dword ptr ds:[41FEAD]
00436628 FF35 8DFD4100 push dword ptr ds:[41FD8D]
0043662E C70424 48A24000 mov dword ptr ss:[esp],NgaMy.0040A248
00436635 8905 B9FD4100 mov dword ptr ds:[41FDB9],eax
0043663B FF35 B9FD4100 push dword ptr ds:[41FDB9]
00436641 90 nop
00436642 90 nop
00436643 60 pushad
00436644 E8 01000000 call NgaMy.0043664A //F4到这里,然后用ESP



pushad 上面的就是Stolen Code(NOP可以不复制),复制下来:

89 15 F5 FD 41 00 FF 35 F5 FD 41 00 8F 05 2D FE 41 00 FF 35 2D FE 41 00 C7 04 24 60 00 00 00 56
89 0C 24 68 8D FD 41 00 59 89 19 8B 0C 24 8F 05 AD FE 41 00 FF 35 8D FD 41 00 C7 04 24 48 A2 40
00 89 05 B9 FD 41 00 FF 35 B9 FD 41 00

9、hr 0012ff98,F9

00436F16 68 1DFD4100 push NgaMy.0041FD1D
00436F1B 58 pop eax
00436F1C 8930 mov dword ptr ds:[eax],esi
00436F1E 8F05 79FC4100 pop dword ptr ds:[41FC79]
00436F24 8B05 79FC4100 mov eax,dword ptr ds:[41FC79]
00436F2A FF35 1DFD4100 push dword ptr ds:[41FD1D]
00436F30 56 push esi
00436F31 891C24 mov dword ptr ss:[esp],ebx
00436F34 C70424 383D4000 mov dword ptr ss:[esp],NgaMy.00403D38
00436F3B 8B3424 mov esi,dword ptr ss:[esp]
00436F3E 8F05 A5FE4100 pop dword ptr ds:[41FEA5]
00436F44 8905 01FF4100 mov dword ptr ds:[41FF01],eax
00436F4A FF35 01FF4100 push dword ptr ds:[41FF01]
00436F50 891C24 mov dword ptr ss:[esp],ebx
00436F53 56 push esi
00436F54 C70424 45FE4100 mov dword ptr ss:[esp],NgaMy.0041FE45
00436F5B 8F05 31FE4100 pop dword ptr ds:[41FE31]
00436F61 90 nop
00436F62 90 nop
00436F63 60 pushad
00436F64 E8 01000000 call NgaMy.00436F6A

都是同样处理!!

68 1D FD 41 00 58 89 30 8F 05 79 FC 41 00 8B 05 79 FC 41 00 FF 35 1D FD 41 00 56 89 1C 24 C7 04
24 38 3D 40 00 8B 34 24 8F 05 A5 FE 41 00 89 05 01 FF 41 00 FF 35 01 FF 41 00 89 1C 24 56 C7 04
24 45 FE 41 00 8F 05 31 FE 41 00

10、hr 0012ff94,F9

0043783F 8B1D 31FE4100 mov ebx,dword ptr ds:[41FE31] ; NgaMy.0041FE45
00437845 8933 mov dword ptr ds:[ebx],esi
00437847 8F05 39FC4100 pop dword ptr ds:[41FC39]
0043784D FF35 39FC4100 push dword ptr ds:[41FC39]
00437853 5B pop ebx
00437854 8F05 09FE4100 pop dword ptr ds:[41FE09]
0043785A 891D 21FC4100 mov dword ptr ds:[41FC21],ebx
00437860 FF35 21FC4100 push dword ptr ds:[41FC21]
00437866 C705 19FC4100 09FE4>mov dword ptr ds:[41FC19],NgaMy.0041FE09
00437870 8B1D 19FC4100 mov ebx,dword ptr ds:[41FC19]
00437876 8B33 mov esi,dword ptr ds:[ebx]
00437878 8F05 FDFB4100 pop dword ptr ds:[41FBFD]
0043787E 8B1D FDFB4100 mov ebx,dword ptr ds:[41FBFD]
00437884 FF15 45FE4100 call dword ptr ds:[41FE45]
0043788A 90 nop
0043788B 90 nop
0043788C 60 pushad
0043788D E8 01000000 call NgaMy.00437893

8B 1D 31 FE 41 00 89 33 8F 05 39 FC 41 00 FF 35 39 FC 41 00 5B 8F 05 09 FE 41 00 89 1D 21 FC 41
00 FF 35 21 FC 41 00 C7 05 19 FC 41 00 09 FE 41 00 8B 1D 19 FC 41 00 8B 33 8F 05 FD FB 41 00 8B
1D FD FB 41 00 FF 15 45 FE 41 00


11、hr 0012ff24,F9(多几次)

0043813D 890D B1FD4100 mov dword ptr ds:[41FDB1],ecx
00438143 FF35 B1FD4100 push dword ptr ds:[41FDB1]
00438149 8F05 B5FC4100 pop dword ptr ds:[41FCB5]
0043814F FF35 B5FC4100 push dword ptr ds:[41FCB5]
00438155 56 push esi
00438156 BE FDFC4100 mov esi,NgaMy.0041FCFD
0043815B 893E mov dword ptr ds:[esi],edi
0043815D 5E pop esi
0043815E FF35 FDFC4100 push dword ptr ds:[41FCFD]
00438164 68 94000000 push 94
00438169 8F05 E5FC4100 pop dword ptr ds:[41FCE5]
0043816F FF35 E5FC4100 push dword ptr ds:[41FCE5]
00438175 5F pop edi
00438176 893D 3DFE4100 mov dword ptr ds:[41FE3D],edi
0043817C FF35 3DFE4100 push dword ptr ds:[41FE3D]
00438182 8B0C24 mov ecx,dword ptr ss:[esp]
00438185 8F05 7DFE4100 pop dword ptr ds:[41FE7D]
0043818B 90 nop
0043818C 90 nop
0043818D 60 pushad
0043818E 50 push eax

89 0D B1 FD 41 00 FF 35 B1 FD 41 00 8F 05 B5 FC 41 00 FF 35 B5 FC 41 00 56 BE FD FC 41 00 89 3E
5E FF 35 FD FC 41 00 68 94 00 00 00 8F 05 E5 FC 41 00 FF 35 E5 FC 41 00 5F 89 3D 3D FE 41 00 FF
35 3D FE 41 00 8B 0C 24 8F 05 7D FE 41 00

12、hr 0012ff1c,F9(多试几次)

00438ACD 8B3C24 mov edi,dword ptr ss:[esp]
00438AD0 8F05 79FD4100 pop dword ptr ds:[41FD79] ; ntdll.7C930738
00438AD6 8935 25FC4100 mov dword ptr ds:[41FC25],esi
00438ADC FF35 25FC4100 push dword ptr ds:[41FC25]
00438AE2 890C24 mov dword ptr ss:[esp],ecx
00438AE5 8B3C24 mov edi,dword ptr ss:[esp]
00438AE8 8F05 B9FC4100 pop dword ptr ds:[41FCB9]
00438AEE 8F05 19FE4100 pop dword ptr ds:[41FE19]
00438AF4 8905 89FD4100 mov dword ptr ds:[41FD89],eax
00438AFA FF35 89FD4100 push dword ptr ds:[41FD89]
00438B00 57 push edi
00438B01 BF 19FE4100 mov edi,NgaMy.0041FE19
00438B06 8BC7 mov eax,edi
00438B08 5F pop edi
00438B09 8B08 mov ecx,dword ptr ds:[eax]
00438B0B 8F05 95FC4100 pop dword ptr ds:[41FC95]
00438B11 8B05 95FC4100 mov eax,dword ptr ds:[41FC95]
00438B17 53 push ebx
00438B18 90 nop
00438B19 90 nop
00438B1A 60 pushad
00438B1B 50 push eax


8B 3C 24 8F 05 79 FD 41 00 89 35 25 FC 41 00 FF 35 25 FC 41 00 89 0C 24 8B 3C 24 8F 05 B9 FC 41
00 8F 05 19 FE 41 00 89 05 89 FD 41 00 FF 35 89 FD 41 00 57 BF 19 FE 41 00 8B C7 5F 8B 08 8F 05
95 FC 41 00 8B 05 95 FC 41 00 53

13、hr 0012ff20,F9

004393FF 8F05 5DFE4100 pop dword ptr ds:[41FE5D] ; 0012FF40
00439405 FF35 5DFE4100 push dword ptr ds:[41FE5D]
0043940B 890C24 mov dword ptr ss:[esp],ecx
0043940E 893D 91FE4100 mov dword ptr ds:[41FE91],edi
00439414 FF35 91FE4100 push dword ptr ds:[41FE91]
0043941A 8F05 81FC4100 pop dword ptr ds:[41FC81]
00439420 891D 89FE4100 mov dword ptr ds:[41FE89],ebx
00439426 FF35 89FE4100 push dword ptr ds:[41FE89]
0043942C 68 81FC4100 push NgaMy.0041FC81
00439431 5B pop ebx
00439432 8B0B mov ecx,dword ptr ds:[ebx]
00439434 8F05 C9FC4100 pop dword ptr ds:[41FCC9]
0043943A 8B1D C9FC4100 mov ebx,dword ptr ds:[41FCC9]
00439440 57 push edi
00439441 890424 mov dword ptr ss:[esp],eax
00439444 890C24 mov dword ptr ss:[esp],ecx
00439447 8B0424 mov eax,dword ptr ss:[esp]
0043944A 90 nop
0043944B 90 nop
0043944C 60 pushad
0043944D 76 03 jbe short NgaMy.00439452

8F 05 5D FE 41 00 FF 35 5D FE 41 00 89 0C 24 89 3D 91 FE 41 00 FF 35 91 FE 41 00 8F 05 81 FC 41
00 89 1D 89 FE 41 00 FF 35 89 FE 41 00 68 81 FC 41 00 5B 8B 0B 8F 05 C9 FC 41 00 8B 1D C9 FC 41
00 57 89 04 24 89 0C 24 8B 04 24

14、hr 0012ff1c,F9

00439D39 8F05 D5FD4100 pop dword ptr ds:[41FDD5] ; ntdll.KiFastSystemCallRet
00439D3F 8B0C24 mov ecx,dword ptr ss:[esp]
00439D42 8F05 4DFC4100 pop dword ptr ds:[41FC4D]
00439D48 50 push eax
00439D49 891424 mov dword ptr ss:[esp],edx
00439D4C 8F05 BDFE4100 pop dword ptr ds:[41FEBD]
00439D52 FF35 BDFE4100 push dword ptr ds:[41FEBD]
00439D58 51 push ecx
00439D59 B9 DDFD4100 mov ecx,NgaMy.0041FDDD
00439D5E 8939 mov dword ptr ds:[ecx],edi
00439D60 59 pop ecx
00439D61 FF35 DDFD4100 push dword ptr ds:[41FDDD]
00439D67 C705 A9FE4100 60554>mov dword ptr ds:[41FEA9],NgaMy.00405560
00439D71 FF35 A9FE4100 push dword ptr ds:[41FEA9]
00439D77 8B3C24 mov edi,dword ptr ss:[esp]
00439D7A 8F05 95FD4100 pop dword ptr ds:[41FD95]
00439D80 891D 29FD4100 mov dword ptr ds:[41FD29],ebx
00439D86 90 nop
00439D87 90 nop
00439D88 60 pushad
00439D89 E8 01000000 call NgaMy.00439D8F

8F 05 D5 FD 41 00 8B 0C 24 8F 05 4D FC 41 00 50 89 14 24 8F 05 BD FE 41 00 FF 35 BD FE 41 00 51
B9 DD FD 41 00 89 39 59 FF 35 DD FD 41 00 C7 05 A9 FE 41 00 60 55 40 00 FF 35 A9 FE 41 00 8B 3C
24 8F 05 95 FD 41 00 89 1D 29 FD 41 00

15、hr 0012ff1c,F9

0043A6FB FF35 29FD4100 push dword ptr ds:[41FD29]
0043A701 8BDF mov ebx,edi
0043A703 8BD3 mov edx,ebx
0043A705 5B pop ebx
0043A706 8F05 E9FE4100 pop dword ptr ds:[41FEE9]
0043A70C 8B3D E9FE4100 mov edi,dword ptr ds:[41FEE9]
0043A712 52 push edx
0043A713 891C24 mov dword ptr ss:[esp],ebx
0043A716 68 9DFE4100 push NgaMy.0041FE9D
0043A71B 5B pop ebx
0043A71C 8913 mov dword ptr ds:[ebx],edx
0043A71E 8B1C24 mov ebx,dword ptr ss:[esp]
0043A721 8F05 49FE4100 pop dword ptr ds:[41FE49]
0043A727 8B1424 mov edx,dword ptr ss:[esp]
0043A72A 8F05 69FD4100 pop dword ptr ds:[41FD69]
0043A730 FF15 9DFE4100 call dword ptr ds:[41FE9D]
0043A736 8965 E8 mov dword ptr ss:[ebp-18],esp
0043A739 8925 C5FD4100 mov dword ptr ds:[41FDC5],esp
0043A73F 891D 21FD4100 mov dword ptr ds:[41FD21],ebx
0043A745 FF35 21FD4100 push dword ptr ds:[41FD21]
0043A74B 60 pushad
0043A74C 74 03 je short NgaMy.0043A751

FF 35 29 FD 41 00 8B DF 8B D3 5B 8F 05 E9 FE 41 00 8B 3D E9 FE 41 00 52 89 1C 24 68 9D FE 41 00
5B 89 13 8B 1C 24 8F 05 49 FE 41 00 8B 14 24 8F 05 69 FD 41 00 FF 15 9D FE 41 00 89 65 E8 89 25
C5 FD 41 00 89 1D 21 FD 41 00 FF 35 21 FD 41 00



16、hr 0012fe8c,F9

0043B097 68 C5FD4100 push NgaMy.0041FDC5
0043B09C 5B pop ebx
0043B09D 8B33 mov esi,dword ptr ds:[ebx]
0043B09F 8B1C24 mov ebx,dword ptr ss:[esp]
0043B0A2 8F05 A9FC4100 pop dword ptr ds:[41FCA9]
0043B0A8 893E mov dword ptr ds:[esi],edi
0043B0AA 57 push edi
0043B0AB 8F05 F5FE4100 pop dword ptr ds:[41FEF5]
0043B0B1 FF35 F5FE4100 push dword ptr ds:[41FEF5]
0043B0B7 893424 mov dword ptr ss:[esp],esi
0043B0BA FF15 BCA04000 call dword ptr ds:[40A0BC] ; NgaMy.0041F23F
0043B0C0 8B4E 10 mov ecx,dword ptr ds:[esi+10]
0043B0C3 50 push eax
0043B0C4 B8 F9FB4100 mov eax,NgaMy.0041FBF9
0043B0C9 8910 mov dword ptr ds:[eax],edx
0043B0CB 58 pop eax
0043B0CC FF35 F9FB4100 push dword ptr ds:[41FBF9]
0043B0D2 56 push esi
0043B0D3 C70424 ACDE4000 mov dword ptr ss:[esp],NgaMy.0040DEAC
0043B0DA 8B1424 mov edx,dword ptr ss:[esp]
0043B0DD 8F05 ADFD4100 pop dword ptr ds:[41FDAD]
0043B0E3 890A mov dword ptr ds:[edx],ecx
0043B0E5 90 nop
0043B0E6 90 nop
0043B0E7 60 pushad
0043B0E8 E8 01000000 call NgaMy.0043B0EE

68 C5 FD 41 00 5B 8B 33 8B 1C 24 8F 05 A9 FC 41 00 89 3E 57 8F 05 F5 FE 41 00 FF 35 F5 FE 41 00
89 34 24 FF 15 BC A0 40 00 8B 4E 10 50 B8 F9 FB 41 00 89 10 58 FF 35 F9 FB 41 00 56 C7 04 24 AC
DE 40 00 8B 14 24 8F 05 AD FD 41 00 89 0A

17、hr 0012fe8c,F9

0043B9DA 8F05 29FE4100 pop dword ptr ds:[41FE29] ; 7FFB0000
0043B9E0 FF35 29FE4100 push dword ptr ds:[41FE29]
0043B9E6 5A pop edx
0043B9E7 8B46 04 mov eax,dword ptr ds:[esi+4]
0043B9EA A3 B8DE4000 mov dword ptr ds:[40DEB8],eax
0043B9EF 8B56 08 mov edx,dword ptr ds:[esi+8]
0043B9F2 52 push edx
0043B9F3 8F05 3DFD4100 pop dword ptr ds:[41FD3D]
0043B9F9 FF35 3DFD4100 push dword ptr ds:[41FD3D]
0043B9FF 8F05 BCDE4000 pop dword ptr ds:[40DEBC]
0043BA05 8B76 0C mov esi,dword ptr ds:[esi+C]
0043BA08 81E6 FF7F0000 and esi,7FFF
0043BA0E 53 push ebx
0043BA0F BB 35FE4100 mov ebx,NgaMy.0041FE35
0043BA14 8933 mov dword ptr ds:[ebx],esi
0043BA16 5B pop ebx
0043BA17 FF35 35FE4100 push dword ptr ds:[41FE35]
0043BA1D 8F05 B0DE4000 pop dword ptr ds:[40DEB0]
0043BA23 90 nop
0043BA24 90 nop
0043BA25 60 pushad
0043BA26 E8 01000000 call NgaMy.0043BA2C




8F 05 29 FE 41 00 FF 35 29 FE 41 00 5A 8B 46 04 A3 B8 DE 40 00 8B 56 08 52 8F 05 3D FD 41 00 FF
35 3D FD 41 00 8F 05 BC DE 40 00 8B 76 0C 81 E6 FF 7F 00 00 53 BB 35 FE 41 00 89 33 5B FF 35 35
FE 41 00 8F 05 B0 DE 40 00

18、hr 0012fe90,F9

0043BE77 /EB 01 jmp short NgaMy.0043BE7A //F8
0043BE79 |E8 FF25BCBE call BEFFE47D
0043BE7E 43 inc ebx
0043BE7F 0060 E8 add byte ptr ds:[eax-18],ah
0043BE82 0000 add byte ptr ds:[eax],al
0043BE84 0000 add byte ptr ds:[eax],al
0043BE86 5E pop esi
0043BE87 83EE 06 sub esi,6
0043BE8A B9 66000000 mov ecx,66
0043BE8F 29CE sub esi,ecx
0043BE91 BA 8A261D6A mov edx,6A1D268A
0043BE96 C1E9 02 shr ecx,2
0043BE99 83E9 02 sub ecx,2
0043BE9C 83F9 00 cmp ecx,0


0043BE7A - FF25 BCBE4300 jmp dword ptr ds:[43BEBC] ; NgaMy.0040305C //跳到OEP



19、把所有的代码汇总一下:


89 15 F5 FD 41 00 FF 35 F5 FD 41 00 8F 05 2D FE 41 00 FF 35 2D FE 41 00 C7 04 24 60 00 00 00 56
89 0C 24 68 8D FD 41 00 59 89 19 8B 0C 24 8F 05 AD FE 41 00 FF 35 8D FD 41 00 C7 04 24 48 A2 40
00 89 05 B9 FD 41 00 FF 35 B9 FD 41 00 68 1D FD 41 00 58 89 30 8F 05 79 FC 41 00 8B 05 79 FC 41
00 FF 35 1D FD 41 00 56 89 1C 24 C7 04 24 38 3D 40 00 8B 34 24 8F 05 A5 FE 41 00 89 05 01 FF 41
00 FF 35 01 FF 41 00 89 1C 24 56 C7 04 24 45 FE 41 00 8F 05 31 FE 41 00 8B 1D 31 FE 41 00 89 33
8F 05 39 FC 41 00 FF 35 39 FC 41 00 5B 8F 05 09 FE 41 00 89 1D 21 FC 41 00 FF 35 21 FC 41 00 C7
05 19 FC 41 00 09 FE 41 00 8B 1D 19 FC 41 00 8B 33 8F 05 FD FB 41 00 8B 1D FD FB 41 00 FF 15 45
FE 41 00 89 0D B1 FD 41 00 FF 35 B1 FD 41 00 8F 05 B5 FC 41 00 FF 35 B5 FC 41 00 56 BE FD FC 41
00 89 3E 5E FF 35 FD FC 41 00 68 94 00 00 00 8F 05 E5 FC 41 00 FF 35 E5 FC 41 00 5F 89 3D 3D FE
41 00 FF 35 3D FE 41 00 8B 0C 24 8F 05 7D FE 41 00 8B 3C 24 8F 05 79 FD 41 00 89 35 25 FC 41 00
FF 35 25 FC 41 00 89 0C 24 8B 3C 24 8F 05 B9 FC 41 00 8F 05 19 FE 41 00 89 05 89 FD 41 00 FF 35
89 FD 41 00 57 BF 19 FE 41 00 8B C7 5F 8B 08 8F 05 95 FC 41 00 8B 05 95 FC 41 00 53 8F 05 5D FE
41 00 FF 35 5D FE 41 00 89 0C 24 89 3D 91 FE 41 00 FF 35 91 FE 41 00 8F 05 81 FC 41 00 89 1D 89
FE 41 00 FF 35 89 FE 41 00 68 81 FC 41 00 5B 8B 0B 8F 05 C9 FC 41 00 8B 1D C9 FC 41 00 57 89 04
24 89 0C 24 8B 04 24 8F 05 D5 FD 41 00 8B 0C 24 8F 05 4D FC 41 00 50 89 14 24 8F 05 BD FE 41 00
FF 35 BD FE 41 00 51 B9 DD FD 41 00 89 39 59 FF 35 DD FD 41 00 C7 05 A9 FE 41 00 60 55 40 00 FF
35 A9 FE 41 00 8B 3C 24 8F 05 95 FD 41 00 89 1D 29 FD 41 00 FF 35 29 FD 41 00 8B DF 8B D3 5B 8F
05 E9 FE 41 00 8B 3D E9 FE 41 00 52 89 1C 24 68 9D FE 41 00 5B 89 13 8B 1C 24 8F 05 49 FE 41 00
8B 14 24 8F 05 69 FD 41 00 FF 15 9D FE 41 00 89 65 E8 89 25 C5 FD 41 00 89 1D 21 FD 41 00 FF 35
21 FD 41 00 68 C5 FD 41 00 5B 8B 33 8B 1C 24 8F 05 A9 FC 41 00 89 3E 57 8F 05 F5 FE 41 00 FF 35
F5 FE 41 00 89 34 24 FF 15 BC A0 40 00 8B 4E 10 50 B8 F9 FB 41 00 89 10 58 FF 35 F9 FB 41 00 56
C7 04 24 AC DE 40 00 8B 14 24 8F 05 AD FD 41 00 89 0A 8F 05 29 FE 41 00 FF 35 29 FE 41 00 5A 8B
46 04 A3 B8 DE 40 00 8B 56 08 52 8F 05 3D FD 41 00 FF 35 3D FD 41 00 8F 05 BC DE 40 00 8B 76 0C
81 E6 FF 7F 00 00 53 BB 35 FE 41 00 89 33 5B FF 35 35 FE 41 00 8F 05 B0 DE 40 00

20、用工具申请一个新的区段

记下起始的地址:0043E000

21、OD打开创建完后的。找到0043E000,粘贴入代码,保存

记住,后面得加跳向假OEP的代码!!

JMP 0040305C

22、修正入口点

# ASProtect 1.2/1.2C

# 最后一次异常

image-20230823203357806

到最后一次异常之后,在下一个 ret 下段,执行到下段的地方

image-20230823203409091

在 401000 下段

image-20230823203440885

运行来到 oep

image-20230823203451370

# ASProtect 1.23

忽略除内存访问以外的断点

image-20230823203502855

找到最后一次异常

image-20230823203515794

运行到 ret

image-20230823203526429

401000 下段

image-20230823203537369

到 oep

image-20230823203547637

或者运行到 retn 之后:

image-20230823203604011

hr 12ffa4 执行,到 oep

image-20230823203624615

# 使用工具修复

image-20230823203636722

运行,程序会在可能的 oep 暂停,这时在采用 rec 修复

# ASProtect 1.23 rc4

插件查壳

image-20230823203650794

版本的判断:

判断版本:

ASProtect 1.23 RC4 按 shift+f9 键 26 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 步跟就会来到 foep。

ASProtect 1.31 04.27 按 shift+f9 键 36 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 步跟就会来到 foep。

ASProtect 1.31 05.18 按 shift+f9 键 40 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 步跟就会来到 foep。

ASProtect 1.31 06.14 按 shift+f9 键 38 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 步跟就会来到 foep。

1、忽略除内存访问的所有异常,隐藏一下 OD,SHIFT+F9 26 次后来到最后一次异常

image-20230823203707216

00C739EC 3100 xor dword ptr ds:[eax],eax // 断在这

00C739EE 64:8F05 00000000 pop dword ptr fs:[0]

00C739F5 58 pop eax

00C739F6 833D B07EC700 00 cmp dword ptr ds:[C77EB0],0

00C739FD 74 14 je short 00C73A13

00C739FF 6A 0C push 0C

00C73A01 B9 B07EC700 mov ecx,0C77EB0

00C73A06 8D45 F8 lea eax,dword ptr ss:[ebp-8]

00C73A09 BA 04000000 mov edx,4

00C73A0E E8 2DD1FFFF call 00C70B40

00C73A13 FF75 FC push dword ptr ss:[ebp-4]

00C73A16 FF75 F8 push dword ptr ss:[ebp-8]

00C73A19 8B45 F4 mov eax,dword ptr ss:[ebp-C]

00C73A1C 8338 00 cmp dword ptr ds:[eax],0

00C73A1F 74 02 je short 00C73A23

00C73A21 FF30 push dword ptr ds:[eax]

00C73A23 FF75 F0 push dword ptr ss:[ebp-10]

00C73A26 FF75 EC push dword ptr ss:[ebp-14]

00C73A29 C3 retn

image-20230823203719637

2、在 RETN 处下断,SHIFT+F9,取消断点

image-20230823203733449

3、在堆栈窗口找显示程序名的下面 2 行,下 HR 12FFA4

4、一直 F8,到这里

00C85C47 BD 4D5CC800 mov ebp,0C85C4D

00C85C4C FF55 03 call dword ptr ss:[ebp+3] // 到这 F7 跟

00C85C4F E8 595CC800 call 0190B8AD

00C85C54 9A E969F29A 5DF3 call far F35D:9AF269E9

00C85C5B EB 02 jmp short 00C85C5F

00C85C5D CD20 1BE9EB02 vxdjump 2EBE91B

00C85C63 CD20 33E8EB02 vxdjump 2EBE833

00C85C69 CD20 EB010F8D vxdcall 8D0F01EB

00C85C6F 6C ins byte ptr es:[edi],dx

00C85C70 75 37 jnz short 00C85CA9

00C85C72 5D pop ebp

00C85C73 EB 01 jmp short 00C85C76

00C85C75 C7 ??? ; 未知命令

image-20230823203745294

5、一直 F7 跟,找抽取代码

(1)

00C84F0A 55 push ebp

00C84F0B 8BEC mov ebp,esp

00C84F0D 6A FF push -1

00C84F0F 68 78E35300 push 53E378

00C84F14 68 407B4F00 push 4F7B40

00C84F19 64:A1 00000000 mov eax,dword ptr fs:[0]

55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00

(2)

00C84F22 50 push eax

00C84F23 64:8925 00000000 mov dword ptr fs:[0],esp

00C84F2A 83EC 58 sub esp,58

50 64 89 25 00 00 00 00 83 EC 58

(3)

00C84F30 53 push ebx

53

(4)

00C84F34 56 push esi

56

(5)

00C84F38 57 push edi

00C84F39 8965 E8 mov dword ptr ss:[ebp-18],esp

57 89 65 E8

6、把代码汇总一下

image-20230823203758265

55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53 56 57 89 65 E8

7、继续 F7,来到这,就 F8

00C85B74 51 push ecx

00C85B75 57 push edi

00C85B76 9C pushfd

00C85B77 FC cld

00C85B78 BF B55BC800 mov edi,0C85BB5

00C85B7D B9 5E140000 mov ecx,145E

00C85B82 F3:AA rep stos byte ptr es:[edi]

00C85B84 9D popfd

00C85B85 5F pop edi

00C85B86 59 pop ecx

00C85B87 C3 retn

8、一直 F8 到这里,然后向上看

image-20230823203808712

004F27CF FF15 9CC25200 call dword ptr ds:[52C29C]

004F27D5 33D2 xor edx,edx

004F27D7 8AD4 mov dl,ah

004F27D9 8915 34306900 mov dword ptr ds:[693034],edx

004F27DF 8BC8 mov ecx,eax

004F27E1 81E1 FF000000 and ecx,0FF

004F27E7 890D 30306900 mov dword ptr ds:[693030],ecx

004F27ED C1E1 08 shl ecx,8

004F27F0 03CA add ecx,edx

004F27F2 890D 2C306900 mov dword ptr ds:[69302C],ecx

004F27F8 C1E8 10 shr eax,10

004F27FB A3 28306900 mov dword ptr ds:[693028],eax

004F2800 6A 01 push 1

004F2802 E8 933B0000 call SoWorker.004F639A

9、

004F27A4 C3 retn

004F27A5 33C0 xor eax,eax

004F27A7 ^ EB F8 jmp short SoWorker.004F27A1

004F27A9 0000 add byte ptr ds:[eax],al // 这里就是真正的 OEP 了

004F27AB 0000 add byte ptr ds:[eax],al

004F27AD 0000 add byte ptr ds:[eax],al

004F27AF 0000 add byte ptr ds:[eax],al

004F27B1 0000 add byte ptr ds:[eax],al

004F27B3 0000 add byte ptr ds:[eax],al

004F27B5 0000 add byte ptr ds:[eax],al

004F27B7 0000 add byte ptr ds:[eax],al

004F27B9 0000 add byte ptr ds:[eax],al

004F27BB 0000 add byte ptr ds:[eax],al

004F27BD 0000 add byte ptr ds:[eax],al

004F27BF 0000 add byte ptr ds:[eax],al

004F27C1 0000 add byte ptr ds:[eax],al

004F27C3 0000 add byte ptr ds:[eax],al

004F27C5 0000 add byte ptr ds:[eax],al

004F27C7 0000 add byte ptr ds:[eax],al

004F27C9 0000 add byte ptr ds:[eax],al

004F27CB 0000 add byte ptr ds:[eax],al

004F27CD 0000 add byte ptr ds:[eax],al

004F27CF FF15 9CC25200 call dword ptr ds:[52C29C]

004F27D5 33D2 xor edx,edx

10、补上代码,脱壳,修复

image-20230823203826479

先用等级 1,再用插件,都修不了直接删除。

转存后的修不了用远程程序修

或者使用 401000 下段也可以,但是还需要手动跟

# ASProtect 加壳 区段

如果壳中存在校验,会出现大问题

1、忽略除内存访问外的所有异常,SHIFT+F9,来到最后一次异常

2、来到最近的 RETN

image-20230823203836382

3、打开内存镜像,在 00401000 处下断,SHIFT+F9,到达假 OEP,记下

image-20230823203851980

004F27CF FF15 9CC25200 call dword ptr ds:[52C29C]

004F27D5 33D2 xor edx,edx

004F27D7 8AD4 mov dl,ah

004F27D9 8915 34306900 mov dword ptr ds:[693034],edx

004F27DF 8BC8 mov ecx,eax

004F27E1 81E1 FF000000 and ecx,0FF

004F27E7 890D 30306900 mov dword ptr ds:[693030],ecx

004F27ED C1E1 08 shl ecx,8

004F27F0 03CA add ecx,edx

004F27F2 890D 2C306900 mov dword ptr ds:[69302C],ecx

004F27F8 C1E8 10 shr eax,10

004F27FB A3 28306900 mov dword ptr ds:[693028],eax

004F2800 6A 01 push 1

004F2802 E8 933B0000 call SoWorker.004F639A

004F2807 59 pop ecx

004F2808 85C0 test eax,eax

004F280A 75 08 jnz short SoWorker.004F2814

4、重新来,重复上面 1 和 2 步,下 hr 0012ff68,SHIFT+F9,取消断点,F8,来到最佳的以壳解壳地方

image-20230823203912073

image-20230823203923850

00C85793 BB A2000000 mov ebx,0A2 // 最佳地

00C85798 0BDB or ebx,ebx

00C8579A 75 07 jnz short 00C857A3

00C8579C 894424 1C mov dword ptr ss:[esp+1C],eax

00C857A0 61 popad

00C857A1 50 push eax

00C857A2 C3 retn

00C857A3 E8 00000000 call 00C857A8

00C857A8 5D pop ebp

00C857A9 81ED 4DE14B00 sub ebp,4BE14D

5、完整转存,区域转存

image-20230823203941909

image-20230823203959096

选择区段,在最后一个区段选择从磁盘载入刚刚部分转存的区段

image-20230823204011420

image-20230823204023782

保存

image-20230823204034685

重建 pe

6、修复

image-20230823204045107

修改 oep 为 885793