在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。
1.call
这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。
call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。例如:

00401029 . E8 DA240A00 call 004A3508
0040102E . 5A pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!

2.RET
与call对应的就是RET了。对于RET我们可以这样来理解:1.将当前的ESP中指向的地址出栈;2.JMP到这个地址。

这个就完成了一次调用子程序的过程。在这里关键的地方是:如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。这也就是著名的“堆栈平衡”原理!

3.狭义ESP定律

ESP定律的原理就是“堆栈平衡”原理。

让我们来到程序的入口处看看吧!

1.这个是加了UPX壳的入口时各个寄存器的值!
EAX 00000000
ECX 0012FFB0
EDX 7FFE0304
EBX 7FFDF000
ESP 0012FFC4
EBP 0012FFF0
ESI 77F51778 ntdll.77F51778
EDI 77F517E6 ntdll.77F517E6
EIP 0040EC90 note-upx.
C 0 ES 0023 32bit 0(FFFFFFFF)
P 1 CS 001B 32bit 0(FFFFFFFF)
A 0 SS 0023 32bit 0(FFFFFFFF)
Z 0 DS 0023 32bit 0(FFFFFFFF)
S 1 FS 0038 32bit 7FFDE000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)

2.这个是UPX壳JMP到OEP后的寄存器的值!
EAX 00000000
ECX 0012FFB0
EDX 7FFE0304
EBX 7FFDF000
ESP 0012FFC4
EBP 0012FFF0
ESI 77F51778 ntdll.77F51778
EDI 77F517E6 ntdll.77F517E6
EIP 004010CC note-upx.004010CC
C 0 ES 0023 32bit 0(FFFFFFFF)
P 1 CS 001B 32bit 0(FFFFFFFF)
A 0 SS 0023 32bit 0(FFFFFFFF)
Z 1 DS 0023 32bit 0(FFFFFFFF)
S 0 FS 0038 32bit 7FFDE000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)

呵呵~是不是除了EIP不同以外,其他都一模一样啊!

为什么会这样呢?
我们来看看UPX的壳的第一行:

0040EC90 n> 60 pushad //注意这里*
0040EC91 BE 15B04000 mov esi,note-upx.0040B015
PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:

0040EE0F 61 popad //注意这里*
0040EE10 - E9 B722FFFF jmp note-upx.004010CC //JMP到OEP

POP就是将所有寄存器出栈!

而当我们PUSHAD的时候,ESP将寄存器压入了0012FFC0–0012FFA4的堆栈中!如下:

0012FFA4 77F517E6 返回到 ntdll.77F517E6 来自 ntdll.77F78C4E //EDI
0012FFA8 77F51778 返回到 ntdll.77F51778 来自 ntdll.77F517B5 //ESI
0012FFAC 0012FFF0 //EBP
0012FFB0 0012FFC4 //ESP
0012FFB4 7FFDF000 //EBX
0012FFB8 7FFE0304 //EDX
0012FFBC 0012FFB0 //ECX
0012FFC0 00000000 //EAX

所以这个时候,在教程上面就告诉我们对ESP的0012FFA4下硬件访问断点。也就是说当程序要访问这些堆栈,从而恢复原来寄存器的值,准备跳向苦苦寻觅的OEP的时候,OD帮助我们中断下来。

于是我们停在0040EE10这一行!

总结:我们可以把壳假设为一个子程序,当壳把代码解压前和解压后,他必须要做的是遵循堆栈平衡的原理,让ESP执行到OEP的时候,使ESP=0012FFC4。

4.广义ESP定律

很多人看完了教程就会问:ESP定律是不是就是0012FFA4,ESP定律的适用范围是不是只能是压缩壳!

我的回答是:NO!

看完了上面你就知道你如果用0012FFA8也是可以的,ESP定律不仅用于压缩壳他也可以用于加密壳!!!

首先,告诉你一条经验也是事实—当PE文件运行开始的时候,也就是进入壳的第一行代码的时候。寄存器的值总是上面的那些值,不信你自己去试试!而当到达OEP后,绝大多的程序都第一句都是压栈!(除了BC编写的程序,BC一般是在下面几句压栈)

现在,根据上面的ESP原理,我们知道多数壳在运行到OEP的时候ESP=0012FFC4。这就是说程序的第一句是对0012FFC0进行写入操作!

最后我们得到了广义的ESP定律,对只要在0012FFC0下,硬件写入断点,我们就能停在OEP的第二句处!!

