论坛风格切换
正版合作和侵权请联系 sd173@foxmail.com
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
购买邀请后未收到邀请联系sdbeta@qq.com
  • 4047阅读
  • 2回复

[求助-系统问题]Safengine Licensor 1.85DEMO 默认加壳IAT修复 [复制链接]

上一主题 下一主题
离线pony8000
 

发帖
53392
今日发帖
最后登录
2024-11-15
只看楼主 倒序阅读 使用道具 楼主  发表于: 2010-12-05 22:49:49
【详细过程】
   说明一下由于自己的粗心使得原来对脚本少了几个校验,导致有部分的一字节没有修复,现在脚本已经增加校验,这样脱壳后修复的IAT中那一个字节已经修复了所以重新上传脚本,在这里补充一下原来文章中缺少的部分内容。
   操作步骤:
   1、先到达OEP然后跑脚本,
   2、等脚本跑完后,运行UIF修复然后 ,LP dump,IRC修复,
   3、最后用LP把UIF最后修复IAT申请的区段DUMP下来补区段,记得把CODE段修改为可写,然后重建PE,
   4、最后用区段修正脚本修正一下,在DUMP一次就可以了。
   附件没有更新,附件中的脚本还是有问题的脚本,可以直接复制贴子中的脚本。新脚本采用最新版1.86DEMO加壳测试通过,NN放水没有修改代码,大家可以自己拿附件中的样品自己加壳测试!
   
