好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 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查一下壳吧!
PEID显示为HASP HL Protection V1.X -> Aladdin *,
其实这个狗用的不是HASP HL 而是HASP SRM,怎么知道的呢?不用狗的时候运行软件,就会有提示!
因为HASP HL的狗壳,没有狗的时候提示的标题上面不是HASP SRM 而是HASP HL,如果是后者的话可以参看FLY的那篇大作相信大家都知道的,根据那个有狗可以很简单的脱壳的,我曾经 就学习过那个,呵呵 还是很简单的把狗壳脱掉了!
再用DIE看看是什么语言写的吧,
如图是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断点吧,为什么呢?我也不是很清楚,但是大多数的强壳貌似都要用到这个函数,所以我们也可以试试。
下好断点后F9运行,可以看到壳一直在加载系统的DLL
然后不停的按F9让它停在代码段的时候看看
可以看到这个很明显不是OEP的我们继续F9,然后再在code段下内存访问断点,然后不停的F9,突然停在代码段如图
很明显这个就是OEP,而且根据入口这个应该是VC8的入口。
下面看看IAT是怎么加密的吧!
很显然,加密的IAT都放到壳段也就是06811AD8所在的段,在数据窗口想下拉看看,都一样的,被加密的IAT开始都被替换成了06811??? ,下面我们看看壳是怎么查找IAT的吧!我们以006811AD8 为例,CTRL+G 输入006811AD8,可以看到加密后的入口点都是这样的
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的时候
可以看到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上,海涵! |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|