下面我们来举个例子,就脱壳进阶第一篇吧!

载入OD后,来到这里:

0040D042 N> B8 00D04000 mov eax,Notepad.0040D000 //停在这里
0040D047 68 4C584000 push Notepad.0040584C
0040D04C 64:FF35 00000000 push dword ptr fs:[0] //第一次硬件中断,F9
0040D053 64:8925 00000000 mov dword ptr fs:[0],esp
0040D05A 66:9C pushfw
0040D05C 60 pushad
0040D05D 50 push eax

直接对0012FFC0下硬件写入断点,F9运行。(注意硬件中断)

在0040D04C第一次硬件中断,F9继续!

0040D135 A4 movs byte ptr es:[edi],byte ptr ds:[esi] //访问异常,不管他 shift+F9继续
0040D136 33C9 xor ecx,ecx
0040D138 83FB 00 cmp ebx,0
0040D13B ^ 7E A4 jle short Notepad.0040D0E1

第二次硬件中断。

004058B5 64 db 64 //断在这里
004058B6 89 db 89
004058B7 1D db 1D
004058B8 00 db 00
004058B9 00 db 00

这里也不是,F9继续!

004010CC /. 55 push ebp
004010CD |. 8BEC mov ebp,esp //断在这里,哈哈,到了!(如果发现有花指令,用ctrl+A分析一下就能显示出来)
004010CF |. 83EC 44 sub esp,44
004010D2 |. 56 push esi

快吧!还不过瘾,在来一个例子。

脱壳进阶第二篇

如果按上面的方法断不下来,程序直接运行了!没什么,我们在用另一种方法!

载入后停在这里,用插件把OD隐藏!

0040DBD6 N>^\E9 25E4FFFF jmp Note_tEl.0040C000 //停在这里
0040DBDB 0000 add byte ptr ds:[eax],al
0040DBDD 0038 add byte ptr ds:[eax],bh
0040DBDF A4 movs byte ptr es:[edi],byte ptr ds:[esi]
0040DBE0 54 push esp

F9运行,然后用SHIFT+F9跳过异常来到这里:

0040D817 ^\73 DC jnb short Note_tEl.0040D7F5 //到这里
0040D819 CD20 64678F06 vxdcall 68F6764
0040D81F 0000 add byte ptr ds:[eax],al
0040D821 58 pop eax

在这里对0012FFC0下硬件写入断点!(命令行里键入HW 12FFC0)SHIFT+F9跳过异常,就来到OEP的第二行处:(用CTRL+A分析一下)

004010CC /. 55 push ebp
004010CD |. 8BEC mov ebp,esp //断在这里
004010CF |. 83EC 44 sub esp,44
004010D2 |. 56 push esi
004010D3 |. FF15 E4634000 call dword ptr ds:[4063E4]
004010D9 |. 8BF0 mov esi,eax
004010DB |. 8A00 mov al,byte ptr ds:[eax]
004010DD |. 3C 22 cmp al,22

就这样我们轻松搞定了两个加密壳的找OEP问题!

5.总结

现在我们可以轻松的回答一些问题了。

1.ESP定律的原理是什么?

堆栈平衡原理。

2.ESP定律的适用范围是什么?

几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。欢迎你将你的经验和我们分享。

3.是不是只能下断12FFA4的访问断点?

当然不是,那只是ESP定律的一个体现,我们运用的是ESP定律的原理,而不应该是他的具体数值,不能说12FFA4,或者12FFC0就是ESP定律,他们只是ESP定律的一个应用罢了!

4.对于STOLEN CODE我们怎么办?

哈哈,这正是寻找STOLEN CODE最好的办法!当我们断下时,正好断在了壳处理STOLEN CODE的地方,在F8一会就到OEP了!

6.后话

看了上面的文字希望能对你在寻找OEP的时候有帮助,但是别忘了一句话:菜鸟认为找OEP很难,高手认为修复才是最难! 好了,下一篇应该写IAT的修复原理了!让我们共同努力吧!

寻找真正的入口(OEP)–内存断点

Author:Lenus

1.前言
发现论坛中很多兄弟在询问:什么是二次内存断点,三次内存断点。还有很多人对内存断点的原理不是很明白。其实只要懂得壳是如何解压代码的,那么就完全可以按自己的喜欢来下断。

本文要解决的问题是:
1.什么是内存断点?
2.如何在寻找OEP时使用内存断点。
3.内存断点的局限性。

