首页
社区
课程
招聘
[分享]SoftWrap 6.x之二:Inline Patch SoftWrap壳的方法
发表于: 2007-4-24 13:35 10429

[分享]SoftWrap 6.x之二:Inline Patch SoftWrap壳的方法

2007-4-24 13:35
10429
【文章标题】: SoftWrap 6.x之二:Inline Patch SoftWrap壳的方法
【文章作者】: wynney
【软件名称】: Fractal PC 3.01
【下载地址】: http://www.fractalpc.com/resources/SetupFractalPC30.exe
【使用工具】: OD、CodeCaver
--------------------------------------------------------------------------------
【详细过程】
  一、前言
  
  像这种猛壳的Inline Patch无非就是找到Patch点后,一层一层的Patch,另外还需要Patch壳的CRC校验之类的。废话就不多说了,

我们来看如何Inline Patch SoftWrap壳吧

  二、Pass NAG
  
  0、准备工作,我们先找一块空白地址吧,Patch的数据长度是95字节

   

  我在这里选择004277DF作为存放代码的地址
  
  1、设置忽略除了特权指令和指定异常之外的所有异常


   
  2、F9运行,停在异常之后,Alt+E,找到Softwrap.dll路径,Ctrl+N


   
  3、找到swAccessQuery


   
  双击来到代码处


   
  几次Shift+F9通过异常,中断在10001934,看堆栈


   
  Ctrl+G:0045BBA7

  

0045BAF3 53 push ebx
0045BAF4 8BDC mov ebx, esp
0045BAF6 81EC 04010000 sub esp, 104
0045BAFC 60 pushad
0045BAFD 8DBB FCFEFFFF lea edi, dword ptr [ebx-104]
0045BB03 C707 736F6674 mov dword ptr [edi], 74666F73
0045BB09 C747 04 7772617>mov dword ptr [edi+4], 70617277
0045BB10 C747 08 2E646C6>mov dword ptr [edi+8], 6C6C642E
0045BB17 8367 0C 00 and dword ptr [edi+C], 0
0045BB1B 57 push edi
0045BB1C 53 push ebx
0045BB1D 57 push edi
0045BB1E FF95 8E2F0000 call dword ptr [ebp+2F8E] ; 加载Softwrap.dll
0045BB24 5B pop ebx
0045BB25 5F pop edi
0045BB26 8943 FC mov dword ptr [ebx-4], eax
0045BB29 50 push eax
0045BB2A E8 48030000 call 0045BE77 ; Softwrap.dll的CRC校验
0045BB2F 85C0 test eax, eax
0045BB31 ^ 0F84 A6E6FFFF je 0045A1DD ; 如果跳则错误,Patch点①
0045BB37 66:8985 ED22000>mov word ptr [ebp+22ED], ax
0045BB3E C707 73774163 mov dword ptr [edi], 63417773
0045BB44 C747 04 6365737>mov dword ptr [edi+4], 73736563
0045BB4B C747 08 5175657>mov dword ptr [edi+8], 72657551
0045BB52 C747 0C 7900000>mov dword ptr [edi+C], 79
0045BB59 56 push esi
0045BB5A 57 push edi
0045BB5B 53 push ebx
0045BB5C 51 push ecx
0045BB5D 52 push edx
0045BB5E 57 push edi
0045BB5F FF73 FC push dword ptr [ebx-4]
0045BB62 FF95 862F0000 call dword ptr [ebp+2F86]
0045BB68 5A pop edx
0045BB69 59 pop ecx
0045BB6A 5B pop ebx
0045BB6B 5F pop edi
0045BB6C 5E pop esi
0045BB6D 85C0 test eax, eax
0045BB6F ^ 0F84 68E6FFFF je 0045A1DD
0045BB75 8BD0 mov edx, eax
0045BB77 8B85 F30C0000 mov eax, dword ptr [ebp+CF3]
0045BB7D 35 159D17FA xor eax, FA179D15
0045BB82 0385 F30C0000 add eax, dword ptr [ebp+CF3]
0045BB88 8985 F1220000 mov dword ptr [ebp+22F1], eax
0045BB8E 8DB5 FD220000 lea esi, dword ptr [ebp+22FD]
0045BB94 8BFE mov edi, esi
0045BB96 B9 40000000 mov ecx, 40
0045BB9B F3:AB rep stos dword ptr es:[edi]
0045BB9D 53 push ebx
0045BB9E 57 push edi
0045BB9F 56 push esi
0045BBA0 FF73 08 push dword ptr [ebx+8]
0045BBA3 56 push esi
0045BBA4 50 push eax
0045BBA5 FFD2 call edx ; EDX=10001934
0045BBA7 83C4 0C add esp, 0C


  
  

