欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

手动脱壳入门第十六篇 MoleBox 2.x 续之Patch IAT加密

程序员文章站 2022-06-28 08:32:04
【脱文动画】http://cnxhacker.net/donghua/crack/200607/245.html 【脱文标题】 手动脱壳入门第十六篇 MoleBox 2.x 续之Patch IAT加密 【脱文作者】 weiyi75[Dfcg] 【作者... 08-10-08...

【脱文动画】http://cnxhacker.net/donghua/crack/200607/245.html
【脱文标题】 手动脱壳入门第十六篇 molebox 2.x 续之patch iat加密
【脱文作者】 weiyi75[dfcg]
【作者邮箱】 weiyi75@sohu.com
【作者主页】 dfcg官方大本营
【使用工具】 peid,ollydbg,importrec1.6f,loadpe
【脱壳平台】 win2k/xp
【软件名称】 imcaster icq e-marketer
【软件简介】 imcaster icq e-marketer是一个强大的icq即时信息查找工具。你可以根据不同的条件(如:性别、年龄、国家或者职业等等)搜索在线icq用户,向他们发送信息以提高你网站或企业的知名度。
【软件大小】 2.61m
【下载地址】 http://www.imcaster.com/downloads/imcastsetupent.exe 或 二哥推荐的教学篇里面下载
【加壳方式】 molebox 2.x.x -> mole studio [overlay]
【保护方式】 molebox压缩壳
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳内容】
首先peid查壳,为molebox 2.x.x -> mole studio [overlay],od载入运行,无任何异常,判断其为压缩壳。
前面二哥的修复方法大家都看到了,继然iat可以加密就可以iat解密,实际是跳过。
一口气写od脱壳脚本写到16篇后发现这篇iat被加密了,只写个找oep的脚本没意思,要写脚本首先得会脱这个壳。
脱壳后发现程序不能运行,这时需要用imprec修复引入函数表(import table)
在oep处填8636f,点it自动搜索,然后点获输入信息,有9个指针没有修复。
iat的起始地址是89000,大小b80
根据imprec提示89110 处的指针被加密
就从这里入手,也可以随便找个加密指针处入手。
od载入程序,命令行
hw 489110
因为这个地址先前写入的地址是对的,然后程序将这个地址加密为imprec不认识的东西,我们就要跟踪这个过程。
f9运行
004d1237 8b45 f8 mov eax,dword ptr ss:[ebp-8] ; imcast.00489110
004d123a 40 inc eax
004d123b 40 inc eax
004d123c 8945 f8 mov dword ptr ss:[ebp-8],eax
004d123f 0fb745 e2 movzx eax,word ptr ss:[ebp-1e]
004d1243 c1f8 08 sar eax,8
004d1246 0fb74d e2 movzx ecx,word ptr ss:[ebp-1e]
堆栈友好提示
0012fcd8 7ffdf000
0012fcdc 47d047d0
0012fce0 47334733
0012fce4 5ebc5ebc
0012fce8 72bf72bf
继续3次f9,注意堆栈友好提示
004d13ce ff15 24804d00 call dword ptr ds:[; kernel32.getprocaddress
004d13d4 8b4d f0 mov ecx,dword ptr ss:[ebp-10]
004d13d7 8901 mov dword ptr ds:[ecx],eax
004d13d9 eb 26 jmp short imcast.004d1401
004d13db 8b55 f0 mov edx,dword ptr ss:[ebp-10]
004d13de 8b02 mov eax,dword ptr ds:[edx]
004d13e0 25 ffff0000 and eax,0ffff
004d13e5 50 push eax
004d13e6 8b4d f4 mov ecx,dword ptr ss:[ebp-c]
004d13e9 51 push ecx
004d13ea ff15 24804d00 call dword ptr ds:[; kernel32.getprocaddress
堆栈友好提示
0012fe2c 77e7ed4c kernel32.setfilepointer //这个和eax中是一样的,都是正确指针
0012fe30 6bc4b4ac mfc42.#1576
0012fe34 0049428a imcast.0049428a
0012fe38 004943fe ascii "kernel32.dll"
0012fe3c 00489110 imcast.00489110
0012fe40 77e60000 kernel32.77e60000
0012fe44 00493294 imcast.00493294
现在我们
dd 489110 往上看到489100被加密了,呵呵,我说过可以随便找个加密指针处入手。
004d13d9 /eb 26 jmp short imcast.004d1401
004d1401 8b4d ec mov ecx,dword ptr ss:[ebp-14] ; imcast.004943fe
004d1404 51 push ecx
004d1405 8b55 f0 mov edx,dword ptr ss:[ebp-10]
004d1408 52 push edx
004d1409 e8 12050000 call imcast.004d1920 //如果单步过了这里,就over了。显然它是个加密call,nop掉程序正常运行,进去看看。
******************************************
004d1920 55 push ebp
004d1921 8bec mov ebp,esp
004d1923 83ec 10 sub esp,10
004d1926 c745 fc 00000000 mov dword ptr ss:[ebp-4],0
004d192d 833d 30f04d00 00 cmp dword ptr ds:[4df030],0
004d1934 75 0a jnz short imcast.004d1940
004d1940 8b45 08 mov eax,dword ptr ss:[ebp 8] //注意这时eax=77e7ed4c是正确指针
004d1943 8b08 mov ecx,dword ptr ds:[eax]
004d1945 51 push ecx
004d1946 8b0d 30f04d00 mov ecx,dword ptr ds:[4df030]
004d194c e8 ab380000 call imcast.004d51fc
004d1951 8945 f8 mov dword ptr ss:[ebp-8],eax
004d1954 837d f8 00 cmp dword ptr ss:[ebp-8],0
004d1958 74 45 je short imcast.004d199f
004d195a 8d55 f0 lea edx,dword ptr ss:[ebp-10]
004d195d 52 push edx
004d195e 6a 04 push 4
004d1960 6a 04 push 4
004d1962 8b45 08 mov eax,dword ptr ss:[ebp 8]
004d1965 50 push eax
004d1966 ff15 70804d00 call dword ptr ds:[; kernel32.virtualprotect
004d196c 85c0 test eax,eax
004d196e 75 0a jnz short imcast.004d197a
004d197a 8b4d 08 mov ecx,dword ptr ss:[ebp 8]
004d197d 8b55 f8 mov edx,dword ptr ss:[ebp-8]
004d1980 8b02 mov eax,dword ptr ds:[edx]
004d1982 8901 mov dword ptr ds:[ecx],eax //可恶这里; imcast.004d490e
eax=004d490e dword ptr ds:[ecx] 是推算被加密的地址00489110,实际也是,看od信息框就知道了。我们必需让eax是正确的指针。我们看到004d1940 处eax被赋值,而且当时的eax是正确指针。
这就容易了
004d1940 8b45 08 mov eax,dword ptr ss:[ebp 8]
修改为
004d1940 8bc0 mov eax,eax ; kernel32.setfilepointer
004d1942 90 nop
自给自足
004d1984 8d4d f4 lea ecx,dword ptr ss:[ebp-c]
004d1987 51 push ecx
004d1988 8b55 f0 mov edx,dword ptr ss:[ebp-10]
004d198b 52 push edx
004d198c 6a 04 push 4
004d198e 8b45 08 &n