avatar

目录
脱壳(PC逆向2)

ZP1.4脱壳

双击打开软件。查看是否有类似对话框(无试用和注册框,有注册框的话 断点:DialogBoxIndirectParamA

拖进OD

F7运行一下,然后Ctrl+G,输入DialogBoxIndirectParamA

来到这里,看右下方,数据窗口

对第一个Return 语句,右键,然后数据窗口处跟随,或者快捷键Enter

.png)

接着,往上拉,在je处,下硬件断点,然后重新打开软件

打开软件后,F7运行一下,下ESP断点

接着,按F9运行,回到刚才 下的硬件断点位置

点击右边的Z,原本是0,左键点一下,让他转为1,使这个跳转发生

因为刚才下了ESP断点,所以跳转产生以后,F9一次,然后F7一路跟下来,会到这么一段地址,在这里删除分析

删除分析后,就是易语言的入口头部特征了

接着打开LodePE,对软件进行完整转存

在头部,记录下OEP的地址

打开这款工具,选择软件,输入OEP地址,获取输入表

可以看到,此时获取到的函数都是无效的。

打开ZP Fixer,Process ID 输入进程ID,

开始字段,就是图片位置,不过要加400000,就是原本是00160000 ,就要改为00560000

结束字段也是一样

Patch VA,回到OD,看到头部下的第一个call,一路F7,进入第一个CALL

接着在一路F7。直到进入到这样子的代码段,retn ,就是Path VA的地址

Zero VA ,看到retn 上面的 CALL,那个就是Zero VA入口点,F7进去,看到一个ResumeThread,这个回调函数下,有一个cmp 比较,里面的基址就是Zero Va 的地址。

复制进去ZP 软件,点击Start,会生成一个地址,把他复制进OD,转到那个地址处

然后右键,将此处转为新的EIP

接着, 在下面那个XOR eax,eax 处下断

在回到Import REC那个软件。再次获取输入表,可以看到,没有无效函数了,然后转存文件

到这里,ZP1.4脱壳完成


vp1.9脱壳

拖入OD,运行,点击右上方那个M,然后Ctrl +B ,复制机器码,搜索

第一次搜索结果,把它拉到一旁,快捷键Ctrl+L在搜索一次

记录下第二次搜索出来的地址

点击一下C,Ctrl+G,跳转到这个函数,这个函数是申请内存的函数VirtualAlloc

然后在retn 处下断,不能在函数头下断会被检测到。

然后重新启动软件,点击运行,运行两次到三次,在数据窗口处跳转到刚才搜出来的地址,在第二行最后一处下内存写入断点,接着运行两下,取消函数申请的那个Retn断点,然后单步运行,观察下方数据窗口处,等到出现机器码了,就将刚才的机器码替换成正确的机器码,然后配合Key,就破解完成了。


SE2.3.9脱壳

拖入OD,SE壳有个特征码8D4DD4E8,在OD中CTRL +B 搜索这个特征

.png)

跳过去以后,在第一个CALL下断,接着F7跟进去,一路F7,直到看见PUSH ESI ,而且有个箭头往上跑的

.png)

把 push esi 的 地址保存下来。

放入脚本中

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*****************************************/
/* safengine 2.3.6x XXOO */
/* by:Xjun */
/*****************************************/

var CodeBase
var CodeSize
var CodeEnd
var SE_Memcpy
var RandKey
var RandKeySize
var RSAPublicKey
var RSAPublicKeySize
var Crc

/////////////////////////////
mov RandKeySize,AA0
mov RSAPublicKeySize,104
/////////////////////////////

mov SE_Memcpy,0050A557 //push esi 的地址

/////////////////////////////


start:
bphwcall
bc
GMEMI eip,MEMORYBASE
mov CodeBase,$RESULT
add CodeEnd,CodeBase
GMEMI eip,MEMORYSIZE
mov CodeSize,$RESULT
add CodeEnd,CodeSize
FIND CodeBase,#C1C00733C6413B4C240872F0#
add $RESULT,0D
mov Crc,$RESULT
bp Crc

RUN
RUN
RUN
RUN
RUN
RUN
RandKey:
bc
EVAL "edx > {CodeBase} && edx < {CodeEnd} && [esp+4] > 0A9F && [esp+4] < 0AA1"
BPCND SE_Memcpy,$RESULT
RUN
ITOA edx
WRTA "log.txt","RandKey: "+$RESULT
DM edx,RandKeySize,"RandKey.bin"
bc
RSAPublicKey:
find CodeBase,#61C3#
cmp $RESULT,0
je loop
add $RESULT,1
bp $RESULT
mov CodeBase,$RESULT
jmp RSAPublicKey

loop:
run
cmp eax,104
jne loop
cmp [esp+48],104
jne fail
mov RSAPublicKey,[esp+44]
ITOA RSAPublicKey
WRTA "log.txt","RSAPublicKey: "+$RESULT
DM RSAPublicKey,218,"RSAPublicKey.bin"
bc
msg "xxoo提取完毕!"
ret
fail:
msg "提取失败!"
ret

然后在OD运行脚本,脚本运行完成后,会生成三个文件,然后就可以使用SEDEKEY工具,生成data文件

把生成的data文件,拉进Keygan文件夹内,使用注册机,生成一个KEY

然后把生成的KEY文件,拉到和EXE文件同目录,双击打开EXE文件,会显示文件已损坏,这时候要修复一下软件.

打开log.txt ,复制RSAPublicKEY的值,把软件拖进OD,然后在数据窗口中,跳转到这个地址

接着在打开C32ASM,把RSAPublic.bin文件拖进去,以十六进制打开

然后把这里的数据,全选,以HEX格式化拷贝

回到OD,在数据窗口中,尽量选择多一点行数,二进制粘贴进去,多一点

然后运行,好了,大功告成。


文章作者: KeyboArd
文章链接: https://www.wrpzkb.cn/pojie2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KeyboArd's Blog
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论