首先声明:
   菜鸟学习之用,欢迎大牛们拍砖。
   脚本的产生是偶然事件;
   脚本不具有通用性;原因在于生成代码在服务端!就算不在我也搞不定!
   样品采用SL1.85DEMO默认加壳,只有IAT的加密,甚至没有DLL模拟,貌似也只加密IAT!如果有DLL模拟的话还是参看CEKTOP大牛的文章吧,论坛就有的。
   整个过程其实就是写一下我写脚本的过程。
  
   其实,就是想看看SL的DEMO版加壳后的程序,我能否修复IAT,也没有什么内容大家就飘过吧,其实对于IAT加密解密,我是个菜鸟,不折不扣的菜鸟,看着高手们的文章都分析的那么透彻,只有看的福分,因为俺技术太菜了分析不了那么清楚,更不敢瞎说误人子弟, 所以我在这里不贴那么多的代码,不做详细的分析,因为没有那个能力,人又笨还不会做视频,只好写个文章纪念一下吧!
   为什么说是不完全修复呢,因为我也感觉到很奇怪,因为大多数的API已经修复了,但是SL对于FF25 FF15。。。之类的IAT调用都给抽了 换成了CALL的类型 那样 就比原来的调用多了一个字节,而修复好的API中这个字节必须要NOP掉软件才能正常运行的,而我没有   完全修复的就是因为有太多的字节需要NOP而我写的脚本没有能够完全修复!
   在说一下我写好的脚本如果从出问题的API地方开始修复的话 那些个字节是可以NOP掉的,但是如果使用脚本自动修复的话修复后的有很多的字节本应该NOP掉的但是却没有执行,所以软件就出错了!不过脚本已经可以修复大多数的字节了!
   嗯,还是贴点代码吧,对于强大SL,具体怎么到EOP那就看各位的本事,俺比较菜至今不能到达那个神圣的光明之巅,所以自己用DEMO加壳自己脱那样的话OEP就不用找了 哈哈哈!
   开始吧,OD载入程序:    00601F5A >   E8 21000000     CALL 00601F80                         ; 入口复制代码直接在OEP附近下硬件断点吧,不能再OEP头字节哦,因为SL会偷代码的哦!记得使用一下带有DRX protcet 的插件哦还有强大的SOD,再使用个牛X的OD,F9运行,停在OEP附近处:    0040532D 8BEC          MOV EBP,ESP                            ; oep附近就是OEP的第二条代码复制代码看下IAT是被怎么处理的:
  
   FF15类型的:加密后多一个字节
  
   原程序:    00405357   |.   6A 02       PUSH 2复制代码加密后:    00405357 6A 02           PUSH 2复制代码FF25类型的://加密后字节一样
   原型:    004053B9   |.   68 10704000 PUSH 00407010复制代码加密后    004053B9 68 10704000     PUSH 00407010复制代码JMP类型的://加密后多一个字节
  
   原程序:    004054C0 $- FF25 94604000 JMP DWORD PTR DS:[<&MSVCRT._except_handl>;   msvcrt._except_handler3; 结构化的异常处理程序复制代码加密后:    004054C0 E8 66661F00     CALL 005FBB2B   //IAT被抽走了 复制代码MOV reg,api类型:
   mov eax,api ://加密后字节一样
   原型:    0040538A   |.   A1 A4604000 MOV EAX,DWORD PTR DS:[<&MSVCRT._adjust_f>复制代码加密后: 0040538A E8 C2561F00     CALL 005FAA51复制代码mov exx,api ://加密后多一个字节
   原型:    0040129D .   8B3D 18604000 MOV EDI,DWORD PTR DS:[<&KERNEL32.CloseHa>;   kernel32.CloseHandle复制代码加密后:    0040129D E8 04341F00     CALL 005F46A6复制代码查看一下加密后的API调用的开始代码:    005FA634 68 567D5E5A     PUSH 5A5E7D56复制代码所有类型的API加密后调用的代码都是这个,所以我们搜索加密后的API的时候这个就是判断是否是加密过的API的依据。

   分析了加密后的代码,我们要想修复IAT的话我的想法是:我们可以通过跨区段调用CALL 来搜寻整个程序中的所有的CALL 然后判断出是加密api的CALL进行处理!不管程序怎么加密API最终调用的时候都要返回到真实的API上面的,那我们就找他是怎么解密API的以及解密过程中用到了那些代码,并且判断哪些代码可以作为我们写脚本的特征码,那就开始吧。
  
   具体的加密解密过程,我没有能力分析清楚,大牛们都已经分析过了,很WS,而且调用API的过程不是计算的,而是根据API的名字一个一个的自己找的!另外kernel32.GetModuleHandleA这个函数都是自己写的,所有的API都经过这个调用。
  
   根据上面代码我们可以得到判断是否是加密的API的特征码为:68????????9C81442404????????60
  
       具体说下针对上面不同的加密类型所用到的代码吧
   对于FF 和JMP类型的,解密过程中最后解密API是这样的    005FA780 894424 24    MOV DWORD PTR SS:[ESP+24],EAX          ; msvcrt.__set_app_type//这里还有可能是ESP+xx复制代码还有这样的;    005FA780 894424 24    MOV DWORD PTR SS:[ESP+24],EAX          ; msvcrt.__set_app_type//这里还有可能是ESP+xx复制代码总之,运行过程中都用到了    MOV DWORD PTR SS:[ESP+xx],EAX 复制代码这个就是我们寻找解密API过程中的特征码,经过测试,只有这个代码 MOV DWORD PTR SS:[ESP+xx],EAX   下断的话脚本效率较高。所以我们就以这个作为特征码即:8944242?
  
   对于MOV reg,API类型的
   最好找到API的最后代码都是类似这样的;    005F6521 8B1D 1D655F00 MOV EBX,DWORD PTR DS:[5F651D]复制代码只是针对不同的寄存器数值稍微有些变化,由此我们得到的特征码为:8B??????????8D6424FCC3
   对于寄存器为EAX时比较特殊所以单独列出来:    0040538A   |.   A1 A4604000 MOV EAX,DWORD PTR DS:[<&MSVCRT._adjust_f>复制代码所以针对EAX的特征码为:A1????????8D6424FCC3
  
   有了以上的分析我们就可以写脚本了,其他的就是增加一些判断而已。
   有了上面这些还是不能修复IAT的原因就是我一开始就说的那个API被加密后有些多了一个字节,我们需要把那些字节NOP掉,说下我的方法吧:
当API解密过程到达最终找到API的时候我们可以看到 ESP+4 中的值就是我们CALL调用地址的下一行代码,如果有多余的那个字节的话,它会返回到下面一行,我们就可以根据这个来判断CALL下面的是否有字节需要NOP!
而对于FF25类型的加密,最后ESP+4中的值并不是我们CALL调用的地址附近,但是所有的FF25的都需要NOP掉一个字节,这样也有利于我们的判断了。
   基本上对于API的加密我就只懂这些了。
   有了上面这些我们就可以写脚本修复了。
  
   当我们跑完脚本后 用UIF修复一下,然后DUMP 然后IRC修复IAT,修复好后发现不能跨平台,原因就是修复后的IAT和程序中的IAT需要修正一下区段,原理和NN修复VP1.82脚本中的修复时一样的。这样我们修复好后就可以跨平台运行了!
  
   下面我贴出写好的脚本,水平很菜脚本写的很烂,见笑了!
  
   IAT修复脚本: var codebase复制代码区段修正脚本:    var iatbase复制代码上面的脚本是通过NN的脚本修改的,有的是自己写的,在这里向他们表示感谢!有了他们的牛X的脚本,我们菜鸟们才能学习写出一些简单的脚本!
  
  
   最后的说明:上面的脚本我测试了可以修复IAT,并且正常情况下是可以修复那一个字节的,但是,运行脚本过程中我却发现最后修复的代码中有很多的字节没有NOP掉,然后我测试了一下,如果从那个CALL调用开始运行脚本直接修复的话是可以修复那个字节的 但是如果直接从OEP开始跑脚本的话,就会有很多的字节没有NOP掉!这个目前没有研究清楚原因,在此不在多说,也希望大牛们能指点一二,能给出更好的处理一个字节问题的解决方法,因为目前的强壳包括NP 包括vmp 还有VP之类的都有这个情况,想处理那个字节 还是有点麻烦,我自己测试的样品最后没有完全修复就是因为有好多个字节没有NOP掉,最后不得已人肉之,但是太费劲了,自己太菜了,没有那么打的精力搞这个了,所以写这篇文章希望我这个小菜抛砖,能引来大牛们的玉!也希望大家能共享你们更好的修复方法。
   在此先谢过!

http://u.115.com/file/f5f2239e9e#脚本及样品.rar
http://dl.dbank.com/c0cma9vo49
完全修复后的样品没有测试是否可以跨平台哦
电脑速度慢打开WIN7虚拟机需要太多时间了大家测试一下吧
精品软件:百度搜闪电软件园  最新软件百度搜:闪电下载吧
有问题联系 sdbeta@qq.com
离线ahyanglf
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 沙发  发表于: 2010-12-06 16:22:41
脚本不懂的说

支持下
离线zhb_3448

发帖
59686
今日发帖
最后登录
2016-12-13
只看该作者 板凳  发表于: 2010-12-12 15:19:53
那就请教下了

主队让半球高水,一般不能要主队!
凡是开半一的盘,一般不能要下盘!
凡是开一球或一球球半的盘,一般不能要上盘!
凡是开一球半以上的盘,一般不能要下盘!