★(1)、
0045BB31 ^ 0F84 A6E6FFFF je 0045A1DD
0045BB37 66:8985 ED22000>mov word ptr [ebp+22ED], ax

Change to

0045BB31 - E9 F9BCFCFF jmp 0042782F ◆
0045BB36 90 nop
0045BB37 66:8985 ED22000>mov word ptr [ebp+22ED], ax

0042782F C705 E88B0410 0>mov dword ptr [10048BE8], 1
00427839 - E9 F8420300 jmp 0045BB36

  

  
  三、循环解码

  Ctrl+F2,重新加载,可以设置忽略所有异常了
  DD 0045BB31,下内存写入断点,F9

  

00459933 BA 42CD9CDB mov edx, DB9CCD42 ; 选5个字节的行来Patch代码
00459938 AD lods dword ptr [esi]
00459939 33C2 xor eax, edx
0045993B 05 40FDC304 add eax, 4C3FD40 ; 我选的是这,Patch点②
00459940 33C1 xor eax, ecx
00459942 C1C2 05 rol edx, 5
00459945 69D2 53307040 imul edx, edx, 40703053
0045994B 33D1 xor edx, ecx
0045994D AB stos dword ptr es:[edi] ; 中断在这

  
  我们可以看看,刚加载程序的时候,这个地方并没有解码,所以,我们需要找到他的上一层解码点
  不需要特殊的操作,往上翻下代码吧
  
  

004597C7 FFD6 call esi ; 解码call,刚加载程序这里是解码的
004597C9 68 14EBECC8 push C8ECEB14 ; 运行到这后,Patch点2就解码开了
004597CE 5B pop ebx
004597CF BF 761CCDAB mov edi, ABCD1C76 ; 这就是我选择的第3个Patch点③
004597D4 0FACFB 15 shrd ebx, edi, 15


  
  

★(2)、
0045993B 05 40FDC304 add eax, 4C3FD40
00459940 33C1 xor eax, ecx
00459942 C1C2 05 rol edx, 5

Change to

0045993B - E9 CADEFCFF jmp 0042780A ◆
00459940 33C1 xor eax, ecx
00459942 C1C2 05 rol edx, 5

  
  

  

0042780A 05 40FDC304 add eax, 4C3FD40
0042780F 81FE 54BB4500 cmp esi, 0045BB54
00427815 75 13 jnz short 0042782A
00427817 C705 31BB4500 E>mov dword ptr [45BB31], FCBCF9E9
00427821 66:C705 35BB450>mov word ptr [45BB35], 90FF
0042782A - E9 11210300 jmp 00459940


  
  

★(3)、
004597CF BF 761CCDAB mov edi, ABCD1C76
004597D4 0FACFB 15 shrd ebx, edi, 15
004597D8 68 F049C551 push 51C549F0

Change to

004597CF - E9 1BE0FCFF jmp 004277EF ◆
004597D4 0FACFB 15 shrd ebx, edi, 15
004597D8 68 F049C551 push 51C549F0

  
  

  

004277EF BF 761CCDAB mov edi, ABCD1C76
004277F4 C705 3B994500 E>mov dword ptr [45993B], FCDECAE9
004277FE C605 3F994500 F>mov byte ptr [45993F], 0FF
00427805 - E9 CA1F0300 jmp 004597D4

  
  

004277EF BF 761CCDAB mov edi, ABCD1C76 ; 原代码挪移
004277F4 C705 3B994500>mov dword ptr [45993B], FCDECAE9 ; 把0045993B Patch
004277FE C605 3F994500>mov byte ptr [45993F], 0FF ; 成jmp 0042780A
00427805 - E9 CA1F0300 jmp 004597D4 ; 跳回原流程
0042780A 05 40FDC304 add eax, 4C3FD40 ; 原代码挪移
0042780F 81FE 54BB4500 cmp esi, 0045BB54 ; esi=45BB54的时候0045BB31才解码开
00427815 75 13 jnz short 0042782A ; 0045BB31没解码就跳回原流程
00427817 C705 31BB4500>mov dword ptr [45BB31], FCBCF9E9 ; 0045BB31解码就Patch 0045BB31
00427821 66:C705 35BB4>mov word ptr [45BB35], 90FF ; 成jmp 0042782F
0042782A - E9 11210300 jmp 00459940 ; 跳回原流程
0042782F C705 E88B0410>mov dword ptr [10048BE8], 1 ; 赋1给[10048BE8],INC后[10048BE8]=2
00427839 - E9 F8420300 jmp 0045BB36 ; 跳回原流程