2.内存断点寻找OEP的原理
i.首先,在OD中内存断点和普通断点(F2下断)是有本质区别的。
内存断点等效与命令bpm,他的中断要用到DR0-DR7的调试寄存器,也就是说OD通过这些DR0-DR7的调试寄存器来判断是否断下
普通断点(F2下断)等效于bpx,他是在所执行的的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD处理,把这个异常的regEIP-1以后就正好停在了需要的中断的地方(这个根据系统不同会不一样),同时OD在把上面的int3修改回原来的代码。

内存断点分为:内存访问断点,内存写入断点。
我们知道,在程序运行的时候会有3种基本的状态产生:读取,写入,执行。

CODE:

004AE242 A1 00104000 mov eax,dword ptr ds:[004AE24C] //004AE24C处的内存读取
004AE247 A3 00104000 mov dword ptr ds:[004AE24C],eax //004AE24C处的内存写入
004AE24C 83C0 01 add eax,1 //004AE24C处的内存执行

[Copy to clipboard]

那么我们应该如何中断在上面的几行呢?
1.当我们对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247。
2.当我们对004AE24C下内存写入断点的时候,只能中断在004AE247。
3.当我们对004AE24C下内存访问断点的时候,能中断在004AE24C。

到这里你可能不明白了,为什么内存访问断点能中断在004AE247这一句对004AE24C的写入,而且还能中断在004AE24C的执行呢?

其实很简单,我们只要仔细体会一下“内存访问”这四个字的含义遍可以知道,当我们对004AE24C进行读取的时候需要“访问”他吧,当我对004AE24C进行写入的时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C的代码的时候也是还是要“访问”他的!

所以我们不难得出下面的结论:
1.内存写入中断的地方,一定是也可以用内存访问中断。
2.内存执行的地方,也可以用内存访问中断。
如果这时你认为,那么内存写入岂不是没用了。呵呵~那我要告诉你当然不是,如果你想快速的准确的定位到004AE247这一行的时候,那么他就大有作用了!

总结一下:内存断点不修改改原代码,不会像普通断点那样因为修改代码被程序校验而导致中断失败;对于区段的访问只是区域大了一点,其原理和上面分析的三行代码是一样的。

ii.如何使用内存断点来寻找OEP呢?
要回答这个问题首先要回答这一个问题:壳是如何解压代码的?

正如我们知道的,壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。而这一个过程我们难道不能将他看做是对代码段(code段)的写入吗?好了,解压完毕了。我们要从壳代码的区段JMP到原来的代码段的时候,难道不正是对代码段(code段)的执行吗?

理清了上面的关系就好办了,那么如果载入OD后,我们直接对code段下内存访问断点的时候,一定会中断在壳对code段的写入的代码的上面,就像上面的004AE247的这一行。而如果当他把code段的代码全部解压解密完毕了以后,JMP到OEP的时候,我们是不是还可以停在OEP的代码上面呢?而且每按下F9都会中断,因为这时code段在执行中哦!
相信很多人到这里已经明白了,为什么在教程中到达了某一个时候,某一行的时候。牛人们就叫我们对code段下内存访问断点了吧。

而如果你还要继续问我为什么一定要到那个地方才可以下断呢?我难道不可以一开始就下断吗?

正入我上面所说的,如果你在前面下断很可能壳对code段还没解压完毕呢,这时如果你不停的按F9,你将会看到OD的下方不断的在提示你,“对401000写入中断” “对401002写入中断”“对401004写入中断”…如果你不介意按F9到他把正个code段写完的话,我除了同情你的“F9”以外,没什么其他的意见!

那么我们就没有别更快一点的办法了吗?
有的!那就是我们呼之欲出的两次内存断点办法。
怎么理解两次内存断点呢?

让我来做一个假设吧,假设我是一个壳的作者。一个EXE文件的有code段,data段,rsrc段…依次排列在你的内存空间中,那么我会怎么解码呢?呵呵~我比较笨一点,我会先将code段解码,然后再将data段解压,接着是rsrc段…那么聪明的你不难发现,只要你在data断或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存反问断点,不就可以到达OEP了吗?

这里注意上面虽然下了两次内存访问断点,但是本质是不一样的,目的也是不一样的。

1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压 完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。

总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依*2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理在多次的内存断点其实都一样。从这个过程中我们了解的是壳在对区段解码的顺序!

iii.实战

