wubi-shell-crack

原文地址:

http://bbs.pediy.com/showthread.php?t=155381

1、 分析环境
硬件:CPU: Pentium(R) Dual-Core CPU  E5300@2.60GHZ  ,内存: 2G
    操作系统:  Microsoft Windows XP Professional 2002  Service Pack 3
    分析的软件:威步CodeMeter保护的WupiCalculator.exe。
    分析工具:
OllyICE v1.10[汉化第二版],LordPE(LordPE Deluxe by youda),
Import REConstructor v1.7c,ResHacker V3.5,UltraEdit v 9.0.1.0,
CFFExplorer v7.2.0.1
2、 待分析程序
分析程序WupiCalculator.exe,程序的默认安装路径为
“C:\Documents and Settings\All Users\Documents\WIBU-SYSTEMS\Software Protection\C++\WupiCalculatorIndex\Protected\CodeMeter\WupiCalculator.exe”,该程序通过AxProtector和Ixprotector来进行保护。
AxProtector版本为8.0。
加密时采用的工程文件的默认安装路径为:C:\Documents and Settings\All Users\Documents\WIBU-SYSTEMS\Software Protection\C++\WupiCalculatorIndex\WupiCalculator-CodeMeter.WibuAxProject,该工程文件的主要的保护选项设置如图1,图2,图3,图4所示:
https://i-blog.csdnimg.cn/blog_migrate/0cf1ce3dd4e0bac05dffe86ae6a2214e.jpeg
图 1
https://i-blog.csdnimg.cn/blog_migrate/28c09dbdf1e5ad1902800bd103df909b.jpeg
图 2

https://i-blog.csdnimg.cn/blog_migrate/b750eb0d05c74077226b2135944098fc.jpeg
图 3

https://i-blog.csdnimg.cn/blog_migrate/4d72fa45a2d358d2dceca04e0d65e7fc.jpeg
图 4





3、 分析过程
1. 保护前后程序的区段结构对比
原始程序的区段如图5所示。
https://i-blog.csdnimg.cn/blog_migrate/a21fa82d5ff161af4a57e0e8f1a0bdcd.jpeg
图 5
被保护后程序的区段如图6所示。
https://i-blog.csdnimg.cn/blog_migrate/2c38421236343651a2c94ed097e1da33.jpeg
图 6
2. 寻找OEP

程序用OD载入后报错,换了几个版本的OD均报错,报错的情况如图7所示。

https://i-blog.csdnimg.cn/blog_migrate/6fdef6288806e9aa027f2e2121183078.jpeg

图 7

     用LordPE查看PE结构,没有发现异常。
     用CFFExplorer查看PE文件结构,发现数据目录不能正常显示,原来被保护后的PE文件中的IMAGE_OPTIONAL_HEADER中的NumberofRvaAndSizes字段,修改为2200C4E7,如图8所示,该字段表示数据目录的项数,这个字段从WindowsNT发布以来一直是16,用CFFExplorer把这个字段修改为0x10,如图9所示。然后进行保存。
此时保存后的文件可以用OD打开。

https://i-blog.csdnimg.cn/blog_migrate/ba32d4358a1f80097c885dfb1c3ab28a.jpeg

图 8

https://i-blog.csdnimg.cn/blog_migrate/12dbf045fc1eb52ff3d10f3911bf3fb5.jpeg
图 9

直接运行修改后的程序报错,如图10所示,应该是有自校验功能。
https://i-blog.csdnimg.cn/blog_migrate/d3a179abdbaee3303f1f95a2e6f53cbe.jpeg
图 10

    用OD打开程序后,用HideOD插件将该插件提供的所有选项选中,然后重新启动程序,采用单步跟踪的方法,,在005186A3处的代码修改为jmp,如图11所示。

https://i-blog.csdnimg.cn/blog_migrate/83dad9f53d4197aa07da100d35741ed1.jpeg
图 11

    继续跟踪来到0051873A处,将代码修改为jmp,如图12所示。

图 12

    直接运行,如图13所示。

https://i-blog.csdnimg.cn/blog_migrate/073f7fc0bd364d3efcc3bc4c02b0d5cc.jpeg

