最近杀了一只怪“狗”。这个程序安装后,目录下共有三个文件:一个主程序文件,两个DLL文件。运行时主程序引导一个DLL文件(程序的主要功能都在这个DLL文件中),然后再读取另一个DLL文件的数据,接着读狗,然后判断有狗无狗。三个文件均未加壳,省去好多麻烦:)
这还不算。怪的是这个程序没有界面,是通过右键来运行的,所以和别的有些不同,无法直接运行主程序。
开始感到无从下手,后来仔细一分析立即晕倒!只要改几处跳转即完成爆破。由于涉及版权不便公开程序名。
一、先看看主程序xxxxxxxx.exe(隐去文件名)。
先侦察一下,不插入USB加密狗,随便加密一个文件,马上跳出一个警告框,提示“请插入有效的加密锁!”。
用OD载入主程序xxxxxxxx.exe后,可以搜索到字符串“请插入有效的加密锁!”。修改相应的跳转后,程序还是不能正常运行。后来发现主程序xxxxxxxx.exe实际上只是一个引导程序,所以不必改动它。
二、再来看看1.dll文件(隐去文件名)。
虽然它也有相应的字符串。修改相应的跳转后,程序还是跳出一个警告框,不能正常运行。看来它是主程序引导的对象,没有检测狗的功能。
三、最后看看2.dll文件(隐去文件名)。
用OD载入2.dll,搜索字符串会发现几个“Token9610”,其中有一处的上方有USB\VID_07E4&PID_9610”,明显是驱动之类的。双击后来到代码处:
10009A00 /$ 83EC 24 SUB ESP,24
10009A03 |. B9 98C80110 MOV ECX,1001C898
10009A08 |. E8 43C6FFFF CALL 10006050 ; 10006050
10009A0D |. A1 C4CB0110 MOV EAX,DWORD PTR DS:[1001CBC4]
10009A12 |. 68 80000000 PUSH 80 ; /Arg8 = 00000080
10009A17 |. 6A 00 PUSH 0 ; |Arg7 = 00000000
10009A19 |. 6A 00 PUSH 0 ; |Arg6 = 00000000
10009A1B |. 6A 00 PUSH 0 ; |Arg5 = 00000000
10009A1D |. 6A 00 PUSH 0 ; |Arg4 = 00000000
10009A1F |. 6A 00 PUSH 0 ; |Arg3 = 00000000
10009A21 |. 68 68520110 PUSH 10015268 ; |Arg2 = 10015268
10009A26 |. 50 PUSH EAX ; |Arg1 => 00000000
10009A27 |. B9 A8BF0110 MOV ECX,1001BFA8 ; |
10009A2C |. E8 4FA5FFFF CALL 10003F80 ; \2.10003F80
10009A31 |. 8B0D C4CB0110 MOV ECX,DWORD PTR DS:[1001CBC4]
10009A37 |. 68 80000000 PUSH 80 ; /Arg8 = 00000080
10009A3C |. 6A 00 PUSH 0 ; |Arg7 = 00000000
10009A3E |. 6A 00 PUSH 0 ; |Arg6 = 00000000
10009A40 |. 6A 00 PUSH 0 ; |Arg5 = 00000000
10009A42 |. 68 90A10110 PUSH 1001A190 ; | ASCII "USB\VID_07E4&PID_9610"/////驱动
10009A47 |. 6A 01 PUSH 1 ; |Arg3 = 00000001
10009A49 |. 68 78520110 PUSH 10015278 ; |Arg2 = 10015278
10009A4E |. 51 PUSH ECX ; |Arg1 => 00000000
10009A4F |. B9 20C40110 MOV ECX,1001C420 ; |
10009A54 |. E8 27A5FFFF CALL 10003F80
10009A59 |. 85C0 TEST EAX,EAX
10009A5B |. 74 0C JE SHORT 10009A69 ; 10009A69
10009A5D |. B9 20C40110 MOV ECX,1001C420
10009A62 |. E8 39B5FFFF CALL 10004FA0 ; 10004FA0
10009A67 |. EB 04 JMP SHORT 10009A6D ; 10009A6D
10009A69 |> 8B4424 00 MOV EAX,DWORD PTR SS:[ESP]
10009A6D |> 53 PUSH EBX
10009A6E |. 55 PUSH EBP
10009A6F |. 85C0 TEST EAX,EAX
10009A71 |. 56 PUSH ESI
10009A72 |. 0F84 E9000000 JE 10009B61 ////不能跳!跳则表示读取驱动不成功。NOP掉!
10009A78 |. B9 A8BF0110 MOV ECX,1001BFA8
10009A7D |. 33F6 XOR ESI,ESI
10009A7F |. E8 CCB0FFFF CALL 10004B50
10009A84 |. 85C0 TEST EAX,EAX
10009A86 |. 76 29 JBE SHORT 10009AB1 ////这里也不能跳!跳则程序异常。NOP掉!
10009A88 |> 56 /PUSH ESI
10009A89 |. B9 A8BF0110 |MOV ECX,1001BFA8
10009A8E |. E8 FDB1FFFF |CALL 10004C90
10009A93 |. 85C0 |TEST EAX,EAX
10009A95 |. 74 0B |JE SHORT 10009AA2
10009A97 |. 50 |PUSH EAX
10009A98 |. B9 98C80110 |MOV ECX,1001C898
10009A9D |. E8 CEC5FFFF |CALL 10006070
10009AA2 |> B9 A8BF0110 |MOV ECX,1001BFA8
10009AA7 |. 46 |INC ESI
10009AA8 |. E8 A3B0FFFF |CALL 10004B50
10009AAD |. 3BF0 |CMP ESI,EAX
10009AAF |.^ 72 D7 \JB SHORT 10009A88
10009AB1 |> B9 98C80110 MOV ECX,1001C898
10009AB6 |. E8 55C7FFFF CALL 10006210
10009ABB |. 8BE8 MOV EBP,EAX
10009ABD |. 33DB XOR EBX,EBX
10009ABF |. 85ED TEST EBP,EBP
10009AC1 |. 0F86 9A000000 JBE 10009B61 ////不能跳!跳则表示没有驱动。NOP掉!
10009AC7 |. 57 PUSH EDI
10009AC8 |> B9 08000000 /MOV ECX,8
10009ACD |. 33C0 |XOR EAX,EAX
10009ACF |. 8D7C24 14 |LEA EDI,DWORD PTR SS:[ESP+14]
10009AD3 |. 53 |PUSH EBX
10009AD4 |. F3:AB |REP STOS DWORD PTR ES:[EDI]
10009AD6 |. B9 98C80110 |MOV ECX,1001C898
10009ADB |. E8 50C7FFFF |CALL 10006230 ; 10006230
10009AE0 |. 8D5424 14 |LEA EDX,DWORD PTR SS:[ESP+14]
10009AE4 |. B9 98C80110 |MOV ECX,1001C898
10009AE9 |. 52 |PUSH EDX
10009AEA |. E8 A1C5FFFF |CALL 10006090 ; 10006090
10009AEF |. 85C0 |TEST EAX,EAX
10009AF1 |. 74 58 |JE SHORT 10009B4B ; 10009B4B
10009AF3 |. 68 70020000 |PUSH 270
10009AF8 |. E8 8E1C0000 |CALL 1000B78B ; 1000B78B
10009AFD |. 8BD0 |MOV EDX,EAX
10009AFF |. B9 08000000 |MOV ECX,8
10009B04 |. 8D7424 18 |LEA ESI,DWORD PTR SS:[ESP+18]
10009B08 |. 33C0 |XOR EAX,EAX
10009B0A |. 8D7A 40 |LEA EDI,DWORD PTR DS:[EDX+40]
10009B0D |. C742 60 01000>|MOV DWORD PTR DS:[EDX+60],1
10009B14 |. F3:A5 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D>
10009B16 |. BF 2CA10110 |MOV EDI,1001A12C ; ASCII"Token9610" ////双击后来到这里。
10009B1B |. 83C9 FF |OR ECX,FFFFFFFF
10009B1E |. 83C4 04 |ADD ESP,4
10009B21 |. F2:AE |REPNE SCAS BYTE PTR ES:[EDI]
10009B23 |. F7D1 |NOT ECX
10009B25 |. 2BF9 |SUB EDI,ECX
10009B27 |. 8BC1 |MOV EAX,ECX
10009B29 |. 8BF7 |MOV ESI,EDI
10009B2B |. 8BFA |MOV EDI,EDX
10009B2D |. C1E9 02 |SHR ECX,2
10009B30 |. F3:A5 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D>
10009B32 |. 8BC8 |MOV ECX,EAX
10009B34 |. 83E1 03 |AND ECX,3
10009B37 |. F3:A4 |REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:>
10009B39 |. A1 6CCB0110 |MOV EAX,DWORD PTR DS:[1001CB6C]
10009B3E |. 891485 70CB01>|MOV DWORD PTR DS:[EAX*4+1001CB70],EDX
10009B45 |. 40 |INC EAX
10009B46 |. A3 6CCB0110 |MOV DWORD PTR DS:[1001CB6C],EAX
10009B4B |> 43 |INC EBX
10009B4C |. 3BDD |CMP EBX,EBP
10009B4E |.^ 0F82 74FFFFFF \JB 10009AC8 ; 10009AC8
10009B54 |. 5F POP EDI
10009B55 |. 5E POP ESI
10009B56 |. 5D POP EBP
10009B57 |. B8 01000000 MOV EAX,1
10009B5C |. 5B POP EBX
10009B5D |. 83C4 24 ADD ESP,24
10009B60 |. C3 RETN
10009B16处的“Token9610”估计应该是狗标志了。看看前面有没有跳转会跳过这里。如果有就NOP掉强行让程序走到这里。
经查找发现10009A72和10009AC1处均JBE 10009B61,跳过狗标志处。NOP掉以上二处跳转后,测试时出现程序异常。跟踪后发现10009A86处也不能跳转,NOP掉这里的跳转后程序正常运行。
不过修改后要注销一下系统才能重新加载此DLL文件,否则内存中存留的还是原来的DLL数据。
至此狗被解。虽然是只怪狗,但也是只弱狗。
[课程]Android-CTF解题方法汇总!