本帖最后由 Martin 于 2014-10-18 23:02 编辑
一、开篇 首先要写在前面本篇文章写的UPX 脱壳脚本有可能不是所有的UPX都使用,仅供学如果,仅供学习怎样去一个简单地脚本节省劳动力,这里不多废话,俗话说的好:“工欲善其事必先利器”,那么我们今天要用的利器就是OllySubScript脚本编写工具,有很多这类的工具,找一个就好了!下面就是对写脚本的具体分析。 这里重点说明一点:写脚本其实就是对在OD中进行分析得来的,这句话说通俗点就是比如我们载入OD后我们都会F8单步走,那么对应翻译成脚本就是STO,我们在脚本中写STO就是单步走一下! 今天我们要写的加了UPX壳的DLL,顺便将DLL的重定位地址找到;着重讲的是一个思路,这里重点思路是UPX壳是开始都是pushad和结尾是popad,这里就算是我们找到的一个特征码,记录下来我们将DLL文件载入到OD中进行查看!首先用PEID查壳看一下壳的版本!
图一
将DLL文件载入到OD中。相信大家手托过UPX的都知道往下拉看看结尾处!
图二
我们通过这个跳转到OEP的上面看到popad这个指令,那么我们就可以找到一个关键点,也就是这个popad这里,那么我们就从这里下手!进行写脚本!我们可以通过OD里面的搜索功能查找popad出现的次数,Ctrl+F查找popad;发现还有一个地方有这个指令,就是下面这里:
图三
既然我们已经找到了这个关键点Popad了,那么我们就来开始写脚本! 首先我要在脚本中写找到popad这个指令的语句,用Find查找来进行,类似于OD里面的Ctrl+B查找61;如果查找成功,地址会保存到保留变量$RESULT中,否则$RESULT将等于 0 [Asm] 纯文本查看 复制代码 1 2 3 4 5 6 7 8 | Var cc //这里声明一个变量用来保存$RESULT的值
FIND eip, #61# //类似于Ctrl+B,结果保存在$RESULT当中
MOV cc,$RESULT //将查找的61的地址保存在cc中,注意这里查找的 popad 是100A0A29地址处的 popad ,注意我们在这个地方下硬件执行断点时候OD停不下来,那么我们就可以 ret 后面进行下断点2F-29=6,那么我们就在这个cc基础上加6
ADD cc,6
BPHWS cc,”x” //在指定地址,设置硬件断点。有三种模式: "r" - 读取, "w" - 写入 或者 "x" - 执行.
RUN //运行
MSG $RESULT //弹出地址下硬件执行断点的地址(用来做测试)
BPHWC cc //清楚硬件执行断点
|
上面的代码就会运行到我们查找的第一个popad后面的100A0A2F处断下,代码是add edi,0x4,100A0A2F处下面再查找popad的时候就是到OEP的那个Jmp上面的Popad了! [Asm] 纯文本查看 复制代码 1 2 3 4 5 | FIND eip, #61# //类似于Ctrl+B,结果保存在$RESULT当中
BPHWS $RESULT, "x"
RUN
MSG $RESULT
BPHWC $RESULT
|
这时候代码就会段在图一所示的100A0A60处的popad,那么我们接下来要做的只需要单步两下,再对代码进行分析就到了OEP; [Asm] 纯文本查看 复制代码 1 2 3 4 5 | STO //单步F8运行
STO //单步F8运行
MSG "欢迎来到OEP,By:BattleHeart"
AN eip //对程序进行分析
RET
|
这样初步的脚本就写完了,接下来就是我们所说的对DLL进行加壳之后比EXE多一个重定位的查找; 这里我们说一个快速查到的UPX壳的DLL重定位地址的方法,那就是搜索下面这几条语句; [Asm] 纯文本查看 复制代码 1 2 3 4 | xchg ah , al
rol eax ,0x10
xchg ah , al
add eax , esi
|
这几条指令上面会有moveax,dword ptr ds:[ebx],dword ptr ds:[ebx]存放的就是重定位的地址。
图四
那么我们就需要查找这几个指令,进行查找重定位地址 [Asm] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 | VAR tezhengma1 //用来存放重定位地址
VAR ee //用来存放$RESULT的结果
FIND eip,#86c4c1c010# //查找上面指令
MOV ee,$RESULT
MSG $RESULT //这里地址是100A0A46
SUB ee,2 //100A0A44这个位置
BP ee //断点到 Mov eax , dword ptr ds :[ ebx ]
MOV tezhengma1,[ ebx ] //既然已经断在了这个位置那么我们就可以取出这个值并弹出来
MSG tezhengma1
BC ee //清楚F2断点
|
分析完毕; 整个脚本就是如下所示; [Asm] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //UPX脱壳脚本之一
VAR cc
VAR tezhengma1
VAR ee
FIND eip,#86c4c1c010#
MOV ee,$RESULT
MSG $RESULT
SUB ee,2
BP ee
MOV tezhengma1,[ ebx ]
MSG tezhengma1
BC ee
FIND eip, #61#
MOV cc,$RESULT
ADD cc,6
BPHWS cc, "x"
RUN
MSG $RESULT
BPHWC cc
FIND eip, #61#
BPHWS $RESULT, "x"
RUN
MSG $RESULT
BPHWC $RESULT
STO
STO
MSG "欢迎来到OEP,By:BattleHeart"
AN eip
RET
|
运行结果: 这个是重定位处断下的地址
图五
这个是重定位地址:别忘了减去基址哦!
图六
第一个Popad地址:
图七
断在了popad处
图八
OEP了!
图九
程序下载地:链接: http://pan.baidu.com/s/1o6HmsrC 密码: a2b6
希望大家在看的时候别忘了给点热心值,写文章不易啊!!各位看官
|