• 标 题:Any to Icon 2.1b 脱壳及修复
  • 作 者:jingulong
  • 时 间:2004-1-26 周一, 下午11:25
  • 链 接:http://bbs.pediy.com

原版下载:http://www.aha-soft.com/download.htm

这是 fly前天提到的一个话题“脱壳后仍然有问题...”。今天看了后觉得作者在“暗桩”和“版权信息”
上的手法值得大伙看看,就写了以下文字,不当之处还望各位大侠指点。

一、脱壳
    因为不是aspr新版的壳,用od可以非常方便地在伪 oep处从堆栈中找回stolen code,如下:

PUSH EBP
MOV EBP,ESP
ADD ESP,-0C
MOV EAX,4D4198

在od中于4d4520处开始键入以上代码后dump,再修复 iat就算脱壳了。(这一节还算顺利)

二、修复

程序经上面手续后,界面出来了,就是不能正常开工---载入文件点击 next>就出错!看看吧,......,

呵呵,运气不错哦  ,在出错代码不远看到:
cmp ebx,0c3500
jle xxxxxx
(看看这里的ebx值)在此处下断后重新加载执行,顺着上次的错误路线,停在断点时,ebx=13c00,13c00是一个什么数?
一种预感让我用鼠标右键点上了dumped_.exe,哈哈,果然在预料中,那是dumped_.exe的size值啊! 
作者在这里检查文件是否被unpack啊,好吧,简单地把上面的 jie改成 jmp试试,ok! 
程序现在可以顺利地把一个图片搞成icon文件了,是不是很简单啊!(真这样也就没有这篇破文了)  
但是...,这个但是的出现真把人搞得...,麻烦!
这个“但是”是:如果过程中你点击<back或者repeat之类的按钮,程序会进入没有尽头的递归,结果是可想的了!!!
哪里出毛病了?估计还是那个size值吧?那么程序在哪里获得这个值的,考察api:
1. GetFileSize
2. SetFilePointer
辛辛苦苦看了半天,却没有发现什么!看来作者是有被而来啊(这才有意思嘛)。好吧,让咱再试试...,

哈哈,终于还是发现与FindFirstFileA这个函数相关,就是这句了:
0040880F  CALL <JMP.&kernel32.FindFirstFileA>
咋办?总不能简单处理吧!没法只好加入一段代码来应付了,在程序内找一“空地”(我选定53b180)键入:

0053B180    POP EAX
0053B181    XCHG DWORD PTR SS:[ESP+4],EAX
0053B185    MOV DWORD PTR DS:[53B160],EAX
0053B18A    XCHG DWORD PTR SS:[ESP],EAX
0053B18D    MOV DWORD PTR DS:[53B168],EAX
0053B192    PUSH EAX
0053B193    CALL DWORD PTR DS:[<&kernel32.FindFirstFileA>]
0053B199    PUSH EAX
0053B19A    PUSH ESI
0053B19B    PUSH EDI
0053B19C    PUSH EBX
0053B19D    PUSH ECX
0053B19E    PUSH EDX
0053B19F    CALL DWORD PTR DS:[<&kernel32.GetCommandLineA>] 
0053B1A5    MOV ESI,EAX
0053B1A7    MOV EDI,DWORD PTR DS:[53B168]
0053B1AD    MOV ECX,-1
0053B1B2    MOV AL,0
0053B1B4    REPNE SCAS BYTE PTR ES:[EDI]
0053B1B6    NOT ECX
0053B1B8    SUB EDI,ECX
0053B1BA    DEC ECX
0053B1BB    INC ESI
0053B1BC    NOP
0053B1BD    REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0053B1BF    JNZ SHORT dumped_.0053B1CD
0053B1C1    MOV EAX,DWORD PTR DS:[53B160]
0053B1C6    MO DWORD PTR DS:[EAX+20],7F000  ;把size值改成原来的
0053B1CD    POP EDX
0053B1CE    POP ECX
0053B1CF    POP EBX
0053B1D0    POP EDI
0053B1D1    POP ESI
0053B1D2    POP EAX
0053B1D3    RETN

以上代码的作用是 1.完成FindFirstFileA的任务;2.检查Find的文件是否为程序本身,若是,则把size值改过来,呵呵。
ok,把0040880F处的CALL <JMP.&kernel32.FindFirstFileA>改成 call 0053B180再试试,all right!!!(啦啦啦...)  

三、修改“注册信息”
既然都这样了,就再玩玩吧。每次启动那个未注册的信息的确让人想去改改。