说了这么多,我想大家都越越欲试了吧。
好吧,来弄一个猛壳怎么样:

练习文件下面下载
这个壳是一个hying的旧版,我们用他来实验一下我们内存断点法。

OD载入以后来到这里

CODE:

0040D000 u> 56 push esi //这里
0040D001 52 push edx
0040D002 51 push ecx
0040D003 53 push ebx
0040D004 55 push ebp
0040D005 E8 15010000 call unpackme.0040D11F

[Copy to clipboard]

根据跟过一次的经验我们将先设置,除int3异常以外忽略其他异常,SHIFT+F9

CODE:

003725B9 90 nop //到这里
003725BA 8BCD mov ecx,ebp

[Copy to clipboard]

然后再设置除“除零”异常外,忽略其他异常。SHIFT+F9

CODE:

00372660 F7F3 div ebx //到这里
00372662 90 nop

[Copy to clipboard]

下面是很多的单步异常,太麻烦我们不管他,现在开始用内存断点的方法。

对code段下内存访问断点,希望他已经解压完毕。F9

CODE:

0040D19D A4 movs byte ptr es:[edi],byte ptr ds:[esi] //还没解完呢
0040D19E B3 02 mov bl,2

[Copy to clipboard]

对data段下内存“写入”断点,试试看他是不是要写data段。

CODE:

00372712 F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi] //断到这里
00372714 5E pop esi

[Copy to clipboard]

下面再对code段下内存访问断点。F9

CODE:

00372855 8907 mov dword ptr ds:[edi],eax ; SHELL32.DragFinish //这里是对IAT加密的地方了!!!
00372857 5A pop edx
00372858 0FB642 FF movzx eax,byte ptr ds:[edx-1]
0037285C 03D0 add edx,eax
0037285E 42 inc edx
0037285F 83C7 04 add edi,4
00372862 59 pop ecx
00372863 ^ E2 A9 loopd short 0037280E
00372865 ^ E9 63FFFFFF jmp 003727CD
0037286A 8BB5 93060000 mov esi,dword ptr ss:[ebp+693] //到这里下断F2

[Copy to clipboard]

现在如果再对data下访问断点已经是没用了。这时应该格外的小心。

我们现在就想既然这一段是对code解码的,那么我们就绕过他吧!

到0037286A下断F2,然后清除内存断点!!!!

F9以后停在这里,继续对code下内存访问断点。

看看左下角还在解码,哎~真是麻烦!

CODE:

003728E1 /EB 1D jmp short 00372900
003728E3 |25 FFFFFF7F and eax,7FFFFFFF
003728E8 |0385 83060000 add eax,dword ptr ss:[ebp+683]
003728EE |2B85 8F060000 sub eax,dword ptr ss:[ebp+68F]
003728F4 |8BDE mov ebx,esi
003728F6 |2BD8 sub ebx,eax
003728F8 |8958 FC mov dword ptr ds:[eax-4],ebx //停在这里
003728FB |83C7 08 add edi,8
003728FE ^|EB DB jmp short 003728DB
00372900 \64:FF35 30000000 push dword ptr fs:[30] //清除内存断点以后到这里下断,F9

[Copy to clipboard]

又是一段解码的代码,再次使用上面的办法手动跳出去。
现在继续对code段下内存访问断点!!F9以后到达这里。

CODE:

004010CC FFD7 call edi ; unpackme.004010CE //OEP哦
004010CE 58 pop eax
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 90 nop
004010D4 E8 B518F7FF call 0037298E
004010D9 8BF0 mov esi,eax

[Copy to clipboard]

呵呵~虽然不是我们熟悉的OEP,但是地址是没错了,况且根据我们的步骤,我可以很肯定的说这是code段的第一次“执行”中断!
所以这就是OEP了。

总结一下:当我们在寻找OEP的时候,要多次对code下断“赌”一“赌”他解压完毕,如果不是就对别的段试试如果程序跑飞了,那就没办法了,重来呗其实说起来要赌的是:当data段,idata段,rsrc段摆在你的面前,你会好好“珍惜”那个段,不过还好上天还会给我们从来一次的机会(ctrl+F2 _),那么我们会对那个不会跑飞的段说3个字----“先断你”如果非要在上面加一个次数,我希望是“一次内存断点就好了”

vi.下面来讨论一下内存断点的局限性问题。
是不是什么壳都可以用内存中断啊?
不是每个都可以的,一些像UPX和ASPACK就不行。
为什么?
呵呵~follew me!
情况1.
我们来看看UPX的壳

