• 标 题:aspr1.3x注册版加壳之客串教学
  • 作 者:askformore
  • 时 间:004-09-29,17:50
  • 链 接:http://bbs.pediy.com

aspr1.3x注册版加壳之客串教学

注:论述的加壳文件请到汉化世纪或网上自己找吧,下面是脱壳回忆分析,光说文字够多的了--要夸一下自己噢!失误之处还请指正!

  你是否觉得标题很另类,无非是说“教学”有点儿抽象,多盼有好的点击率,但我是很花心机和时间写的(请给于鲜花、烟花、豆腐花、激情火花,让我醉到花花世界中--梦寐以求啊)。那么,这篇文章要说什么呀?呵呵,是说我脱IconSearcher2.20,aspr1.3x注册版的加壳,但是,由于在脱的过程到结束一直没有留下什么笔记或记录,而且现在我的机子的XP出了问题,无法运行,只好玩98了。所以下面所说的仅是记忆中的东西,没有很具体的代码放出来参考,看官自己有心理准备>>>要不你会四脚朝天。主要是采用“以壳解壳”的方法,进行脱壳。修复输入表的事还是少不了跟踪,现在有“代码注入”这个说新也不是太新的方式,可我就是还不会用,但愿有位中国gentleman可以放个实例让我们学习。“以壳解壳”的方法是先处理iat的恢复,最后将运行需要壳的部分搬到脱壳的文件身上(除非没有stolen,你也想想谁会这样便宜你)。

  因为不是标准教学,我也就不用教学“格式”写这篇傻瓜文章。好了,回到我仅有的记忆中……,先了解一下加壳的IconSearcher,我先是比较感兴趣的是它的注册部分,我想以aspr1.24 RC4的方式进行伪注册(第2次硬盘指纹出现后的内存断点中断),可是我所看到的跟以往的不一样,中断时我来到的主程序的code段,第一个指令好像是push ebp,然后call xxxx(code地址),接下来跑一大堆代码(后来知道是自校验,称它为a 校验),来到or eax,eax和je 安全地带,再接下来又跑代码,它要干什么,也是自校验(称它为b 校验),不过这次它是计算它将要前往的代码是否被人放入bpx断点或别的修改,如果你先放了int3断点,那么计算结果就会不同,同样接下来的都是判断je 安全地带(被计算的目的地),也就是来到跟aspr1.24 RC4的方式进行伪注册相似的代码(哈哈,你该会知道怎么做。。。记住地址);接着,出现第3次硬盘指纹(日期登记),手段跟上面相同,若你过期还给你放过期标志。再往后你可能会来到一个生死跳转的异常,内有是否显示nag和过期的判断,往下会看到.regfile和.key的字样,用来骗人的,注册验证早就过了。(这里伪注册不是个解决的办法,同样有nag,有验证call eax,程序到了OEP就OK,这里我们让下面关键的pus ebx的ebx为0就好办,具体自己找好了,或者进入call找cmp byte [esp],0和jne xxxx的指令,这里的[esp]是个仅能去nag的注册标志)。

  好了,我们来看看怎样去修复iat,哈哈,又回到记忆中去,真是难以描述。我们应该知道,iat加密处理有4个分支,它们都是一边解密一边分类和一边修理iat定向(而且如果你按壳给你的定向是无法完成修复,应该按壳放定向的位置自己重新定向),我们处于被动,暂时无法主动。那么4个分支有什么特点呢?看过fly脱飞速加壳的unpackme就会有些明白了(但有所不同)。现在,跟踪发现,有些分支在放加密后返回到循环点时,[code]和api信息还未释放,是我们再生iat的好材料;而且iat处理不在一个异常里完成,那么,它到底在玩什么呀(我以前发的脚本已经变回半效作用,或不够合理,只是不断放硬盘断点)!经过多次跟踪,发现它归根到底还是一个异常里解密加密。是这样的,aspr每到特定的分支的特别加密,就会发动异常,它要干什么,无非是检测你有没有轻薄它的body,你占它便宜,它当然不放过你,还有的是令你以前下的断点无效,像这样(你要做的应该是恢复断点或让它住手,):

8380 B8000000 02 add dword ptr ds:[eax+B8],2 //context
51               push ecx
31C9             xor ecx,ecx   //放0鸡蛋
8948 04          mov dword ptr ds:[eax+4],ecx
8948 08          mov dword ptr ds:[eax+8],ecx
8948 0C          mov dword ptr ds:[eax+C],ecx
8948 10          mov dword ptr ds:[eax+10],ecx
C740 18 55010000 mov dword ptr ds:[eax+18],155
……