BF 76 1C CD AB C7 05 3B 99 45 00 E9 CA DE FC C6 05 3F 99 45 00 FF E9 CA 1F 03 00 05 40 FD C3 04 81 FE 54 BB 45 00

75 13 C7 05 31 BB 45 00 E9 F9 BC FC 66 C7 05 35 BB 45 00 FF 90 E9 11 21 03 00 C7 05 E8 8B 04 10 01 00 00 00 E9 F8 42

03 00

  
  复制上述几处修改,保存为别的文件名,运行看看,汗,没反映,又不提示错误,这就是CRC校验的问题了
  
  四、CRC

  重新加载程序
  DD 0045993B,下硬件访问断点->Byte,F9运行
  
  

00459132 03D0 add edx, eax ; 中断在这,删除断点
00459134 49 dec ecx
00459135 ^ 75 FA jnz short 00459131 ; 第一轮CRC校验
00459137 5E pop esi
00459138 52 push edx
00459139 81C6 A0380000 add esi, 38A0
0045913F B9 54030000 mov ecx, 354
00459144 33D2 xor edx, edx
00459146 33C0 xor eax, eax
00459148 AC lods byte ptr [esi]
00459149 03D0 add edx, eax
0045914B 49 dec ecx
0045914C ^ 75 FA jnz short 00459148 ; 第一轮CRC校验
0045914E 58 pop eax
0045914F 2BC2 sub eax, edx
00459151 92 xchg eax, edx
00459152 8DB5 BF030000 lea esi, dword ptr [ebp+3BF] ; F4,edx里面的值就是CRC校验值④
00459158 33C0 xor eax, eax ; edx=003067D2
0045915A B9 04000000 mov ecx, 4


  
  

★(4)、
00459152 8DB5 BF030000 lea esi, dword ptr [ebp+3BF]
00459158 33C0 xor eax, eax

Chang to

00459152 - E9 88E6FCFF jmp 004277DF ◆
00459157 90 nop
00459158 33C0 xor eax, eax

004277DF BA D2673000 mov edx, 3067D2
004277E4 8DB5 BF030000 lea esi, dword ptr [ebp+3BF]
004277EA - E9 69190300 jmp 00459158

  
  

  代码集合
  
  

004277DF BA D2673000 mov edx, 3067D2 ; 第一轮CRC值
004277E4 8DB5 BF030000 lea esi, dword ptr [ebp+3BF] ; 原代码挪移
004277EA - E9 69190300 jmp 00459158 ; 跳回原流程
004277EF BF 761CCDAB mov edi, ABCD1C76 ; 原代码挪移
004277F4 C705 3B994500>mov dword ptr [45993B], FCDECAE9 ; 把0045993B Patch
004277FE C605 3F994500>mov byte ptr [45993F], 0FF ; 成jmp 0042780A
00427805 - E9 CA1F0300 jmp 004597D4 ; 跳回原流程
0042780A 05 40FDC304 add eax, 4C3FD40 ; 原代码挪移
0042780F 81FE 54BB4500 cmp esi, 0045BB54 ; esi=45BB54的时候0045BB31才解码开
00427815 75 13 jnz short 0042782A ; 0045BB31没解码就跳回原流程
00427817 C705 31BB4500>mov dword ptr [45BB31], FCBCF9E9 ; 0045BB31解码就Patch 0045BB31
00427821 66:C705 35BB4>mov word ptr [45BB35], 90FF ; 成jmp 0042782F
0042782A - E9 11210300 jmp 00459940 ; 跳回原流程
0042782F C705 E88B0410>mov dword ptr [10048BE8], 1 ; 赋1给[10048BE8],INC后[10048BE8]=2
00427839 - E9 F8420300 jmp 0045BB36 ; 跳回原流程

BA D2 67 30 00 8D B5 BF 03 00 00 E9 69 19 03 00 BF 76 1C CD AB C7 05 3B 99 45 00 E9 CA DE FC C6 05 3F 99 45 00 FF

