2024年5月10日发(作者:)

脱壳过程:OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添

加以下几个异常C0000005(ACCESS VIOLATION)、C000

001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK

SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)

入口代码:

0105A000 N> 60 pushad

0105A001 E8 00000000 call NOTEPAD.0105A006

0105A006 5D pop ebp

0105A007 50 push eax

0105A008 51 push ecx

0105A009 0FCA bswap edx

0105A00B F7D2 not edx

0105A00D 9C pushfd

下bp OpenMutexA断点shift+F9运行,

77E62391 k> 55 push ebp---------中断在这里

77E62392 8BEC mov ebp,esp

77E62394 51 push ecx

77E62395 51 push ecx

77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0

77E6239A 56 push esi

77E6239B 0F84 C2E30100 je kernel32.77E80763

77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]

看堆栈

0006F710 0103229B /CALL 到 OpenMutexA 来自

NOTEPAD.01032295

0006F714 001F0001 |Access = 1F0001

0006F718 00000000 |Inheritable = FALSE

0006F71C 0006FDA0 MutexName = "52C:A9EEE0AC4"------注意

0006fda0,等下会用到

0006F720 00000004

0006F724 00000000

0006F728 010476B3 NOTEPAD.010476B3

Ctrl+G 01001000 键入以下代码:

为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本

例Ctrl+G 401000是无法写入调式

程序中的,而且401000处有代码(大家可以试一试),那么如何知道是

用Ctrl+G 01001000的呢?个人认

为是根据载入口的代码来确定的,形式是入口代码地址的前3位

+01000,如本例中的入口代码是:

0105A000 N> 60 pushad,取其地址中的前3位010,再加上

01000,合起来就是01001000。这样一来

许多教程中的Ctrl+G 401000是入口代码地址为004xxxxx的形式,

401000属于取其地址中的前3位010,再

加上01000中入口代码前3位为004的一个特例。

01001000 60 pushad

01001001 9C pushfd

01001002 68 A0FD0600 push 6FDA0 堆栈里看到的值

01001007 33C0 xor eax,eax

01001009 50 push eax

0100100A 50 push eax

0100100B E8 B5A6E576 call MutexA

01001010 9D popfd

01001011 61 popad