所以你进入了iat处理的异常时,处理当中,突然跑出个异常,你就该知道它要check你了。那么怎样去区分异常呢?不是说aspr都有很多异常吗?这时有个简单的方法(tips),每当异常再次发生时,你可以看引发异常的指令是否还是xor [eax],eax,不知有没有写错,但我相信你会明白,如果不是,那就是说iat加密处理完成或发生了一个错误。发生异常时,往下不远处就是它工作的大本营,去那逗留准有大发现。

  分支中以al=4的call [ebx+30]和al=2的mov byte [ebx],0E8有些麻烦,其它的不用说了吧,想重点讲述这两个,现在可没力量和论据支持。那么你首先要令安全地方下的断点有效和自校验失效,断点方面好像已经说了(可能不完全);自校验嘛,你可以到内存镜像窗口观察和你现在身居其中的动态内存块附近有没有长度为4000的内存块,有就转存到cpu窗口,从iamge开始处理偏移04E8处,那里就是存放正确自校验值的地方,在那下内存访问断点,断下的话你就找到比较的地方,接下来你不用我说了吧!

  修复可以参考我写(其中有借用照顾sen的前辈脚本)有脚本,具体还要按实际情况对al=4的call [ebx+30]和al=2的mov byte [ebx],0E8进行变动修复,你也可以写汇编代码或“注入代码”修复,丰俭由人。

  al=4的call [ebx+30] 我认为用内存访问断点比较好(避开解密错误),中断后,此时你观察各寄存器的值,并查找寄存器中那个是code地址,那个是api地址,一般马上取消内存断点,记录它们对你做“修复工作”有用,接着ctrl+F9返回到retn处,循环。因为我对它里面的反跟踪还很糊涂--就这样做才可搞定。

  al=2的mov byte [ebx],0E8 主要是划分FF25 jmp [ ]或FF15 call[],壳中搜下就找到,具体我暂时还没发现有混合的,所有你可能比较好修复。我想了个杀瓜区分方法,当你在此指令上中断后,先到转存到ebx的地址观察,如果它附近是有mov eax,eax的代码,那么你要修复的是Jmp[],否则就是call[](猜测的)。

  还有一个不记得是哪个分支了,在code内存断点中断后,留意壳放入[code]的地址,顺便就转存观察一下,如果转存的地方为空,就有古怪,一定要跟踪里面到底何时放地址,你在寄存器看到的api是假的,再跟踪该壳空地址,就能找到它的“尾巴”了,十有89就是GetProcAddress,就2个什么的,记忆中好象是这样……。

  iat修复完成后(我借用了adata这个区节--有1000的长度使用),我们跳往最后异常retn处,主程序是Dephil写的,代码肯定抽得过瘾,再来一下F7,你就来到搬过来变变变的oep,要找原始的oep也很好找,记下你现在的eip,然后到code段,选择“查找命令”,内填jmp x(x==eip)确定,哈哈,一下就搜出来了,把OEP改定为这。无论它每次运行怎么变,你都会看到停在此处的一条Jmp m(m就是对eip偏移),你按确定,就能回到现时(壳最后异常retn处单步后)的eip位置了。

  现在,你所要做的是把需要壳运行的部分搬到已经修复iat的dump文件中。那么,现在eip所在的内存块当然要插到dump文件里,还有哪个呢?先不要动手,我们先按从eip所在的指令开始用Enter进行模拟运行,过一会儿,你会来到call xxxx (xxxx是超出本块内存的地址),再Enter,到达的这个块也要我们搬回去,好了,我们就先搬这2块回去,经过一轮“修整”后,开另一个OD运行它,如果发现出错,看看堆栈有没有找到返回的痕迹,没有的话你该到刚才找到call xxxx的地址开始跟踪,直到地址发生超范围的改变,你应该会知道接下来怎么干!搬壳就是这回事(注意:Dump文件运行和功能使用没有正常前,请不要关闭停在oep的OD,它是我们修复的参考,若你重来,Dump文件就无效了,因为是壳是动态处理--即使是同一个内存块,代码位置都改变了)。

  到现在,脱壳的事就说完了。顺便说一下IconSearcher2.20的破解吧,好像不说破解有点傻乎乎的,干事干一不干二。还记得a 校验吗?现在修复后的Dump主程序,一运行就错--异常。载入看看,原来还是a 校验,程序还有多处使用这玩意--如about菜单、打开窗口等待,哈哈,多没趣,于是写个脚本把它一次清理个光光(无非是 改掉/nop 指令或让它跑到 JE安全处),并写回注册名后保存,showwin,再运行,哈哈,东点西点,它也没意见了,让它身体发福了--3M多(原来是1M呀)。


长篇小说作者:askformore 

writen by 9.26.2004

  生命之美源于----渴望无限
  惊喜之新源于----爱的发现