E9 CA 1F 03 00 05 40 FD C3 04 81 FE 54 BB 45 00 75 13 C7 05 31 BB 45 00 E9 F9 BC FC 66 C7 05 35 BB 45 00 FF 90 E9 11

21 03 00 C7 05 E8 8B 04 10 01 00 00 00 E9 F8 42 03 00

  
  图文版PDF下载

SoftWrap 6.x之二:Inline Patch SoftWrap壳的方法.pdf

--------------------------------------------------------------------------------
【经验总结】
  Inline Patch的大致流程就在下面,但是需要大家有足够的耐心和一定的汇编基础,Enjoy!
   


  下篇:SoftWrap 6.x之三:IAT修复之Jmp dword ptr ds:[API]  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年04月23日

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错的方法,学习!
2007-4-24 13:59
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
这个壳的iat处理,首先需要跳开抽函数的地方,然后自己手动把正确的iat填充到程序里,然后在找到计算的地方,直接利用计算的次序修复,或者在到达oep后写一段代码修复,只要patch的代码写好了,这个壳基本上就完了,主要是比较麻烦。难度不是很大。本人的一点肤浅的理解。
2007-4-24 14:32
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
4
欢迎你的文章:)
如果你觉得难度不是很大
那么你在刚接触ASProtect的Stolen Code的时候一定觉得ASPr不难了:)
因为它们两个很类似,写的修复代码也很类似
只是SoftW分的类型比ASPr多而已

你是否知道处理它的IAT要分好几种呢?
1、Jmp [API] 6字节--->Call [addr] 6字节
2、Call [API] 6字节--->Call [addr] 6字节
3、mov eax,[API]  5字节--->Call addr  5字节
4、mov REG,[API]  6字节--->Call addr  5字节+1字节寄存器识别码[eax之外的寄存器]
2007-4-24 15:19
0
雪    币: 192
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
完全不懂,学习!
2007-4-24 16:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
写的还蛮详细!慢慢学习下!
2007-4-24 17:00
0
雪    币: 827
活跃值: (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文章,学习+支持~~~
2007-4-24 18:16
0
雪    币: 44229
活跃值: (19950)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
8
期待wynney SoftWrap 6.x之三
2007-4-24 20:32
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好文,定一下
2007-4-24 22:01
0
雪    币: 9731
活跃值: (3091)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
10
坦白的说,看着您一篇又一篇的精华,真是感觉羡慕,文章确实精彩,讲得详细!
同时感到自己还没找到脱壳的感觉,惭愧之至!

我感觉类似遇到 stolen的情况,您是否可以讲解一下,如何判断stolen所在的地方,当然您文章里有具体的步骤和图片已经很详细了,但是否可以讲一下,原理呢!

我还象知道程序stolen代码 ,它本身是怎么来执行的呢?能否说明下这样的程序的执行流程!

有时候看着高手贴的脱壳文章自己照着做,却不一样,人家shift+f9就 过去了,我们实验时就game over了,可有不明白原理和方法,就无从下手了

现在时不时的回头看  看学老大的贴 的入门级的文章,每看一次收获不同.

我是大菜鸟,问的问题难免若智,不过也许能代表跟我同一起跑线上 渴望对脱壳加深认识的一部分入门者的心声!

如果楼主大侠有空指点一二,感谢不尽!

我想很多人都会这样认为:您的文章很精彩,辛苦了,非常感谢!
2007-4-24 22:08
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
11
当然,我贴出来的是教大家怎么去做,不包括
我分析的过程,既然要帖东西出来当然还是希望
对大家有所帮助,并不是某些人说的“炫耀”。
如果是“炫耀”就不仅仅是这么些文章了,有些东西
没时间和精力去写文章。所以我帖的是方法,总结出来的方法
也可以算是规律吧。可以应用到其他SoftW的方法,
如果是要讲怎么去分析,以及分析的过程,我估计我没精力去写了。
看雪这么多高手,我见只有loveboom大大写分析文章多一些
说实在的,例如SoftW这个壳,我分析了近1个星期,
才分析出Inline Patch和IAT修复的方法,并写了4篇文章,以及脚本,
可能是我比较愚钝吧

如果你想学习如何去分析壳
那么可以拿UPX和ASPack这类简单常见的壳仔细分析
如果你有成果,那么你的能力更进一步了

就像潭浩强在他的C语言教材里会说:请大家先接受这个现实
这个现实引用到我们这来就是
先记住再理解别人的文章再加上自己的努力
2007-4-24 22:46
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
12
“炫耀”。。。

如果是新人发文章,还能说得上“炫耀”。。。。。

壳的分析文章,个人感觉是不符合用户需求的。

一是多数没那水平去理解,二是大家注重的只是脱壳的过程,脱掉了,管它干了什么。

支持大牛发文章
2007-4-25 09:28
0
雪    币: 9731
活跃值: (3091)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
13
wynney  完全没有显耀的意思啊
他写的文章的确很实用,并且完全无偿辛苦的劳动

很抱歉,可能我开始发表的文字给wynney  造成误解了,sorry!

也许象他说的那样,目前只能一步一步跟着做下去,在一步一步实践模仿的基础上加以思考理解
最终消化!

我开始发表的文字是因为有这样的感触:

比如先前看一片脱文:  ctrl+n,在.data 段 f2 shift+ f9  进去走两步 后头又在某个段f2 等等等

然后就进oep了,当时在想为什么要这么做呢,为什么它就到oep了呢.  

到后面 自己模仿着做 或者拿其他程序做 有的地方 跟作者描述的不相同,无法继续下去了,然后看着一篇好的脱文,自己照样却做不下来.

后来去看  看学贴入门的 那文章 讲的是程序 运行到某个段 前面部分就解密完了,所以我在那下个断,然后在代码段下个断,f9就到代码段去了.

如果知道是这样的话,那么我想结合脱壳的文章,作者脱壳的方法能被我们深深的记住,并且能举一反三~!

当然大家会笑话我了,基础的东西人家入门文章都贴出来了 自己不认真看,只瞎问.

是的,刚那段在入门文章看了,只是stolen  code 在入门里没描述,我google了的,没找到分析.
所以发表了先前的文字!

非常感谢wynney 笨笨雄 给的指点!

谢谢各位大大,语言有表述不当的地方请批评!
2007-4-25 13:39
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
14
多谢兄弟
兄弟说得即是!

PS:记得有不少朋友说过,看雪的精华都看不懂,所以他们理解成人家发这些文章是炫耀了:)
2007-4-25 14:07
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
15
呵呵,不是你的语言失误,只是我随便带一下某些人认为的
从基础学起,多了解下PE结构
2007-4-25 14:09
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=wynney;301060]欢迎你的文章:)
如果你觉得难度不是很大
那么你在刚接触ASProtect的Stolen Code的时候一定觉得ASPr不难了:)
因为它们两个很类似,写的修复代码也很类似
只是SoftW分的类型比ASPr多而已

