吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 26941|回复: 12
收起左侧

[原创] 带狗脱HASP SRM

  [复制链接]
wuqing1501 发表于 2010-6-18 12:42
本帖最后由 wuqing1501 于 2010-6-18 12:43 编辑

【文章标题】: 带狗脱HASP SRM
【文章作者】: wuqing1501(笨笨鼠)
【作者邮箱】: 无
【作者主页】: 无
【作者QQ号】: 无
【软件名称】: 还是不透露名称了商业软件自己遇到了就试试吧
【软件大小】: 3.84M
【下载地址】: 自己搜索下载
【加壳方式】: 加密狗壳
【保护方式】: 加密狗壳
【编写语言】: VC8 -> Microsoft Corporation *
【使用工具】: 老三样(OD,LP,IR)
【操作平台】: 盗版XP3
【软件介绍】: 不介绍了,用过的人都知道的,没有用过的说了也没用
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      很菜的文章,菜鸟们看看,牛们就飘过吧!
      因为工作的和行业的原因,我们用的一些软件一般都是加了加密狗的,最近,公司又买了一些盗版狗也算是二次加密的吧,每次使用都要用盗版狗,很不爽,就想把狗去掉,但是这次 的二次加密的方式是打狗的人自己写了一个模拟器而且模拟器是加了VMP的,想脱VMP好难,更别说被VM的代码怎么都看不懂,想想既然有狗软件可以运行那就试试把狗壳脱掉吧!也因此才  有了这篇文章!
      首先还得感谢一下orchid88,没有他的那篇破文《带狗脱HaspSRM狗壳及iat修复》,估计我也是搞不定的,因为我不知道狗壳模拟了软件的几个IAT,需要自己去猜真实的IAT。
      开始吧
      还是用PEID查一下壳吧!

       图片1PEID查壳.jpg

      PEID显示为HASP HL Protection V1.X -> Aladdin *,
      其实这个狗用的不是HASP HL 而是HASP SRM,怎么知道的呢?不用狗的时候运行软件,就会有提示!

      图片2无狗提示.jpg

      因为HASP HL的狗壳,没有狗的时候提示的标题上面不是HASP SRM 而是HASP HL,如果是后者的话可以参看FLY的那篇大作相信大家都知道的,根据那个有狗可以很简单的脱壳的,我曾经 就学习过那个,呵呵 还是很简单的把狗壳脱掉了!
      再用DIE看看是什么语言写的吧,

      图片3DIE语言.jpg

     如图是C的。知道是什么语言写的,找OEP可能有用(对于高手可以找语言特征码),对我来说就没有用了,因为我不知道特征码,但是我们可以用其他的
  方法试试。
      然后OD载入吧!

  00711280 >  55              push    ebp                              ; OD载入后停在这里!
  00711281    8BEC            mov     ebp, esp
  00711283    53              push    ebx
  00711284    56              push    esi
  00711285    57              push    edi
  00711286    60              pushad
  00711287    8BC4            mov     eax, esp
  00711289    A3 F41E7100     mov     dword ptr [0x711EF4], eax
  0071128E    B8 18157100     mov     eax, 00711518
  00711293    2B05 3C157100   sub     eax, dword ptr [0x71153C]        ; Bxxxxx.00711518
  00711299    A3 3C157100     mov     dword ptr [0x71153C], eax
  0071129E    833D F01E7100 0>cmp     dword ptr [0x711EF0], 0x0
  007112A5    74 15           je      short 007112BC

      首先我们要找软件的OEP 了,但是怎么找呢?orchid88的方法是直接找特征码!但是 我不会找特征码怎么办?既然没有办法那就试试吧首先在00401000  code 段下个内存访问断点吧,  因为一般情况下用这个断点还是容易到OEP的!然后我们在CTRL+G 输入 GetModuleHandleA 在这个函数上下个断点F2断点吧,为什么呢?我也不是很清楚,但是大多数的强壳貌似都要用到这个函数,所以我们也可以试试。

      GetModuleHandleA断点.jpg

     下好断点后F9运行,可以看到壳一直在加载系统的DLL

      寄存器.jpg

     然后不停的按F9让它停在代码段的时候看看

      代码段1.jpg

     可以看到这个很明显不是OEP的我们继续F9,然后再在code段下内存访问断点,然后不停的F9,突然停在代码段如图

      OEP.jpg

     很明显这个就是OEP,而且根据入口这个应该是VC8的入口。
     下面看看IAT是怎么加密的吧!

      IAT加密.jpg

     很显然,加密的IAT都放到壳段也就是06811AD8所在的段,在数据窗口想下拉看看,都一样的,被加密的IAT开始都被替换成了06811??? ,下面我们看看壳是怎么查找IAT的吧!我们以006811AD8 为例,CTRL+G 输入006811AD8,可以看到加密后的入口点都是这样的

      006811ad8.jpg

     06811AD8    E8 F96B0DFA     call    BridgeWi.008E86D6  //在这里点 NEW origin here
     06811ADD    0000            add     byte ptr [eax], al
     被加密的IAT入口都是E8????????00 这样的形式的,这也方便我们写脚本处理了!然后我们还是F7进入吧看看IAT怎么解密,其实关键是找到在什么地方能看到真实的APT,一直按F7或者F8尽量用F7,遇到一些CALL的时候要注意有时候有F8会跑飞的,当我们走到这个RETN的时候

      retn.jpg

     可以看到esp中就是真正的API地址,我们在这个RETN上下个F2断点,然后再找个加密的IAT试试,同样CTRL+G输入加密的地址,点 NEW origin here,然后F9运行,发现两次F9后就看到ESP中  我们最想 见到的API真实地址了,好了分析到这里,我们就可以也段代码修复IAT或者写脚本修复了,我直接写了个脚本可能只适用于我用的这个软件,会贴在下面的!orchid88的方法是写了 段代码,但是写代码一旦一次修复不成功后面每次都要写很麻烦,所以我还是选择了脚本,以后遇到了类似的情况,我们修改一下就可以用!呵呵!
     好了CTRL+F2重新开始吧,还是用上面的方法先到达OEP,然后直接跑脚本吧,很快脚本跑完了,我们看看修复好的IAT吧
  004D4000  07658590  ACADLL.CBlocksBase::~CBlocksBase
  004D4004  07658570  ACADLL.CBlocksBase::CBlocksBase
  004D4008  00000000
  004D400C  77DA7ABB  ADVAPI32.RegQueryValueExA
  004D4010  77DA7852  ADVAPI32.RegOpenKeyExA
  004D4014  77DA6C27  ADVAPI32.RegCloseKey
  。。。。。。
  004D4034  00000000
  004D4038  77EFECCE  GDI32.CreateFontIndirectA
  004D403C  77EFB74C  GDI32.GetPixel
  004D4040  77EF6F79  GDI32.BitBlt
  。。。。。
  004D4078  7C814B92  kernel32.GetEnvironmentVariableA
  004D407C  7C80982E  kernel32.InterlockedExchange
  004D4080  068115B8
  004D4084  7C86250D  kernel32.WinExec
  004D4088  7C8097D0  kernel32.GetCurrentThreadId
  004D408C  7C8115DC  kernel32.GetFileAttributesA
  004D4090  7C831EDD  kernel32.DeleteFileA
  004D4094  7C835D84  kernel32.WritePrivateProfileStringA
  004D4098  7C836464  kernel32.GetPrivateProfileIntA
  004D409C  7C801D7B  kernel32.LoadLibraryA
  004D40A0  068115F8
  004D40A4  7C92FE21  ntdll.RtlGetLastWin32Error
  004D40A8  7C92FE30  ntdll.RtlSetLastWin32Error
  
     很明显大多数的IAT都已经被修复好了,但是我们也看到有几个IAT没有修复比如004D4080  068115B8,004D40A0  068115F8,最后看下一共有几个这样的被特殊处理的IAT总结一下吧

  004D4080  068115B8
  004D40A0  068115F8
  004D40FC  068116B0
  004D4104  068116C0
  004D4118  068116E8

  一共有这5个被特殊处理了,根据orchid88的总结
  “(三)iat总结:
  通过对几个HaspSRM加密的dll的分析,得出规律,mfc7.1经常被srm壳替换的函数为:

  GetCommandLineA
  GetStartupInfoA
  GetCurrentProcess
  GetProcAddress
  GetProcAddressID
  GetVersion
  Vc 6.0经常被srm壳替换的四个函数为
  GetCommandLineA
  GetStartupInfoA
  GetCurrentProcess
  GetProcAddress
  ”
  我们可以先从这些函数里试试 看看到底被特殊处理的都是哪个函数,另外还有一种方法就是,既然我们知道了这个软件是VC8写的那么我们可以找到类似的VC8编写的软件调试一下看看有没有 什么线索,毕竟我是菜鸟,直接跟踪完加密也看不出是什么函数,于是我用OD加载了QQ主程序,根据跟踪对比很容易就发现了几个IAT,然后对于其他的IAT怎么办呢?我们可以对加密的函数 下内存访问断点和硬件访问断点,让程序运行过这个函数看看EAX返回值时什么,同时最好也跟着加密的流程走一遍,这样也能明白壳时怎么处理的,同时也要根据前人的经验比如orchid88说的  “ctrl+*将eip设为10008720,f8运行通过,看到eax的值变为0x0cd0,就是当前进程的编号,因此这个函数为GetCurrentProcessId。”,根据前人的经验,再加上自己调试,根据返回值我们就 可以确定被处理的几个IAT的真实身份如下:
  
  068115B8确定
  7C81127A=kernel32.GetVersion
  068115F8
  004D40A0  7C80AE40  kernel32.GetProcAddress   确定
  068116B0
  7C801EF2 (kernel32.GetStartupInfoA)  确定
  068116C0
  004D4080  7C80DE95  kernel32.GetCurrentProcess         确定
  068116E8
  7C8099C0  GetCurrentProcessId 确定
  
     当然找到这些函数后,最好把这些函数替换到加密后的程序里运行一下,看看和没有解密的运行的结果是否一致,确保找到的是真正的函数地址,在这个上面因为对IAT了解太少我走了很多的 弯路,最终还是把这些函数都找对了!
     有了这些函数我们重新来过吧,重新运行到OEP,然后运行脚本,等脚本修复完后我们把找到的这几个特殊处理的函数补上去,然后请出LordPE 和ImpREC,DUMP 修复就OK了!
     最后再PEID一下吧:VC8 -> Microsoft Corporation *
     如果想优化一下的话直接用CFF explorer去掉壳段就可以了!
     最后我们把修复的软件修改为软件的名字运行一下,OK,程序正常运行!说明我们脱壳成功了!可以免狗运行了!但是由于没有狗内的收据,软件计算结果不正确的 不过这个就不属于脱壳的 范畴了,而是破解了,对于加密狗内的数据怎么处理,由于本人很菜目前还没有搞定,因为软件是二次加密的 数据都被VM了 看不懂那些代码!如果是正版狗的话,也就不用这么麻烦了直接用 模拟器就可以很简单的搞定了!
     好了,软件脱壳到此就结束了!给一下我写的脚本吧!呵呵 这是我第二次写脚本什么都不懂都是拿高手的脚本修改后用的,菜鸟可以看看,牛们就飘过吧!有些地方为什么这么写脚本也是有原因 的,自己调试一下就知道了,用判断是否在壳段的方法不是很好,因为程序有的代码也跑到壳段的时候就很容易出错的!不过脚本多简单只要能修复就OK!
  
  
  //手动到达OEP然后运行脚本,大多数修复后,自己分析没有修复的IAT
  var iats
  var iate
  var ip3
  var oep
  var temesp
  var vmaddr
  
  mov oep, 0045A7F0  //这里就是OEP
  bp 008E86BD        //这里就是修复IAT时的关键retn,在这个地方 ESP中的就是真正的IAT
  
  fixiat:
  mov iats, 004D4000 //iat 其实地址
  mov iate, 004D4E50 //iat结束地址
  mov temesp,esp
  fix:
  cmp [iats],6820000  //这里的值时为了判断是否是加密的IAT,因为我这里的程序都是0681开始的,所以我用06820000,自己根据具体程序修改即可。
  jg skipfix
  mov temesp,esp
  mov eip, [iats]
  mov vmaddr,eip
  
  
  mov ip3, eip
  mov ip3, [ip3]
  and ip3, 0ff
  cmp ip3, E8   //这里判断开始是不是CALL
  jne skipfix
  add vmaddr,6
  mov ip3, [vmaddr]
  and ip3, 0ff
  cmp ip3, 00     //这里判断这里是不是00  即 是不是E8??????00
  jne skipfix
  sti
  cmp eip,00711000  //这里是壳段基址
  jb skipfix
  run       //
  run       //这里有两个RUN,是因为在RETN 返回的时候 需要F9两次才能在ESP中看到正确的IAT,具体是多少个run 或者sti等 可以根据程序判断一下,然后修改这里。
  
  cmp [esp],07000000 //这里是判断是不是真实的IAT地址因为一般情况下IAT地址大于07000000,但是要注意是否有特殊的非真实IAT的地址也大于07000000这样的要自己判断一下,看看修复好的IAT是否正常。
  jb skipfix
  mov [iats],[esp]
  mov esp,temesp
  jmp skipfix
  
  skipfix:
  add iats,4
  cmp iats,iate
  mov esp,temesp
  je end
  cmp [iats], 0
  mov esp,temesp
  je skipfix
  jmp fix
  
  end:
  mov eip, oep
  AN eip
  ret
  
