【文章标题】: 某工程造价管理系统Asprotect2.11+Rockey4破解小记
【文章作者】: dttom
【作者邮箱】: dttom2006@gmail.com
【作者主页】: http://hi.baidu.com/dttom
【下载地址】: 自己搜索下载
【加壳方式】: Asprotect2.11
【保护方式】: Asprotect2.11+Rockey4(加密狗)
【使用工具】: Ollydbg,dogcheck,Peid,ImportREC
【操作平台】: WinXP SP3
【软件介绍】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这是我第一次破解软件,很多是靠猜,然后试出来的。各位大牛就不用看,好了废话不说,言归正转,这几天接触到某工程造价管理系统软件,首先打开软件无狗能够以学习版方式打开有总金额限制,接着打开PEID用VerA一测采用了Asprotect2.11 加壳保护,运用dogCheck测了一下使用的是飞天诚信(FTSafe) Rockey 4 加密狗(有驱型)的方式保护,由于手中无狗,破解思路基本是先脱壳,然后暴破关键点。
思路有了下面开工干活了,Asprotect壳我一直没空学习,借着这个机会查出一堆Asprotect壳的资料学习了解一下, VolX大牛的ASProtect脚本太强大了,可能商业软件的原因,软件没stolen code用脚本很容易就脱掉了。
脱壳后,主要通过动态调试找到关键点暴破。
打开Ollydbg来到OEP
04754AF4 >/$ 55 push ebp
04754AF5 |. 8BEC mov ebp, esp
04754AF7 |. 83C4 EC add esp, -14
04754AFA |. 33C0 xor eax, eax
04754AFC |. 8945 EC mov dword ptr [ebp-14], eax
04754AFF |. B8 743D7504 mov eax, 04753D74
04754B04 |. E8 3F34A4FF call 04197F48 //关键Call带加密狗的,会把一些测试狗的模块放在前面
04754B09 |. 33C0 xor eax, eax
04754B0B |. 55 push ebp
04754B0C |. 68 AD4B7504 push 04754BAD
04754B11 |. 64:FF30 push dword ptr fs:[eax]
04754B14 |. 64:8920 mov dword ptr fs:[eax], esp
04754B17 |. A1 08107604 mov eax, dword ptr [4761008]
04754B1C |. 8B00 mov eax, dword ptr [eax]
04754B1E |. E8 4133AFFF call 04247E64
04754B23 |. E8 44E5A3FF call 0419306C
04754B28 |. 48 dec eax
04754B29 |. 7C 42 jl short 04754B6D
04754B2B |. 8D45 EC lea eax, dword ptr [ebp-14]
04754B2E |. E8 990BA4FF call 041956CC
04754B33 |. 50 push eax
04754B34 |. E8 9B7CDDFF call 0452C7D4
04754B39 |. E8 822DA4FF call 041978C0
04754B3E |. 8B55 EC mov edx, dword ptr [ebp-14]
04754B41 |. B8 84807604 mov eax, 04768084
04754B46 |. E8 D50BA4FF call 04195720
04754B4B |. 6A 01 push 1
04754B4D |. 6A 00 push 0
04754B4F |. 6A 00 push 0
04754B51 |. 6A 00 push 0
04754B53 |. 68 84807604 push 04768084
04754B58 |. E8 F379DDFF call 0452C550
04754B5D |. 84C0 test al, al
04754B5F |. 75 0C jnz short 04754B6D
04754B61 |. A1 08107604 mov eax, dword ptr [4761008]
04754B66 |. 8B00 mov eax, dword ptr [eax]
04754B68 |. E8 A734AFFF call 04248014
04754B6D |> E8 1EE7FFFF call 04753290
04754B72 |. 84C0 test al, al
04754B74 |. 74 21 je short 04754B97
04754B76 |. E8 69E3FFFF call 04752EE4
04754B7B |. E8 BCE8FFFF call 0475343C
04754B80 |. E8 8BEDFFFF call 04753910
04754B85 |. FF15 CC057604 call dword ptr [47605CC] ; XXXXXXX.04753C54
04754B8B |. A1 08107604 mov eax, dword ptr [4761008]
04754B90 |. 8B00 mov eax, dword ptr [eax]
04754B92 |. E8 8133AFFF call 04247F18
04754B97 |> 33C0 xor eax, eax
04754B99 |. 5A pop edx
04754B9A |. 59 pop ecx
04754B9B |. 59 pop ecx
04754B9C |. 64:8910 mov dword ptr fs:[eax], edx
04754B9F |. 68 B44B7504 push 04754BB4
04754BA4 |> 8D45 EC lea eax, dword ptr [ebp-14]
04754BA7 |. E8 200BA4FF call 041956CC
04754BAC \. C3 retn
通过试用知道软件有几个模块,试着搜索内存,查找关键字下断点,方法是点工具栏上的M进入内存页面,Ctr+B呼出搜索
窗口,输入相关的模块名后下断点后,F9运行之,可以在我们下断的地方停下来。
04192EC8 /$ 56 push esi
04192EC9 |. 57 push edi
04192ECA |. 89C6 mov esi, eax
04192ECC |. 89D7 mov edi, edx
04192ECE |. 89C8 mov eax, ecx
04192ED0 |. 39F7 cmp edi, esi
04192ED2 |. 77 13 ja short 04192EE7
04192ED4 |. 74 2F je short 04192F05
04192ED6 |. C1F9 02 sar ecx, 2
04192ED9 |. 78 2A js short 04192F05
04192EDB |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] //停在这里,很明显内存数据复制
04192EDD |. 89C1 mov ecx, eax
04192EDF |. 83E1 03 and ecx, 3
04192EE2 |. F3:A4 rep movs byte ptr es:[edi], byte ptr [esi]
04192EE4 |. 5F pop edi
04192EE5 |. 5E pop esi
04192EE6 |. C3 retn
单步调试回到外部调用函数,来到如下一段函数中,看到下面一段函数,突然觉得豁然开朗,
0435524C /$ 55 push ebp
0435524D |. 8BEC mov ebp, esp
0435524F |. 83C4 F0 add esp, -10
04355252 |. B8 64507604 mov eax, 04765064
04355257 |. BA 3C583504 mov edx, 0435583C
0435525C |. E8 BF04E4FF call 04195720
04355261 |. C605 68507604>mov byte ptr [4765068], 33 //可能是模块ID号,我猜的
04355268 |. C605 69507604>mov byte ptr [4765069], 0 //我手中没有狗,将它改为1试试,下面同理改之
0435526F |. B8 6C507604 mov eax, 0476506C
04355274 |. BA 54583504 mov edx, 04355854
04355279 |. E8 A204E4FF call 04195720
0435527E |. C605 70507604>mov byte ptr [4765070], 34
04355285 |. C605 71507604>mov byte ptr [4765071], 0
0435528C |. B8 74507604 mov eax, 04765074
04355291 |. BA 6C583504 mov edx, 0435586C
04355296 |. E8 8504E4FF call 04195720
0435529B |. C605 78507604>mov byte ptr [4765078], 35
043552A2 |. C605 79507604>mov byte ptr [4765079], 0
043552A9 |. B8 7C507604 mov eax, 0476507C
043552AE |. BA 84583504 mov edx, 04355884
043552B3 |. E8 6804E4FF call 04195720
043552B8 |. C605 80507604>mov byte ptr [4765080], 36
043552BF |. C605 81507604>mov byte ptr [4765081], 0
043552C6 |. B8 84507604 mov eax, 04765084
043552CB |. BA 98583504 mov edx, 04355898 ; ASCII "审核模块"
043552D0 |. E8 4B04E4FF call 04195720
043552D5 |. C605 88507604>mov byte ptr [4765088], 37
043552DC |. C605 89507604>mov byte ptr [4765089], 0
043552E3 |. B8 8C507604 mov eax, 0476508C
043552E8 |. BA AC583504 mov edx, 043558AC
043552ED |. E8 2E04E4FF call 04195720
043552F2 |. C605 90507604>mov byte ptr [4765090], 38
043552F9 |. C605 91507604>mov byte ptr [4765091], 0
04355300 |. B8 94507604 mov eax, 04765094
04355305 |. BA C4583504 mov edx, 043558C4
0435530A |. E8 1104E4FF call 04195720
0435530F |. C605 98507604>mov byte ptr [4765098], 39
04355316 |. C605 99507604>mov byte ptr [4765099], 0
0435531D |. B8 9C507604 mov eax, 0476509C
04355322 |. BA DC583504 mov edx, 043558DC
04355327 |. E8 F403E4FF call 04195720
0435532C |. C605 A0507604>mov byte ptr [47650A0], 3A
04355333 |. C605 A1507604>mov byte ptr [47650A1], 0
0435533A |. B8 A4507604 mov eax, 047650A4
0435533F |. BA F4583504 mov edx, 043558F4 ; ASCII "国际统计模块"
04355344 |. E8 D703E4FF call 04195720
04355349 |. C605 A8507604>mov byte ptr [47650A8], 3B
04355350 |. C605 A9507604>mov byte ptr [47650A9], 0
04355357 |. B8 AC507604 mov eax, 047650AC
0435535C |. BA 0C593504 mov edx, 0435590C
04355361 |. E8 BA03E4FF call 04195720
04355366 |. C605 B0507604>mov byte ptr [47650B0], 41
0435536D |. C605 B1507604>mov byte ptr [47650B1], 0
04355374 |. B8 B4507604 mov eax, 047650B4
04355379 |. BA 24593504 mov edx, 04355924 ; ASCII "国际审核模块"
0435537E |. E8 9D03E4FF call 04195720
04355383 |. C605 B8507604>mov byte ptr [47650B8], 42
0435538A |. C605 B9507604>mov byte ptr [47650B9], 0
04355391 |. B8 BC507604 mov eax, 047650BC
04355396 |. BA 3C593504 mov edx, 0435593C
0435539B |. E8 8003E4FF call 04195720
043553A0 |. C605 C0507604>mov byte ptr [47650C0], 4D
043553A7 |. C605 C1507604>mov byte ptr [47650C1], 0
043553AE |. 33C9 xor ecx, ecx
043553B0 |. B2 01 mov dl, 1
043553B2 |. A1 E88B2D04 mov eax, dword ptr [42D8BE8]
043553B7 |. E8 14DEF8FF call 042E31D0
......
改好后,接着向下走,通过反复多次调试,确定如下位置
......
04753C54 /$ A1 98097604 mov eax, dword ptr [4760998]
04753C59 |. C600 2D mov byte ptr [eax], 2D
04753C5C |. A1 500B7604 mov eax, dword ptr [4760B50]
04753C61 |. BA 143D7504 mov edx, 04753D14 ; ASCII "yyyy-mm-dd"
04753C66 |. E8 B51AA4FF call 04195720
04753C6B |. A1 08107604 mov eax, dword ptr [4761008]
04753C70 |. 8B00 mov eax, dword ptr [eax]
04753C72 |. BA 283D7504 mov edx, 04753D28 ;
04753C77 |. E8 783CAFFF call 042478F4
04753C7C |. 8B0D 08107604 mov ecx, dword ptr [4761008] ; xxx.047633E8
04753C82 |. 8B09 mov ecx, dword ptr [ecx]
04753C84 |. B2 01 mov dl, 1
04753C86 |. A1 209A4B04 mov eax, dword ptr [44B9A20]
04753C8B |. E8 488BA6FF call 041BC7D8
04753C90 |. 8B15 14127604 mov edx, dword ptr [4761214] ; xxx.04767C94
04753C96 |. 8902 mov dword ptr [edx], eax
04753C98 |. 8B0D 2C107604 mov ecx, dword ptr [476102C] ; xxx.04767E68
04753C9E |. A1 08107604 mov eax, dword ptr [4761008]
04753CA3 |. 8B00 mov eax, dword ptr [eax]
04753CA5 |. 8B15 C4305704 mov edx, dword ptr [45730C4] ; xxx.04573110
04753CAB |. E8 D441AFFF call 04247E84
04753CB0 |. 8B0D 900B7604 mov ecx, dword ptr [4760B90] ; xxx.047654D0
04753CB6 |. A1 08107604 mov eax, dword ptr [4761008]
04753CBB |. 8B00 mov eax, dword ptr [eax]
04753CBD |. 8B15 6CEF3704 mov edx, dword ptr [437EF6C] ; xxx.0437EFB8
04753CC3 |. E8 BC41AFFF call 04247E84
04753CC8 |. A1 08107604 mov eax, dword ptr [4761008]
04753CCD |. 8B00 mov eax, dword ptr [eax]
04753CCF |. E8 1C40AFFF call 04247CF0
04753CD4 |. E8 9BFCFFFF call 04753974
04753CD9 |. A1 68067604 mov eax, dword ptr [4760668]
04753CDE |. 8038 00 cmp byte ptr [eax], 0 //关键点,我猜的
04753CE1 |. 75 05 jnz short 04753CE8
04753CE3 |. E8 94FEFFFF call 04753B7C
04753CE8 |> A1 080B7604 mov eax, dword ptr [4760B08]
04753CED |. E8 9244BFFF call 04348184
04753CF2 |. E8 51FCFFFF call 04753948
04753CF7 |. E8 70F3A3FF call 0419306C
04753CFC |. 48 dec eax
04753CFD |. 7C 06 jl short 04753D05
04753CFF |. E8 74F9FFFF call 04753678
04753D04 |. C3 retn
04753D05 |> E8 8AFAFFFF call 04753794
04753D0A \. C3 retn
04753CDE |. 8038 00 cmp byte ptr [eax], 0 //关键点,我猜的
将它改为mov byte ptr[eax],1
保存后, 打开弹出一程序错误窗口,无法使用。
看来程序修改的还是有问题,打开OD来到最后修改的地方,仔细检查,发现内存
.......
0475AC1C 04329850 gbg2153X.04329850
0475AC20 04329784 gbg2153X.04329784
0475AC24 0432985C gbg2153X.0432985C
0475AC28 04329868 gbg2153X.04329868
0475AC2C 04329874 gbg2153X.04329874
0475AC30 043297D8 gbg2153X.043297D8
0475AC34 00408D01 //最后修改处,但看看下一个地址,是不是有点相似呀,
0475AC38 00408D00 //将它也改为408D01试试看
0475AC3C C08BFF0F
0475AC40 C08B0804
......
修改后如下:
......
04753CCF |. E8 1C40AFFF call 04247CF0
04753CD4 |. E8 9BFCFFFF call 04753974
04753CD9 |. A1 68067604 mov eax, dword ptr [4760668]
04753CDE |. C600 01 mov byte ptr [eax], 1
04753CE1 C640 04 01 mov byte ptr [eax+4], 1
04753CE5 |. 90 nop
04753CE6 |. 90 nop
04753CE7 |. 90 nop
......
保存后,重新打开,无学习版提示,点注册界面多了输入注册码窗口,且相关模块显示已注册。
有没有暗桩,没做进一步测试。需要输入实际数据试试,可惜这个我不懂
--------------------------------------------------------------------------------
【经验总结】
由于第一次接触Asprotect壳,查了相关资料,本着学习的目的借着这个机会多学的东西,花了一些时间。运用VolX大牛的脚本很就可以脱掉Asprotect壳,再用ImportREC修复一下输入表。Rockey4狗由于从来没接触过,就先上飞天的网站下了Rockey4的开发手册了解了一下。其实,下面暴破也没用着。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年02月11日 0:43:15
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!