你是否知道处理它的IAT要分好几种呢?
1、Jmp [API] 6字节...[/QUOTE]

一开始我觉得这个壳很复杂,我之所以说难度不大,是因为通过一段时间的跟踪,我了解了它,并且知道了怎么去做,我的方法是到oep后在通过下断点的方法获得函数,并修复代码,我看到你的方法也是如此,其实如果找到壳在初始化时,抽取函数加密的地方直接利用它加密的时候进行修复应该比这个方法要快。不过我没有试。
2007-4-25 18:23
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
17
我非常佩服你,竟然搞得那么仔细。
2007-4-25 19:26
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
18
不知道这里算不算你说“抽取函数加密的地方”

  Ctrl+G:VirtualAlloc,在段尾F2[直接bp VirtualAlloc会被检测到],shift+F9,中断后返回
  
  Ctrl+B:85 C0 0F 84 ?? ?? ?? ?? F6 C3 02 74 21 FF B5 ?? ?? ?? ?? 6A 10 50 FF B5 ?? ?? ?? ?? FF B5 ?? ?? ?? ??


开始我也有想过你说的在加密的时候就修复,但是,经过分析发现IAT分好几种[C类和D类程序]
一时想不出什么法子一下子来修复,你可以继续:)
谢谢你的建议,你的思路是没有错误的,只是小弟愚钝,研究了近一周,才搞出这么点东西
期待后人继续

个人觉得,它在IAT加密这一块比ASPr做得好,其他地方还是不如ASPr了
2007-4-25 22:05
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
19
个人而言,我比较喜欢去Inline Patch 呵呵
2007-4-25 22:11
0
游客
登录 | 注册 方可回帖
返回
//