通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
软件保护中常见自校检分析实例
责任编辑:酷酷鱼   更新日期:2007-10-31
 

可以看出,00401072处的CALL最终呼叫ExitProcess退出,所以只要使0040104F处的跳转失效即可,将0040104F的跳转NOP掉后保存,测试运行正常。

三、利用第三方软件辅助查找关键的地方。很多软件利用CRC或者MD5实现磁盘文件校验或者内存映像校验等,对此类软件我们可以利用算法识别工具找到密码学算法和核心,然后层层向上,找到最初的调用地方更改其流程方向。还是附件中的sample1.EXE,脱壳的文件为dumped.EXE,我们来解决这个软件的自校检。先用PEID的插件kanal分析dumped.EXE所采的密码学算法,如图,

可以看出,软件采用了CRC算法,算法特征码出现在0040131C,就从这里入手,OD载入dumped.EXE,CTRL+G搜索0040131C:
0040131C  |?  2083 B8ED898D AND BYTE PTR DS:[EBX+8D89EDB8],AL        ;  找到的地方在这里,上拉找到这个CALL的首部
00401322  |?  FC            CLD
00401323  |?  FB            STI
00401324  |?  FFFF          ???                                      ;  未知命令
00401326  |.  EB 0E         ||JMP SHORT crcdumpe.00401336
00401328  |>  8B95 FCFBFFFF ||MOV EDX,DWORD PTR SS:[EBP-404]
0040132E  |.  D1EA          ||SHR EDX,1
00401330  |.  8995 FCFBFFFF ||MOV DWORD PTR SS:[EBP-404],EDX
00401336  |>^ EB B5         |\JMP SHORT crcdumpe.004012ED
00401338  |>  8B85 F8FBFFFF |MOV EAX,DWORD PTR SS:[EBP-408]
0040133E  |.  8B8D FCFBFFFF |MOV ECX,DWORD PTR SS:[EBP-404]
00401344  |.  898C85 00FCFF>|MOV DWORD PTR SS:[EBP+EAX*4-400],ECX
0040134B  |.^ E9 6AFFFFFF   \JMP crcdumpe.004012BA
============================
00401290  /> \55            PUSH EBP                                 ;  到这里,看OD的提示栏:Jump from 00401005,从00401005跳转来的
00401291  |.  8BEC          MOV EBP,ESP
00401293  |.  81EC 50040000 SUB ESP,450
00401299  |.  53            PUSH EBX
0040129A  |.  56            PUSH ESI

在Jump from 00401005上右击,“前往JMP 来自00401005”
00401005   $Content$nbsp;/E9 86020000   JMP crcdumpe.00401290                    ;  到这里,看信息栏内容:Local Call from 00401201,00401201处的CALL调用这里
0040100A   $Content$nbsp;|E9 B1000000   JMP crcdumpe.004010C0
在Local Call from 00401201上右击,“前往CALL 来自00401201”
00401201  |.  E8 FFFDFFFF   CALL crcdumpe.00401005                   ;  到这里,再向上找到这个CALL的顶部
00401206  |.  83C4 08       ADD ESP,8
==================
004010C0  /> \55            PUSH EBP                                 ;  到这里,看任务栏信息:Jump from 0040100A
004010C1  |.  8BEC          MOV EBP,ESP
004010C3  |.  81EC 64010000 SUB ESP,164
在Jump from 0040100A上右击,“前往JMP 来自0040100A”
0040100A   $Content$nbsp;/E9 B1000000   JMP crcdumpe.004010C0                    ;  到这里,继续根据任务栏信息向上找:Local Call from 00401048
0040100F   $Content$nbsp;|E9 1C000000   JMP crcdumpe.00401030
在Local Call from 00401048上右击,“前往CALL 来自00401048”
00401048  |.  E8 BDFFFFFF   CALL crcdumpe.0040100A                   ;  就是这里了,计算CRC并进行对比的CALL
0040104D  |.  85C0          TEST EAX,EAX
0040104F  |.  74 1F         JE SHORT crcdumpe.00401070               ;  这里就是关键跳转了,NOP掉
00401051  |.  8BF4          MOV ESI,ESP
00401053  |.  6A 30         PUSH 30                                  ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401055  |.  68 40004200   PUSH crcdumpe.00420040                   ; |Title = "提示"
0040105A  |.  68 34004200   PUSH crcdumpe.00420034                   ; |Text = "正常运行!"
0040105F  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00401061  |.  FF15 B4524200 CALL DWORD PTR DS:[<&user32.MessageBoxA>>; \MessageBoxA
更改0040104F处的跳转后保存为dumpedFIX,运行正常。

四、对付校检自身大小的软件的一般方法。也有许多软件,利用CHECKSUM、FILELEN等在代码中对本身的大小做了标记,如果发现大小变了就自动退出。附件中的FILELEN就是这样的,FILELEN-UNPACK.EXE是脱壳后的软件,由于脱壳后软件大小发生了变化,所以FILELEN-UNPACK运行后就自动退出。对付这种校检,我们有个简单的方法,就是将脱壳后的软件中检测自身大小的部分改为脱壳后文件的大小。我们看一下FILELEN的大小为:10752字节转16进制为2A00,再看看脱壳后的文件FILELEN-UNPACK.EXE的大小30208字节,即7600,关键是如何找到对自身大小进行对比的语句,我们知道一般的形式都是CMP EAX,2A00,但是到底是哪个寄存器呢?EAX,EBX、ECX....,寄存器种类比较多,我们不可能每个去找,这时W32Dasm派上用场。用W32Dasm载入FILELEN-UNPACK,我们只要搜索00002A00即可,前面的部分不管它,找到在这里:
:00401B8F 81FE002A0000            cmp esi, 00002A00
右击-“HEX”,更改代码002A00为脱壳后的大小007600即可,再搜索,发现该例只有一个对比的地方,保存后运行正常。
对于VB检测自身大小的软件我们还可以跟踪FileLen函数,因为VB一般都用FileLen检测自身的大小,用OD载入FILELEN-UNPACK.EXE,下断BP rtcFileLen,F9后断下,ALT+F9返回:
00401B5E   .  8BF0          MOV ESI,EAX                              ;  这里EAX的值就是FILELEN取得的自身的大小,EAX=00007600
00401B60   .  8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
00401B63   .  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
00401B66   .  52            PUSH EDX
00401B67   .  8D4D E0       LEA ECX,DWORD PTR SS:[EBP-20]
00401B6A   .  50            PUSH EAX
00401B6B   .  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
00401B6E   .  51            PUSH ECX
00401B6F   .  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
00401B72   .  52            PUSH EDX
00401B73   .  50            PUSH EAX
00401B74   .  6A 05         PUSH 5
00401B76   .  FF15 70104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStrList
00401B7C   .  8D4D CC       LEA ECX,DWORD PTR SS:[EBP-34]
00401B7F   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
00401B82   .  51            PUSH ECX
00401B83   .  52            PUSH EDX
00401B84   .  6A 02         PUSH 2
00401B86   .  FF15 14104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeO>;  msvbvm60.__vbaFreeObjList
00401B8C   .  83C4 24       ADD ESP,24
00401B8F   .  81FE 002A0000 CMP ESI,2A00                             ;  这里就是利用FILELEN取得的大小与原来做的标记对比,可以改这里的2A00为7600或者更改下面的跳转
00401B95   .  75 6E         JNZ SHORT FILELEN-.00401C05
00401B97   .  B9 04000280   MOV ECX,80020004

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题