--------------------------------------------------------------------------------
【经验总结】
  1、还是那句话,看别人的破文总是很简单,说的很轻松,真正自己做的时候发现好难,对于这次脱壳,尤其是处理那几个特殊的函数,由于对API了解很少,猜那几个函数费了我一天的时  间!还好最后经过努力还是搞定了!毕竟每个程序都是不一样的,处理的API也不一定都一样,遇到新的问题的时候要善于学习前人的东西,思考自己的处理方式!
  2、看别人的脱壳破解视频或者破文100遍,不如自己动手调试一遍!只有自己动手调试了才知道为什么高手都是那么做的!至少像这个软件找OEP按照高手的方法找特征码我就搞不定了!但 是用这个方法还是搞定了,所以CODE段下内存访问还有 GetModuleHandleA 断点还是要牢记的!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于wuqing1501(笨笨鼠), 菜鸟一个没有版权,欢迎转载,但请保持文章的完整, 谢谢!
                                                       2010年06月18日 0:53:06
首发UPK,昨晚发完太晚了就没有来及发到52上,海涵!

免费评分

参与人数 2威望 +1 热心值 +1 收起 理由
KC@萧何 + 1 感谢您的分析,[吾爱破解]有你更精彩!
小生我怕怕 + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zxcqq8520 发表于 2010-6-18 13:05
顶上,膜拜下,没打过狗,也不会打。
Hmily 发表于 2010-6-18 15:21
哥来自落伍 发表于 2010-6-18 15:30
596442958 发表于 2010-6-18 17:41
膜拜 ing`````````````
小生我怕怕 发表于 2010-6-19 07:52
来晚啦,学习下
hixiaosheng 发表于 2010-6-19 15:33
路过、来晚了··
jwtlxx 发表于 2010-6-28 10:08
来晚啦,学习下
newyzy 发表于 2012-2-13 18:02
谢谢。学习学习
击水八千里 发表于 2013-4-28 18:27
是啊,操作下可能懂了,看了下,似懂非懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 10:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表