图 13

    单击确定后继续运行出错,如图14所示。


https://i-blog.csdnimg.cn/blog_migrate/47f977b7b6febd7cf268324bda865590.jpeg

图 14



    重新载入,单步跟踪来到005139DC处,修改为jmp。


图 15

    后台检测功能会开新线程,为了避免在CreatehThread处下段点会被检测到,因此在call CreateRemoteThread处下断点,如图16所示。

https://i-blog.csdnimg.cn/blog_migrate/8fceccb4cd0d4cbe8afdafea9d3b7044.jpeg
图 16


    继续运行中断后,堆栈数据如图17所示。


https://i-blog.csdnimg.cn/blog_migrate/28efd2b51ed22105ab98ddabcbe46d06.jpeg
图 17


    来到地址00514DC0处,005CCCBC地址存放校验值,将005CCCBC地址处的值修改为800000,如图18所示,这样可以跳过校验。

https://i-blog.csdnimg.cn/blog_migrate/89ea5e701cced558f57b77002b21d96d.jpeg
图 18
    在OD中利用"Alt+M"打开内存映射,在区段__wibu00处下断点,如图19所示,下段后的结果如图20所示。
https://i-blog.csdnimg.cn/blog_migrate/89ea5e701cced558f57b77002b21d96d.jpeg

图 19
https://i-blog.csdnimg.cn/blog_migrate/ea9aab814e823c139394e818c971dea2.jpeg
图 20

    直接运行来到OEP处,如图21所示。
https://i-blog.csdnimg.cn/blog_migrate/103c658fffbe47b7d45755ffac4ee773.jpeg

图 21

    用lordpe完整转存,如图22所示,名称为dump.exe

https://i-blog.csdnimg.cn/blog_migrate/4f41fbbb70ff5d850250c41550e4a8ca.jpeg
图 22


3. 修复IAT
    用Import Rec附加到WupiCalculator.exe进程,OEP处填入0002096B,依次单击AutoSearch和GetImports按钮,获取到的IAT如图23所示,从图中可以看出部分IAT被加密了。




https://i-blog.csdnimg.cn/blog_migrate/db1b87600d15fd8785349bc0a375d94f.jpeg
图 23

    重新载入程序,在地址0043B000处下硬件访问断点,如图24所示。

https://i-blog.csdnimg.cn/blog_migrate/5f847f590e32837d53e865fb74f5f1c1.jpeg
图 24

    在硬件断点第二次中断后,数据窗口的数据如图25所示。
https://i-blog.csdnimg.cn/blog_migrate/ad8c2f1c71978a91bab98a291ee8008d.jpeg
图 25

    此时的EIP为0052A575,此地址的函数开头地址为00529FB0。
    重新载入程序,在00529Fb0处下断点,分析IAT的处理过程。经过多次调试后,找到处理IAT加密的地方。
    将0052A525处修改为jmp,禁止该处断点后,继续运行,如图26所示。


    在地址0052A8BB处会将空的数据修改为005160B0,将0052A8B9处修改为jmp,如图27所示,此时已经避开IAT加密。

https://i-blog.csdnimg.cn/blog_migrate/b08cb577d37b3107f679101d635b39f8.jpeg
图 26
https://i-blog.csdnimg.cn/blog_migrate/7eb07b31aac52ed10798bf33e0deff22.jpeg

图 27


    在函数的末尾0052A905处下断点,如图28所示。运行到此处时,还原图26和27处的magic jmp的修改,并去掉0052A905的断点。
    注:修复输入表完毕后需要恢复修复IAT部分的代码中的断点,否则会被后面的自校验检测到。


图 28

    继续在内存镜像的第一个区段处下断点,来到OEP处,用Import  Rec获取输入表,如图29所示。单击Fix Dump按钮来修复脱壳后的数据。

https://i-blog.csdnimg.cn/blog_migrate/4cf224f7b60cc728c4c419359086bd0d.jpeg
图 29




4. 修复代码替换

运行修复输入表后的程序会出错,如图30所示。

