飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8906|回复: 16

[求助] 请高手发一个ASProtect 2.0的脱壳教程

[复制链接]

该用户从未签到

发表于 2007-3-2 22:17:55 | 显示全部楼层 |阅读模式
在google搜索了一下有教程,不过太复杂看不明白,请高手再发一个最好是动画教程,壳是ASProtect 2.0的不是ASProtect.SKE 2.0那个.

[ 本帖最后由 chenming 于 2007-3-2 23:09 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入我们

x
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2018-6-6 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-3-2 22:51:18 | 显示全部楼层
    把你手上有的带这壳的软件发上来~
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-3-2 23:12:21 | 显示全部楼层
    这个壳我搞了三天都搞不定,最好有动画教程,请高手发一个,谢谢
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-15 21:05
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2007-3-3 12:47:00 | 显示全部楼层
    我也想学习一下
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-3-3 21:24:04 | 显示全部楼层
    这个壳有点麻烦。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-4 10:18:26 | 显示全部楼层
    我在看雪好像看见过你去那找找
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-3-4 17:12:04 | 显示全部楼层
    标 题: ASPROTECT 2.0脱壳示例
    作 者: loveboom
    时 间: 2004-10-28,23:05
    链 接: http://bbs.pediy.com/showthread.php?threadid=6320

    ASPROTECT  2.0 脱壳示例
    【目    标】:Win98’s notepad
    【工    具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
    【任    务】:简单的脱一下asprotect的壳
    【操作平台】:Windows Xp sp2
    【作    者】:loveboom[DFCG][FCG][US]
    【简要说明】:有一段时间没写文章了,这篇文章本来是想在奥运会那时写出来,因为公事比较多,有空的时候心情不好等原因,所以一直放到现在才写.
    【详细过程】:
    设置忽略全部异常,去掉调试标志。
    1. 载入后到这里:
    2. 00401000 >  68 01D040>PUSH 0040D001                            ; EP壳的入口
    3. 00401005    E8 010000>CALL 0040100B
    4. 载入后,直接g LoadLibraryA运行到LoadLibraryA这个API处.
    5. 7C801D77 >  8BFF      MOV EDI,EDI                              ; LoadLibraryA
    6. 7C801D79    55        PUSH EBP
    7. 到了后,ALT+F9执行到返回:
    8. 009884B7    8985 4D29>MOV DWORD PTR SS:[EBP+44294D],EAX        ; 返回到这里
    9. 009884BD    C785 5129>MOV DWORD PTR SS:[EBP+442951],0
    10. ……
    11. 009885C1    61        POPAD
    12. 009885C2    75 08     JNZ SHORT 009885CC                       ; 看到这里,跟过Aspack的朋友就是知道这里是什么了
    13. 009885C4    B8 010000>MOV EAX,1
    14. 009885C9    C2 0C00   RETN 0C
    15. 009885CC    68 000000>PUSH 0                                   ; 如果解压完壳代码这里会push 一个返回的地址
    16. 009885D1    C3        RETN
    17. 返回到009884B7处后,右键查找全部字符串,然后在字符串窗中查找250这样就会看到这些东西:


    18. 双击10那里到了cpu窗口处:
    19. 0096CD66   /75 0A     JNZ SHORT 0096CD72
    20. 0096CD68   |68 C8D096>PUSH 96D0C8                              ; 双击到这里,这里向上找到代码开始处
    21. 0096CD6D   |E8 BE6DFF>CALL 00963B30
    22. 向上找到这里:
    23. 0096CC70   /EB 01     JMP SHORT 0096CC73
    24. 0096CC72   |90        NOP
    25. 0096CC73   \8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]             ; 这里开始对IAT进行处理
    26. 0096CC76    8B30      MOV ESI,DWORD PTR DS:[EAX]
    27. 0096CC78    8343 08 0>ADD DWORD PTR DS:[EBX+8],4
    28. 0096CC7C    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    29. 0096CC7F    8A00      MOV AL,BYTE PTR DS:[EAX]
    30. 0096CC81    884424 07 MOV BYTE PTR SS:[ESP+7],AL
    31. 0096CC85    FF43 08   INC DWORD PTR DS:[EBX+8]
    32. 0096CC88    85F6      TEST ESI,ESI
    33. 0096CC8A    75 1A     JNZ SHORT 0096CCA6                       ; 这里比较输入表是否处理完毕,如果没有就跳下去
    34. 0096CC8C    EB 01     JMP SHORT 0096CC8F
    35. ……
    36. 0096CCC9    FF43 08   INC DWORD PTR DS:[EBX+8]
    37. 0096CCCC    84C0      TEST AL,AL                               ; 这里开始对AL的值的不同而进行相关的处理
    38. 0096CCCE    75 20     JNZ SHORT 0096CCF0
    39. ……
    40. 0096CD59    8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
    41. 0096CD5D    E8 DEECFF>CALL 0096BA40                            ; GetProcAddress
    42. 0096CD62    8BE8      MOV EBP,EAX
    43. 0096CD64    85ED      TEST EBP,EBP
    44. 0096CD66    75 0A     JNZ SHORT 0096CD72                       ; 判断获取API是否成功
    45. 0096CD68    68 C8D096>PUSH 96D0C8                              ; 双击到这里,这里向上找到代码开始处
    46. 0096CD6D    E8 BE6DFF>CALL 00963B30
    47. 0096CD72    837C24 20>CMP DWORD PTR SS:[ESP+20],0
    48. ……
    49. 0096CDF7    E8 8469FF>CALL 00963780                            ; 当AL为2时对IAT的处理,跟进去
    50. 0096CDFC  ^ E9 72FEFF>JMP 0096CC73                             ; 处理完跳回去
    51. ……
    52. 跟进看看:
    53. 00963756    8BC0      MOV EAX,EAX
    54. 00963758    55        PUSH EBP
    55. 00963759    8BEC      MOV EBP,ESP
    56. 0096375B    53        PUSH EBX
    57. 0096375C    8BD8      MOV EBX,EAX
    58. 0096375E    8BC2      MOV EAX,EDX
    59. 00963760    8BD1      MOV EDX,ECX
    60. 00963762    E8 79FFFF>CALL 009636E0
    61. 00963767    C603 E9   MOV BYTE PTR DS:[EBX],0E9                ; 先在这里也下个断,因为这里就是程序的OEP
    62. 0096376A    8D53 01   LEA EDX,DWORD PTR DS:[EBX+1]             ; 这里原程跳就是壳抽程序代码的开始地方
    63. 0096376D    8902      MOV DWORD PTR DS:[EDX],EAX
    64. 0096376F    8B45 08   MOV EAX,DWORD PTR SS:[EBP+8]
    65. 00963772    8910      MOV DWORD PTR DS:[EAX],EDX
    66. 00963774    B8 050000>MOV EAX,5
    67. 00963779    5B        POP EBX
    68. 0096377A    5D        POP EBP
    69. 0096377B    C2 0400   RETN 4
    70. 0096377E    8BC0      MOV EAX,EAX
    71. 00963780    53        PUSH EBX                                 ; 进到这里
    72. 00963781    8BD8      MOV EBX,EAX
    73. 00963783    8BC3      MOV EAX,EBX
    74. 00963785    E8 56FFFF>CALL 009636E0
    75. 0096378A    C603 E8   MOV BYTE PTR DS:[EBX],0E8                ; 这里把IAT的改成call xxxxxx的样式,所以我们这里要进去处理
    76. 0096378D    43        INC EBX
    77. 0096378E    8903      MOV DWORD PTR DS:[EBX],EAX
    78. 00963790    5B        POP EBX
    79. 00963791    C3        RETN
    80. 现在这里我们来修复一下:
    81. 先自己申请两块空间,当然你也可以直接找空闲的地方来写代码,我分别申请了00B90000和00BA0000这个块内存空间,00b90000这块是用来写patch代码,00ba0000是用来保存临时要存放的数据。
    82. 00BA0000用来保存DLL的基址,00BA0010用来保存要存放IAT的地址。
    83. 搞清这些东西后,我们开始写代码:
    84. 00963781    8BD8      MOV EBX,EAX
    85. 00963783    8BC3      MOV EAX,EBX
    86. 00963785    E8 56FFFF>CALL 009636E0
    87. 0096378A    E8 71C822>CALL 00B90000                            ; 调用我们改的代码处
    88. 0096378F    90        NOP
    89. 00963790    5B        POP EBX
    90. 00963791    C3        RETN

    91. 00B90000用来写我们自己的修复代码:
    92. 00B90000    51        PUSH ECX                                 ; 保护现场
    93. 00B90001    52        PUSH EDX
    94. 00B90002    8B5424 28 MOV EDX,DWORD PTR SS:[ESP+28]            ; 取出基址到EDX中
    95. 00B90006    3B15 0000>CMP EDX,DWORD PTR DS:[BA0000]            ; 比较基址是否相同
    96. 00B9000C    74 0D     JE SHORT 00B9001B
    97. 00B9000E    8915 0000>MOV DWORD PTR DS:[BA0000],EDX            ; 如果不同就写入新的基址
    98. 00B90014    8305 1000>ADD DWORD PTR DS:[BA0010],4              ; 并把填入IAT的地址再加上4
    99. 00B9001B    8B0D 1000>MOV ECX,DWORD PTR DS:[BA0010]            ; 如果是第一次我们要手工写一下保存IAT的地址,我选择的是40C000
    100. 00B90021    8929      MOV DWORD PTR DS:[ECX],EBP               ; 写入正确的函数
    101. 00B90023    66:C703 F>MOV WORD PTR DS:[EBX],15FF               ; 这里要看程序的情况而定,如果是DELPHI之类的,这果就可能是FF25了,因为是C的,所以这里是ff15
    102. 00B90028    890E      MOV DWORD PTR DS:[ESI],ECX               ; 把存放IAT的地址放到程序里
    103. 00B9002A    8305 1000>ADD DWORD PTR DS:[BA0010],4              ; 保存IAT的地址+4
    104. 00B90031    5A        POP EDX                                  ; 还原现场
    105. 00B90032    59        POP ECX
    106. 00B90033    C3        RETN                                     ; 返回到壳那边继续

    107. 继续到AL=1时的处理:
    108. 0096CE07  ^\E9 67FEFF>JMP 0096CC73
    109. 0096CE0C    3C 01     CMP AL,1                                 ; 当AL=1的处理
    110. 0096CE0E    0F85 B200>JNZ 0096CEC6
    111. ……
    112. 0096CE7E    A1 B8A697>MOV EAX,DWORD PTR DS:[97A6B8]
    113. 0096CE83    8B00      MOV EAX,DWORD PTR DS:[EAX]
    114. 0096CE85    FFD0      CALL EAX                                 ; GetProcAddress
    115. 0096CE87    8BE8      MOV EBP,EAX
    116. 0096CE89    85ED      TEST EBP,EBP
    117. 0096CE8B    75 0A     JNZ SHORT 0096CE97                       ; 如果获取成功就跳
    118. 0096CE8D    68 D8D096>PUSH 96D0D8                              ; ASCII "11
    119. "
    120. 0096CE92    E8 996CFF>CALL 00963B30
    121. 0096CE97    8B0424    MOV EAX,DWORD PTR SS:[ESP]
    122. 0096CE9A    50        PUSH EAX
    123. 0096CE9B    68 08BC96>PUSH 96BC08
    124. 0096CEA0    8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
    125. 0096CEA4    8BD5      MOV EDX,EBP
    126. 0096CEA6    8BC3      MOV EAX,EBX
    127. 0096CEA8    E8 BFF4FF>CALL 0096C36C
    128. 0096CEAD    8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]             ; 这里壳又要对IAT破坏处理,我们这里又要自己修复一下
    129. 0096CEB1    8902      MOV DWORD PTR DS:[EDX],EAX               ; 这里写上我们自己的代码
    130. 0096CEB3    8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
    131. 0096CEB7    8906      MOV DWORD PTR DS:[ESI],EAX
    132. 0096CEB9    0FB74424 >MOVZX EAX,WORD PTR SS:[ESP+4]
    133. 0096CEBE    0143 08   ADD DWORD PTR DS:[EBX+8],EAX
    134. 0096CEC1  ^ E9 ADFDFF>JMP 0096CC73                             ; 处理完就跳回去
    135. 当AL=1时的修复代码:
    136. 0096CEA8    E8 BFF4FF>CALL 0096C36C
    137. 0096CEAD    E8 8E3122>CALL 00B90040
    138. 0096CEB2    90        NOP
    139. 0096CEB3    90        NOP
    140. 0096CEB4    90        NOP
    141. 0096CEB5    90        NOP
    142. 0096CEB6    90        NOP
    143. 0096CEB7    90        NOP
    144. 0096CEB8    90        NOP
    145. 0096CEB9    0FB74424 >MOVZX EAX,WORD PTR SS:[ESP+4]
    146. 0096CEBE    0143 08   ADD DWORD PTR DS:[EBX+8],EAX
    147. 0096CEC1  ^ E9 ADFDFF>JMP 0096CC73

    148. 00B90040处的修复代码:
    149. 00B90040    51        PUSH ECX                                 ; 保护现场
    150. 00B90041    52        PUSH EDX
    151. 00B90042    8B5424 20 MOV EDX,DWORD PTR SS:[ESP+20]            ; 取出当然要处理DLL的基址
    152. 00B90046    3B15 0000>CMP EDX,DWORD PTR DS:[BA0000]            ; 比较基址是否相同
    153. 00B9004C    74 0D     JE SHORT 00B9005B
    154. 00B9004E    8915 0000>MOV DWORD PTR DS:[BA0000],EDX
    155. 00B90054    8305 1000>ADD DWORD PTR DS:[BA0010],4
    156. 00B9005B    8B0D 1000>MOV ECX,DWORD PTR DS:[BA0010]            ; 1.0040C004
    157. 00B90061    8929      MOV DWORD PTR DS:[ECX],EBP               ; 把IAT写到我们要指定的地址去也就是40c000那个段里
    158. 00B90063    890E      MOV DWORD PTR DS:[ESI],ECX               ; 那保存函数的地址写入程序中
    159. 00B90065    8305 1000>ADD DWORD PTR DS:[BA0010],4
    160. 00B9006C    5A        POP EDX
    161. 00B9006D    59        POP ECX                                  ; 还原现场
    162. 00B9006E    C3        RETN                                     ; 执行到返回
    163. 到了AL=4的处理了:
    164. 0096CEC6    3C 04     CMP AL,4                                 ; 当AL为4有两个分支
    165. 0096CEC8    0F85 F400>JNZ 0096CFC2
    166. 0096CECE    EB 01     JMP SHORT 0096CED1
    167. 0096CED0    90        NOP
    168. 0096CED1    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    169. 0096CED4    8A00      MOV AL,BYTE PTR DS:[EAX]
    170. 0096CED6    FF43 08   INC DWORD PTR DS:[EBX+8]
    171. 0096CED9    84C0      TEST AL,AL
    172. 0096CEDB    75 5B     JNZ SHORT 0096CF38                       ; 这里跳的话就和AL=1时的处理一样
    173. 0096CEDD    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]             ; 这里是AL=4时的第一个分支
    174. 0096CEE0    8B30      MOV ESI,DWORD PTR DS:[EAX]
    175. 0096CEE2    8343 08 0>ADD DWORD PTR DS:[EBX+8],4
    176. 0096CEE6    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    177. 0096CEE9    8B28      MOV EBP,DWORD PTR DS:[EAX]
    178. 0096CEEB    8343 08 0>ADD DWORD PTR DS:[EBX+8],4
    179. 0096CEEF    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    180. 0096CEF2    8B00      MOV EAX,DWORD PTR DS:[EAX]
    181. 0096CEF4    894424 2C MOV DWORD PTR SS:[ESP+2C],EAX
    182. 0096CEF8    8343 08 0>ADD DWORD PTR DS:[EBX+8],4
    183. 0096CEFC    837B 30 0>CMP DWORD PTR DS:[EBX+30],0
    184. 0096CF00    75 0A     JNZ SHORT 0096CF0C
    185. 0096CF02    68 E8D096>PUSH 96D0E8                              ; ASCII "81
    186. "
    187. 0096CF07    E8 246CFF>CALL 00963B30
    188. 0096CF0C    8D5424 30 LEA EDX,DWORD PTR SS:[ESP+30]
    189. 0096CF10    8BC3      MOV EAX,EBX
    190. 0096CF12    E8 8DF8FF>CALL 0096C7A4                            ; 这个CALL要进去,因为这里面就是计算将要保存IAT的地址
    191. 进去看看先:
    192. 0096C7A4    53        PUSH EBX
    193. 0096C7A5    56        PUSH ESI
    194. 0096C7A6    8BF2      MOV ESI,EDX
    195. 0096C7A8    8BD8      MOV EBX,EAX
    196. 0096C7AA    B8 040000>MOV EAX,4
    197. 0096C7AF    E8 985DFE>CALL 0095254C
    198. 0096C7B4    8906      MOV DWORD PTR DS:[ESI],EAX               ; 这里把计算出来的地址填入[esi]中
    199. 0096C7B6    8B43 40   MOV EAX,DWORD PTR DS:[EBX+40]
    200. 0096C7B9    8946 04   MOV DWORD PTR DS:[ESI+4],EAX
    201. 0096C7BC    5E        POP ESI
    202. 0096C7BD    5B        POP EBX
    203. 0096C7BE    C3        RETN
    204. 这里处理第一个分支先,第二个分支我们可以完全调用AL=1时的代码,AL=4第一个分支的修复代码:
    205. 0096C7A4    53        PUSH EBX
    206. 0096C7A5    56        PUSH ESI
    207. 0096C7A6    8BF2      MOV ESI,EDX
    208. 0096C7A8    8BD8      MOV EBX,EAX
    209. 0096C7AA    B8 040000>MOV EAX,4
    210. 0096C7AF    E8 985DFE>CALL 0095254C
    211. 0096C7B4    E8 C13822>CALL 00B9007A
    212. 0096C7B9    8946 04   MOV DWORD PTR DS:[ESI+4],EAX
    213. 0096C7BC    5E        POP ESI
    214. 0096C7BD    5B        POP EBX
    215. 0096C7BE    C3        RETN

    216. 00B9007A的修复代码:
    217. 00B9007A    51        PUSH ECX                                 ; 保护现场
    218. 00B9007B    52        PUSH EDX
    219. 00B9007C    8B5424 2C MOV EDX,DWORD PTR SS:[ESP+2C]            ; 取出当然要处理DLL的基址
    220. 00B90080    3B15 0000>CMP EDX,DWORD PTR DS:[BA0000]            ; kernel32.7C800000
    221. 00B90086    74 0D     JE SHORT 00B90095
    222. 00B90088    8915 0000>MOV DWORD PTR DS:[BA0000],EDX
    223. 00B9008E    8305 1000>ADD DWORD PTR DS:[BA0010],4
    224. 00B90095    8B0D 1000>MOV ECX,DWORD PTR DS:[BA0010]            ; 1.0040C020
    225. 00B9009B    890E      MOV DWORD PTR DS:[ESI],ECX               ; 取出我们要保存IAT的址址到[ESI]中
    226. 00B9009D    8305 1000>ADD DWORD PTR DS:[BA0010],4
    227. 00B900A4    5A        POP EDX
    228. 00B900A5    59        POP ECX                                  ; 还原现场
    229. 00B900A6    8B43 40   MOV EAX,DWORD PTR DS:[EBX+40]            ; 执行我们前面所"吃"掉一行代码
    230. 00B900A9    C3        RETN                                ;执行到返回
    231. ……
    232. 0096CF17    8B4424 2C MOV EAX,DWORD PTR SS:[ESP+2C]
    233. 0096CF1B    50        PUSH EAX
    234. 0096CF1C    8D4424 34 LEA EAX,DWORD PTR SS:[ESP+34]
    235. 0096CF20    50        PUSH EAX
    236. 0096CF21    55        PUSH EBP
    237. 0096CF22    A1 70A597>MOV EAX,DWORD PTR DS:[97A570]
    238. 0096CF27    8B00      MOV EAX,DWORD PTR DS:[EAX]
    239. 0096CF29    50        PUSH EAX
    240. 0096CF2A    56        PUSH ESI
    241. 0096CF2B    8B4424 28 MOV EAX,DWORD PTR SS:[ESP+28]
    242. 0096CF2F    50        PUSH EAX
    243. 0096CF30    FF53 30   CALL DWORD PTR DS:[EBX+30]               ; 这里计算函数并写入地址
    244. 0096CF33  ^ E9 3BFDFF>JMP 0096CC73
    245. 0096CF38    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    246. 0096CF3B    8B00      MOV EAX,DWORD PTR DS:[EAX]
    247. 0096CF3D    890424    MOV DWORD PTR SS:[ESP],EAX
    248. 0096CF40    8343 08 0>ADD DWORD PTR DS:[EBX+8],4
    249. 0096CF44    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    250. 0096CF47    66:8B00   MOV AX,WORD PTR DS:[EAX]
    251. 0096CF4A    66:894424>MOV WORD PTR SS:[ESP+4],AX
    252. 0096CF4F    8343 08 0>ADD DWORD PTR DS:[EBX+8],2
    253. 0096CF53    8B0C24    MOV ECX,DWORD PTR SS:[ESP]
    254. 0096CF56    66:8B5424>MOV DX,WORD PTR SS:[ESP+4]
    255. 0096CF5B    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    256. 0096CF5E    E8 91ABFF>CALL 00967AF4
    257. 0096CF63    8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10]
    258. 0096CF67    E8 E055FE>CALL 0095254C
    259. 0096CF6C    894424 0C MOV DWORD PTR SS:[ESP+C],EAX
    260. 0096CF70    8B43 08   MOV EAX,DWORD PTR DS:[EBX+8]
    261. 0096CF73    50        PUSH EAX
    262. 0096CF74    8B4424 18 MOV EAX,DWORD PTR SS:[ESP+18]
    263. 0096CF78    50        PUSH EAX
    264. 0096CF79    A1 B8A697>MOV EAX,DWORD PTR DS:[97A6B8]
    265. 0096CF7E    8B00      MOV EAX,DWORD PTR DS:[EAX]
    266. 0096CF80    FFD0      CALL EAX                                 ; GetProcAddress
    267. 0096CF82    8BE8      MOV EBP,EAX
    268. 0096CF84    85ED      TEST EBP,EBP
    269. 0096CF86    75 0C     JNZ SHORT 0096CF94                       ; 如果获取成功就跳
    270. 0096CF88    68 F8D096>PUSH 96D0F8                              ; ASCII "250
    271. "
    272. 0096CF8D    E8 9E6BFF>CALL 00963B30
    273. 0096CF92    EB 15     JMP SHORT 0096CFA9
    274. 0096CF94    A1 ECA597>MOV EAX,DWORD PTR DS:[97A5EC]
    275. 0096CF99    3B28      CMP EBP,DWORD PTR DS:[EAX]
    276. 0096CF9B    75 0C     JNZ SHORT 0096CFA9
    277. 0096CF9D    837B 34 0>CMP DWORD PTR DS:[EBX+34],0
    278. 0096CFA1    74 06     JE SHORT 0096CFA9
    279. 0096CFA3    8B6B 34   MOV EBP,DWORD PTR DS:[EBX+34]
    280. 0096CFA6    036B 40   ADD EBP,DWORD PTR DS:[EBX+40]
    281. 0096CFA9    8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]             ; 到这里就是和AL=1的处理一样,这里就是第二个分支
    282. 0096CFAD    8928      MOV DWORD PTR DS:[EAX],EBP
    283. 0096CFAF    8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
    284. 0096CFB3    8906      MOV DWORD PTR DS:[ESI],EAX
    285. 0096CFB5    0FB74424 >MOVZX EAX,WORD PTR SS:[ESP+4]
    286. 0096CFBA    0143 08   ADD DWORD PTR DS:[EBX+8],EAX
    287. 0096CFBD  ^ E9 B1FCFF>JMP 0096CC73
    288. ……
    289. 第二个分支的处理,这里很简单我们只改几行代码就行了,改成这样子:
    290. 0096CFA9    E8 923022>CALL 00B90040                        ;和AL=1一样的处理
    291. 0096CFAE    90        NOP
    292. 0096CFAF    90        NOP
    293. 0096CFB0    90        NOP
    294. 0096CFB1    90        NOP
    295. 0096CFB2    90        NOP
    296. 0096CFB3    90        NOP
    297. 0096CFB4    90        NOP
    298. 这个程序里没有AL=3和AL=5的情况,所以我也就不多说了.
    299. 好了,处理完IAT后我们记住这里:
    300. 00963767    C603 E9   MOV BYTE PTR DS:[EBX],0E9
    301. 直接在这00963767处下断,然后运行,中断在这里后,我们就知道这里的[EBX]就是保存我们的目标程序的OEP,这个对DELPHI的程序就可能不止在这里中断一次,但跳去的地方一定是壳抽程序的代码。
    302. 00963756    8BC0      MOV EAX,EAX
    303. 00963758    55        PUSH EBP
    304. 00963759    8BEC      MOV EBP,ESP
    305. 0096375B    53        PUSH EBX
    306. 0096375C    8BD8      MOV EBX,EAX
    307. 0096375E    8BC2      MOV EAX,EDX
    308. 00963760    8BD1      MOV EDX,ECX
    309. 00963762    E8 79FFFF>CALL 009636E0
    310. 00963767    C603 E9   MOV BYTE PTR DS:[EBX],0E9
    311. 0096376A    8D53 01   LEA EDX,DWORD PTR DS:[EBX+1]             ; 这里原程跳就是壳抽程序代码的开始地方
    312. 0096376D    8902      MOV DWORD PTR DS:[EDX],EAX
    313. 0096376F    8B45 08   MOV EAX,DWORD PTR SS:[EBP+8]
    314. 00963772    8910      MOV DWORD PTR DS:[EAX],EDX
    315. 00963774    B8 050000>MOV EAX,5
    316. 00963779    5B        POP EBX
    317. 0096377A    5D        POP EBP
    318. 0096377B    C2 0400   RETN 4                                   ; 直接执行到这里,然后到4010cc处看看
    319. ……
    320. 004010CC  - E9 48F177>JMP 00B80219                             ; 这里跳去的地方就是壳抽程序的代码的开始处
    321. 004010D1    7D 5E     JGE SHORT 00401131
    322. 004010D3    FF15 00C0>CALL DWORD PTR DS:[40C000]               ; kernel32.GetCommandLineA
    323. 00B80219就是壳执行原程序的开始处.所以我们直接在00B80219处下个断,然后运行,再次中断后我们就可以比较直观的看到被抽的代码。
    324. 00B80219    55        PUSH EBP                                 ; 在这里下断,这就是程序的第一行代码
    325. 00B8021A    336C24 08 XOR EBP,DWORD PTR SS:[ESP+8]
    326. 00B8021E    336C24 28 XOR EBP,DWORD PTR SS:[ESP+28]
    327. 00B80222    8BEC      MOV EBP,ESP                              ; 第二行
    328. ……
    329. 00B80273    83EC 44   SUB ESP,44                               ; 第三行
    330. 00B80276    56        PUSH ESI                                 ; 最后一行代码
    331. 00B80277  ^ E9 ADFFFF>JMP 00B80229
    332. 这样程序被抽的代码就找回来的,当然,如果是加的DELPHI或其它的C的程序抽的代码就不是这么少了。
    333. 好了,现在我们被上代码,然后DUMP和修复一下就行了.

    334. Greetz:
    335. Fly.Jingulong,yock,tDasm.David.ahao.UFO(brother).alan(sister).all of my friends and you!

    336. By loveboom[DFCG][FCG]
    337. Email:bmd2chen@tom.com
    338. 附件:aspr.rar 附件:aspr.rar转载原创帖请注明出自看雪论坛pediy.com,本贴地址请保留:[url]http://bbs.pediy.com/showthread.php?s=&threadid=6320[/url]
    复制代码


    由 loveboom 于 2004-10-28 23:07 最后编辑
    =========================

    破解的文章是有,但菜鸟实在很难看得明白,请高手做一个动画教程
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-4 17:38:04 | 显示全部楼层
    支持一下!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-7 12:28:58 | 显示全部楼层
    同样期待中,,:lol:
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-13 16:57:30 | 显示全部楼层
    是的,我也也很想学习
       期待高手的支持!!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表