首先,他的壳代码在UPX1段。

这里是他要跳到OEP的地方

CODE:

0040ED4F /77 11 ja short NOTEPAD_.0040ED62
0040ED51 |01C3 add ebx,eax
0040ED53 |8B03 mov eax,dword ptr ds:[ebx]
0040ED55 |86C4 xchg ah,al
0040ED57 |C1C0 10 rol eax,10 //在解码
0040ED5A |86C4 xchg ah,al
0040ED5C |01F0 add eax,esi
0040ED5E |8903 mov dword ptr ds:[ebx],eax
0040ED60 ^|EB E2 jmp short NOTEPAD_.0040ED44
0040ED62 \24 0F and al,0F
0040ED64 C1E0 10 shl eax,10
0040ED67 66:8B07 mov ax,word ptr ds:[edi]
0040ED6A 83C7 02 add edi,2
0040ED6D ^ EB E2 jmp short NOTEPAD_.0040ED51 //回跳解码
0040ED6F 61 popad
0040ED70 - E9 5723FFFF jmp NOTEPAD_.004010CC //跳到OEP

[Copy to clipboard]

我们看到他在对code段解压完毕的时候马上就JMP到OEP去了,那么我们根本就来不及使用内存断点的办法。

你可能说,我可以在

0040ED6F 61 popad //这一句下段然后使用啊

呵呵~~当然可以,不过你把花在下内存断点的时间,多按下几次F8不更好?!

也就是说当一个壳如果他在JMP 到OEP前的一行代码仍在都在对code段解压,那么我们就不能再使用这种办法了!

或者说我们没必要使用内存断点更贴切一点!

情况2.:
对于一些在OEP处有stolen code的代码
我们来看看一个OEP

CODE:

0049E2F4 u> 55 push ebp //OEP
0049E2F5 8BEC mov ebp,esp
0049E2F7 83C4 F4 add esp,-0C
0049E2FA B8 BCE04900 mov eax,unpack.0049E0BC
0049E2FF E8 048CF6FF call unpack.00406F08 //这里调用子程序
0049E304 A1 B8FE4900 mov eax,dword ptr ds:[49FEB8]
0049E309 50 push eax
0049E30A 6A 00 push 0
0049E30C 68 1F000F00 push 0F001F
0049E311 E8 E68EF6FF call <jmp.&kernel32.OpenFileMappingA> //API
0049E316 A3 60194A00 mov dword ptr ds:[4A1960],eax
0049E31B 833D 60194A00 00 cmp dword ptr ds:[4A1960],0

[Copy to clipboard]
这个软件在被PESPIN加壳了以后这些全被偷掉了!

也就是说,壳在模拟OEP代码的时候必然会执行

QUOTE:

0049E2FF E8 048CF6FF call unpack.00406F08 //这一步

而这个地方是call向code段的。如果我们使用内存访问断点,那么就停在这个子程序的地方

CODE:

00406F08 50 push eax //会停在这里
00406F09 6A 00 push 0
00406F0B E8 F8FEFFFF call <jmp.&kernel32.GetModuleHandleA>
00406F10 BA 04F14900 mov edx,unpack.0049F104
00406F15 52 push edx

[Copy to clipboard]

这里既不是处理stolen code的地方,也不是FOEP的地方。这就会对我们的判断产生误导。

当然你可以alt+F9返回到壳处理stolen的地方,然后用内存断点,或者按几下F8到达FOEP处,但试问如果你拿到一个未知的壳的时候又怎么知道应该这么处理呢?

还有其他一些情况留给大家总结吧!
在下的砖已抛出,各位的玉不久矣。

3.总结:
好了说了很多,大家应该对内存断点的办法有了全面的了解,如果了解了内存断点的原理就不难明白他的使用方法,不难明白为什么有写壳不能使用内存断点的办法,其实任何的一种办法都需要经验的积累。相信如果大家在回答开篇的3个问题,已经不难了。
下面给出一些使用内存断点寻找OEP的实例,大家可以结合原理再好好的体会一下。

4.思考题
使用多次内存断点的办法要谨慎对待data,rsrc区域的内存访问断点,即使要下也要注意尽量用写入断点。为什么?