https://i-blog.csdnimg.cn/blog_migrate/be6450b442454c5815d6881eca19ad4a.jpeg
图 30

运行出错地址。
00509E95   .  8B46 4C       mov     eax, dword ptr [esi+4C]

    通过跟踪加壳后的程序和脱壳后的程序,出错的地方为0040101078,如图31所示。
通过反复跟踪加壳后的程序,壳代码中自己实现了GetProcAddress函数,此处为对InitCommonCtrolsEx的调用,分析其他调用输入表函数的地方,没有进行替换,只替换了此处。可以将00401077和00401078处的汇编语句先用NOP填充,然后修改为
call    dword ptr [43B028],
修改后用OD保存修改,文件名称为dumped_fixcode.exe。
https://i-blog.csdnimg.cn/blog_migrate/e8e8581199c253a3de2174f9d24fd6b3.jpeg

图 31


图 32






5. 修复加密的资源
    运行程序继续出错。
    通过单步跟踪的方法来对比加壳后的程序和脱壳后的程序,来到地址00407768处,如图33所示。
    加壳后程序对话框资源0x66的的内存地址为00C0A6F0,如图34所示,脱壳后的程序的对话框资源地址为004DC620,如图35所示,该地址处的数据为加密后的资源数据。



图 33

https://i-blog.csdnimg.cn/blog_migrate/6a4badf51c270a82b8a00069c7a01e63.jpeg

图 34

https://i-blog.csdnimg.cn/blog_migrate/9b7dcce1b39ea26f612ff045574b711f.jpeg
图 35

    用LordPE查看加壳后程序的对话框102资源大小为0x66E,如图36所示。
https://i-blog.csdnimg.cn/blog_migrate/b8a728b7405ba20240fad6ca95a3226d.jpeg
图 36

用解密后的数据替换加密后的数据。
用LordPe部分转存加壳后程序内存中的102对话框的资源数据,如图37所示。将转存的数据保存为102dlg.dmp


https://i-blog.csdnimg.cn/blog_migrate/218e1934fa55b73a7df1b2ce1208cf49.jpeg
图 37

脱壳后程序的对话框资源102的文件偏移为0x00DC620,大小为0x66E,如图38所示。

https://i-blog.csdnimg.cn/blog_migrate/c2f2dfffc974883588cc02f9124563dc.jpeg
图 38

    用UltraEdit打开102dlg.dmp和脱壳后的程序,用102dlg.dmp中的数据替换掉脱壳后的程序从偏移0x00DC620到偏移0x000DCC8D处的数据,将脱壳后的程序保存为dumped_fixcode_fixres.exe。

    此时可以用ResHacker打开修复好资源对话框102资源的程序,可以正确查看对话框资源,如图39所示。
https://i-blog.csdnimg.cn/blog_migrate/8c620be1b4e2a2c4cf50188e45013258.jpeg
图 39



附注:bp  FindResourceW [esp + C]==05寻找对话框的Handle,LoadResource后就会返回对话框资源在内存中的位置。其他的资源可以利用上面的方法进行修复。


6. 处理浮点数错误
    运行修复资源后的程序,报浮点数错误,如图40所示。

    R6002错误原因:程序启动阶段___tmainCRTStartup函数中调用了__cinit函数,在这个函数的第一个判断是校验浮点运算初始化函数指针所处的section是否为可写,如果可写的话就跳过浮点运算初始化函数。该函数指针一般位于.rdata段。脱壳后程序的区段如图41所示,此处段名称修改为__wibu01。修改__wibu01区段的标志,将可写属性去掉,如图42所示,保存可执行文件。



图 40
https://i-blog.csdnimg.cn/blog_migrate/574dfa6382542cbb12774d20caf53234.jpeg
图 41

https://i-blog.csdnimg.cn/blog_migrate/21a31ae95c28b47e19effb59abc0d207.jpeg

图 42
    运行可执行文件继续报错,如图43所示。此时可以用upx壳压缩一下,这里利用CFFExplorer自带的upx工具,如图44所示,文件保存为dumped_fixcode_fixres_upx.exe。由UPX临时将__wibu01区段改为可写,压缩后的程序可以正常运行,如图45所示。但是单击On按钮后程序会直接退出。

