能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我也不是太明白。
好象是从原来的程序中抽取一段代码出来叫stolen code
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
最初由 random 发布 我也不是太明白。 好象是从原来的程序中抽取一段代码出来叫stolen code
抽取一段出来之后应该还要做点处理吧
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
每一种编译工具例如 : VC++ , Delphi , Borland , etc..
在OEP有一个唯一的/相同的PE头
其中的一些是这样的:
Push EBP
MOV Ebp,Esp
Add ESP , -010
Mov EAX, SOME_VALUE
(共11bytes)
或者:
Push EBP
MOV Ebp,Esp
Add ESP , -010
Push EBX
Push ESi
Push EDi
Mov EAX, SOME_VALUE
(共14 bytes)
这个程序被抽掉多少字节,11个,因为
00564A4F 001C43 ADD BYTE PTR DS:[EBX+EAX*2],BL
00564A52 56 PUSH ESI
00564A53 0000 ADD BYTE PTR DS:[EAX],AL //这里往下一共12个字节,被抽掉的字节会用00补充,故Oep判断为564a54
00564A55 0000 ADD BYTE PTR DS:[EAX],AL
00564A57 0000 ADD BYTE PTR DS:[EAX],AL
00564A59 0000 ADD BYTE PTR DS:[EAX],AL
00564A5B 0000 ADD BYTE PTR DS:[EAX],AL
00564A5D 0000 ADD BYTE PTR DS:[EAX],AL
00564A5F E8 D828EAFF CALL SystemCl.0040733C
用Peid扫描一下脱壳的文件,Borland Delphi 6.0 - 7.0,我们仿真入口点11个字节。
Push EBP //固定格式
Mov EBP,ESP //固定格式
Add ESP,-010 //ADD ESP 的值一般 Delphi 程序都是-010
Mov eax, 00564344 //这里EAX的值就是刚才记录下来的。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
最初由 lee 发布 每一种编译工具例如 : VC++ , Delphi , Borland , etc.. 在OEP有一个唯一的/相同的PE头 其中的一些是这样的:
Push EBP ........
看的不太明白,不明白stolen code如何会影响oep的查找,
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
最初由 xxy19804 发布
看的不太明白,不明白stolen code如何会影响oep的查找,
stolen code
是 程序OEP部分的代码
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
===================== 关于stolen bytes Author:Lenus From: www.*****.net & bbs.asmcc.com E-mail:Lenus_M@163.com ===================== 每一种编译工具例如 : VC++ , Delphi , Borland , etc.. 在OEP有一个唯一的/相同的PE头 其中的一些是这样的:
Push EBP MOV Ebp,Esp Add ESP , -010 Mov EAX, SOME_VALUE
(共11bytes) 或者:
Push EBP MOV Ebp,Esp ;* Add ESP , -010 ;** Push EBX ;*** Push ESi Push EDi Mov EAX, SOME_VALUE ;****
(共14 bytes) 上面应该是一个老外LaBBa的话吧。问题是我们菜鸟如何理解呢?
1.对于*的部分 原程序的OEP,通常是一开始以 Push EBP 和MOV Ebp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。 为什么要这样呢?为什么几乎每个程序都是的开头能? 因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的: a.让EBP保存ESP的值; b.在结束的时候调用 mov esp,ebp pop ebp retn 或者是 leave retn 两个形式是一个意思。这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。
2.对于**的部分 Add ESP , -010这种代码的意思是在堆栈区域开辟一块区域保存和使用局部变量,用EBP-XX来调用。
3.对于***的部分
在下来就是保存寄存器的初始值。
4.对于****的部分
初始化寄存器。
小结:我们知道了这就是程序在编译后程序OEP的一般形式,而某些壳在处理OEP的代码时,把这些固定的代码nop掉,然后把他们放到壳代码的空间里面(而且还常伴随着花指令)!使原程序的开始从壳空间开始,然后再JMP回程序空间。如果我们脱掉壳了以后,这一部分就会遗失,也就达到了反脱壳的目的。这就是stolen code技术,或者更确切的说是stolen OEP code技术。
最后于 2021-4-25 16:53
被kanxue编辑
,原因: www.****.net域名失效,变成X站,故编辑删除
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
好像现在的新壳,不仅仅偷掉脑袋,还把中间若干重要器官偷掉几个细胞。
|
能力值:
( LV9,RANK:2130 )
|
-
-
9 楼
直接翻译过来去理解就行了,stolen 已偷 code 代码.可以理解为已抽代码之类的。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
谢谢,明白了点,还要加深理解
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
受益菲浅呀!
|