2020-12-3(ESP定律脱壳理解)相关推荐

  1. 见过的最详强的讲ESP定律脱壳(推荐)

    导读: FROM: poptown.gamewan.com/bbs E-MAIL:meila2003@163.com 1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,E ...

  2. 【灌水】天草逆向, esp定律脱壳

    纯属灌水文章.今天随便看了一下天草高级视频.觉得讲得一般吧,题目是ip验证的,但是关于ip验证的相关的东西一个也没讲.是纯粹的破解.自己拿程序来试吧,发现没有服务端,完全不能通信实验. 期间谈到的所有 ...

  3. ESP定律脱壳(吾爱复现)

    ESP定律法简介 ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!) 1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突变成红色.( ...

  4. 使用ESP定律_手工脱壳

    ESP定律脱壳一般的加壳软件在执行时,首先要初始化,保存环境(保存各个寄存器的值),一般利用PUSHAD(相当于把所有寄存器都压栈),当加壳程序的外壳执行完毕以后,再来恢复各个寄存器的内容,通过跨区段 ...

  5. esp定律手动nspack 3.7_ESP定律原理详解

    原创作者: 青空 本文涉及知识点靶场练习--利用ESP定律进行脱壳: 理解ESP原理的操作机理并掌握使用ESP原理进行脱壳的流程. 实验:利用ESP定律进行脱壳(合天网安实验室)​www.hetian ...

  6. 利用ESP定律的upx脱壳实践

    背景: 除了命令行upx -d脱壳,还有手动脱壳.ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码) 方法: 从pushad ...

  7. ESP定律手工脱壳步骤

    ESP定律手工脱壳步骤 第一步:查壳 第二步:用OD载入. 第三步:按F8单步向下走,注意,当右边的ESP(堆栈指针寄存器),和EIP( 指令指针寄存器)同时变红时,就停下. 第四步:记下ESP地址, ...

  8. upx手动脱壳(esp定律手动脱壳)

    ESP定律手动脱壳 拿到有upx壳的文件后,首先用xdbg打开. 然后F9运行到用户代码(有upx壳文件一般为pushed) 然后F8单步运行一下,发现右边寄存器esp变红了,因此此处可以使用esp定 ...

  9. 寻找真正的入口(OEP)--广义ESP定律

    1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在""调查结果发现,大家对ESP定律很感兴趣,当 ...

最新文章

  1. python classmothed_python函数之classmethod()
  2. 网站微信登录授权 ASP.NET
  3. Java获取并输出两日期间的所有日期 .
  4. 华为鸿蒙手机beta版,鸿蒙2.0 Beta手机版来了!明年将全面支持华为手机
  5. 信安精品课:第4章网络安全体系与网络安全模型精讲笔记
  6. rgb颜色查询工具_Web前端页面重构之工具篇(Photoshop)
  7. UI Framework-1: Ash Color Chooser
  8. ccs软件linux安装,【图片】【吧主帖】在LINUX(ubuntu)系统下装CCSv6方法(原创)【dsp吧】_百度贴吧...
  9. 【终结版】win10 激活技巧分享
  10. java中时时检查代码中变量的值_如何调试JDK源代码并查看局部变量值
  11. python编程方式_python的两种编程方式是什么
  12. iOS开发-使用dSYM文件符号化Crash日志
  13. 用JAVA输入一位整数,当输入1-7时显示对应的英文星期名称缩写
  14. 火狐主页被360导航劫持怎么办
  15. Exp5 CAL_MSF基础运用 20154328 常城
  16. iOS牛顿摆 小球撞击 物理学仿真模拟
  17. 2021-02-11-JavaWeb网站接入支付宝支付
  18. 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理
  19. Jlink 烧写文件到 nandflash norflash
  20. 【论文阅读30】-《Autocuts: Simultaneous Distortion and Cut Optimization for UV Mapping》

热门文章

  1. 光栅衍射主极大个数_光栅的分类及常规指标介绍
  2. 时间周期 java_周期和持续时间 / Period and Duration
  3. arraylist转int数组_五千字的数组拓展,面试官对我竖起大拇指喊停
  4. 成功解决AttributeError: 'list' object has no attribute 'ndim'
  5. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
  6. Py之cairocffi:cairocffi的简介、安装、使用方法之详细攻略
  7. ML之MLiR:输入两个向量,得出两个向量之间的相关度
  8. LuoguP2754 [CTSC1999]家园(分层图,最大流)
  9. Linux流量监控工具 - iftop (最全面的iftop教程)
  10. mysql-二进制日志