https://i-blog.csdnimg.cn/blog_migrate/e76c848d954593865a84a5bf2671b05d.jpeg
图 43

https://i-blog.csdnimg.cn/blog_migrate/e7c05c341d6d33d47bee7ede115a97ea.jpeg
图 44


https://i-blog.csdnimg.cn/blog_migrate/1bc4d8535dff95ec93c9cc954397e13b.jpeg
图 45

7. 处理按钮的代码
    下面继续用OD调试用UPX加壳后的程序。
    载入dumped_fixcode_fixres_upx.exe,停在EP处,单步跟踪来到00616591,如图46所示。
在OD的命令行插件处下hr esp断点,如图47所示。单击运行程序会中断在006166F3处,此时取消硬件断点,在00616700处下断点,执行完该语句会停在OEP处,如图48所示。

https://i-blog.csdnimg.cn/blog_migrate/46f17fb3beebe9d8daec65d2f815125a.jpeg
图 46

https://i-blog.csdnimg.cn/blog_migrate/850b8b78743facb1630053553c42e98a.jpeg
图 47

https://i-blog.csdnimg.cn/blog_migrate/f508cd8e78cc186d1d333be27d16e0c8.jpeg

图 48


    查找On按钮的处理事件的方法;采用查找特征码的方法,在OD中快捷键"Ctrl+S"调出查找命令序列,在其中输入"call            dword ptr [ebp+14]",如图49所示。

https://i-blog.csdnimg.cn/blog_migrate/ba4bd8d1fd22cc6ecc49ac06f5208cb3.jpeg
图 49

    在所有查找到的地方采用F2快捷键下断点。如图50所示(部分截图)。
https://i-blog.csdnimg.cn/blog_migrate/6e53de7778a5255ef9f93a26a98ce730.jpeg

图 50


    单击On按钮后,程序中断在00407AEB处,在此处跟进,即为On按钮的代码。可以同时单步跟踪加壳后的程序和此处的程序,找到处理license等和加密锁相关的函数。

    将dumped_fixcode_fixres.exe程序中的__wibu01区段的可写属性加上,然后用OD载入,并修改On按钮处钮处理license相关的调用全部修改为Nop,并且修改相关的跳转。下面图中为一系列的修改,这个可以根据调试加壳后程序的运行情况来修改。

https://i-blog.csdnimg.cn/blog_migrate/e1705ad9ac8bf69e60e6ea8bad7774e4.jpeg

图 51

https://i-blog.csdnimg.cn/blog_migrate/d31604b63ed6bdb71d0dc1aaff3900c8.jpeg

图 52


https://i-blog.csdnimg.cn/blog_migrate/4be1102e0f70da3896f9084d9c3608e8.jpeg

图 53
https://i-blog.csdnimg.cn/blog_migrate/69cdc66e147bc3f1b62b26ce452e3a40.jpeg
图 54
https://i-blog.csdnimg.cn/blog_migrate/805ae9222043dba9d291ca4d9edb54e1.jpeg
图 55

https://i-blog.csdnimg.cn/blog_migrate/8f2645c5cfadd2d48dee2a6653d473b5.jpeg
图 56
https://i-blog.csdnimg.cn/blog_migrate/7d6dc43fce9b6867c41165099245d380.jpeg

图 57
https://i-blog.csdnimg.cn/blog_migrate/7d6dc43fce9b6867c41165099245d380.jpeg
图 58
https://i-blog.csdnimg.cn/blog_migrate/7d1a1f96be170d7c1375ea0d58a3aeee.jpeg
图 59

https://i-blog.csdnimg.cn/blog_migrate/986ec81a95f2c23e3df9ffe81da12778.jpeg
图 60
https://i-blog.csdnimg.cn/blog_migrate/da375f707ea00a4b66d3736bb1648255.jpeg
图 61


图 62


    保存后dumped_fixcode_fixres_on.exe,修改__wibu01的节属性后采用upx加壳,运行效果如图63所示。

https://i-blog.csdnimg.cn/blog_migrate/e56b7109148739f1ce44a2b50d947f8b.jpeg
图 63



    处理+按钮的代码,去掉license和修改相关跳转,对加壳后的程序调试过程中得到加密后的代码,直接粘贴到脱壳后的程序里面去。
    +按钮的代码地址为0x00402CE0,给dumped_fixcode_fixres_on.exe区段__wibu01的添加可写属性后继续用OD进行修改,修改如下面一系列图表示所示。
https://i-blog.csdnimg.cn/blog_migrate/d572ea024854cfe5e466ad42874024fa.jpeg
图 64

https://i-blog.csdnimg.cn/blog_migrate/ac7461bd2c340f10b6835a673a5b8972.jpeg
图 65

https://i-blog.csdnimg.cn/blog_migrate/ac7461bd2c340f10b6835a673a5b8972.jpeg
图 66

https://i-blog.csdnimg.cn/blog_migrate/39df20801481c740c5230abbd29a40cd.jpeg
图 67

https://i-blog.csdnimg.cn/blog_migrate/ae12999b883ad0ce8313ad44e297c5f2.jpeg
图 68


图 69
https://i-blog.csdnimg.cn/blog_migrate/039a370b6b506eafeea5e02811d32645.jpeg

图 70

    通过调试可知地址00402B50处的代码运行时解密,运行后加密。

https://i-blog.csdnimg.cn/blog_migrate/b9cc04b989bead280a044c48755d3bac.jpeg
图 71
    将文件保存为dumped_fixcode_fixres_on_+.exe。

    继续跟踪加壳后的程序,地址00402D4E处下断点后,用LordPE部分转存地址00402B50,大小为16A的代码部分的数据,如图72所示,保存为00402b50.dmp。
https://i-blog.csdnimg.cn/blog_migrate/6ef0c980c807b24cec5ae030170bebe7.jpeg
图 72

    用UltraEdit 修改dumped_fixcode_fixres_on_+.exe程序的代码,地址偏移为00002B50,如图73所示,大小为16A,结束偏移为00002CBA,采用00402b50.dmp的代码替换。

https://i-blog.csdnimg.cn/blog_migrate/53550e6870f5e1694aead53d9ce57793.jpeg
图 73
    =按钮的代码地址为00403050,之前的00402B50的地址处的代码已经解密。
用OD打开dumped_fixcode_fixres_on_+.exe,继续处理=按钮的代码


图 74
  

https://i-blog.csdnimg.cn/blog_migrate/869114d21977005fb9fd14d213bda6b2.jpeg
图 75

https://i-blog.csdnimg.cn/blog_migrate/57a7dfd29fba626259a8ceebdbeceef3.jpeg

图 76
xx
图 77

https://i-blog.csdnimg.cn/blog_migrate/a5e3849335631f2cf5ecabe3017ca641.jpeg
图 78

https://i-blog.csdnimg.cn/blog_migrate/ea85993ec672381f8207c44be63b48c5.jpeg
图 79

修改完后可以将程序保存为dumped_fixcode_fixres_on_+=.exe,修改__wibu01区段标志后,继续用upx加壳后保存为dumped_fixcode_fixres_on_+=upx.exe。
现在就可以拔掉加密锁,无限制使用加法运算了。其他的算法如减法,乘法等可以采用相同的方法来去掉,实现完整破解。

四:总结
优点:
AxProtector和Ixprotector两种方式保护后的程序可以使程序的授权粒度细化到函数级别,修改数据目录项会使OD载入程序出错,反调试部分会对函数下断点及部分代码下断点的情况进行检查,资源加密,代码替换,浮点运算给分析过程带来不少的麻烦,函数运行时解密,运行后加密的方式,需要对加密后的函数一个一个进行转储,增加了分析的时间。
在没有加密锁的情况下无法进行脱壳。
缺点:
HideOD插件可以屏蔽一部分反调试手段,没有进行检查。
相对于基于代码移植的保护,CodeMeter这种基于授权的保护方式,无论在软件层面使用什么样的保护方法,代码总会在PC机的内存中出现,让分析人员有机可乘。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值