起初想玩破解还是很偶然的。7月上旬单位新买来3套国外软件,还带来一套试用版的。
可是一个软件只有一个狗,我们单位人多,非常的不方便。还有那套试用的居然拿来就是过期的。
不爽,决定破解他们。然后就是上网学习了,虽然大学时候还学过点IBM汇编和C51,悔当初没学好,现在都忘记了。碰到不知道的指令就百度 GOOGLE了。好在我这几个程序都没加壳。通过找字符串,然后JMP,试用软件和2带HARDLOCK狗的软件很好解(因为字符串很好找)。这里我就不多说了。
就是找到字符串,上下找跳转,JE改JNZ,JNZ改JE,或者JMP暴力点算了。
这里重点讲破解一个噪音预测软件的破解。VC++写的 。不插沟提示找不到“hardlock狗,,请插入 ....”
运行的时候拔狗提示“找不到hardlock狗,,请插入”
找字符串,找到hardlock。出来hardlock.vxd这些东西,反正我目前是看不懂。
005585ED . /0F85 0C000000 JNZ 复件_cna.005585FF
005585F3 . |C745 E8 C4FD6>MOV DWORD PTR SS:[EBP-18],复件_cna.0068FDC>; \\.\hardlock.vxd
005585FA . |E9 07000000 JMP 复件_cna.00558606
005585FF > \C745 E8 D8FD6>MOV DWORD PTR SS:[EBP-18],复件_cna.0068FDD>; \\.\fentedev
00558606 > 6A 00 PUSH 0 ; /hTemplateFile = NULL
00558608 . 6A 00 PUSH 0 ; |Attributes = 0
0055860A . 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING
0055860C . 6A 00 PUSH 0 ; |pSecurity = NULL
0055860E . 6A 03 PUSH 3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00558610 . 68 000000C0 PUSH C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00558615 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ; |
00558618 . 50 PUSH EAX ; |FileName
00558619 . FF15 68E35D00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA
0055861F . A3 A4FD6800 MOV DWORD PTR DS:[68FDA4],EAX
00558624 . 833D A4FD6800>CMP DWORD PTR DS:[68FDA4],-1
0055862B . 0F85 15000000 JNZ 复件_cna.00558646
00558631 . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
unicode和ANSII都找不到“hardlock狗,,请插入 ....”这句话,用bpx MessagerBoxA拦截的话都跑到ntdll或者user32空间去了。无法下手。想到了模拟狗。
hardlock狗,驱动是5.22版本的。读取狗的时候不管是HI-DUMP还是2007,读出来的DAT只有9K,BIN文件也只有9K。后来用HL slove和mylock,制作好了。可是还是出现了“hardlock狗,,请插入 ....”,看来启动程序是过了,但是运行还是过不去。
放弃,还是走程序把。
F8走下去
005DDA7D |. 50 PUSH EAX ; /pStartupinfo
005DDA7E |. FF15 60E25D00 CALL DWORD PTR DS:[<&KERNEL32.GetStartup>; \GetStartupInfoA
005DDA84 |. F645 D0 01 TEST BYTE PTR SS:[EBP-30],1
005DDA88 |. 74 11 JE SHORT 复件_cna.005DDA9B
005DDA8A |. 0FB745 D4 MOVZX EAX,WORD PTR SS:[EBP-2C]
005DDA8E |. EB 0E JMP SHORT 复件_cna.005DDA9E
005DDA90 |> 803E 20 /CMP BYTE PTR DS:[ESI],20
005DDA93 |.^ 76 D8 |JBE SHORT 复件_cna.005DDA6D
005DDA95 |. 46 |INC ESI
005DDA96 |. 8975 8C |MOV DWORD PTR SS:[EBP-74],ESI
005DDA99 |.^ EB F5 \JMP SHORT 复件_cna.005DDA90
005DDA9B |> 6A 0A PUSH 0A
005DDA9D |. 58 POP EAX
005DDA9E |> 50 PUSH EAX ; /Arg4
005DDA9F |. 56 PUSH ESI ; |Arg3
005DDAA0 |. 53 PUSH EBX ; |Arg2
005DDAA1 |. 53 PUSH EBX ; |/pModule
005DDAA2 |. FF15 BCE25D00 CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; |\GetModuleHandleA
005DDAA8 |. 50 PUSH EAX ; |Arg1
005DDAA9 |. E8 6254E2FF CALL 复件_cna.00402F10 ; \复件_cna.00402F10
005DDAAE |. 8945 98 MOV DWORD PTR SS:[EBP-68],EAX
005DDAB1 |. 50 PUSH EAX ; /status
005DDAB2 |. FF15 BCE45D00 CALL DWORD PTR DS:[<&MSVCRT.exit>] ; \exit
这段代码在很多VC里都可以找到。这里有个CALL很关键CALL cna.00402F10,继续往下走就退出了。如果F8,直接出来“hardlock狗,,请插入 ....”,所以要跟进去。
继续F8,又来到关键地方。
0040321D |> /8B47 02 |/MOV EAX,DWORD PTR DS:[EDI+2]
00403220 |. |85C0 ||TEST EAX,EAX
00403222 |. |74 09 ||JE SHORT 复件_cna.0040322D
00403224 |. |A1 400E6C00 ||MOV EAX,DWORD PTR DS:[6C0E40]
00403229 |. |85C0 ||TEST EAX,EAX
0040322B |. |74 27 ||JE SHORT 复件_cna.00403254
0040322D |> |66:8B07 ||MOV AX,WORD PTR DS:[EDI]
00403230 |. |66:8B4F FE ||MOV CX,WORD PTR DS:[EDI-2]
00403234 |. |68 7CC46000 ||PUSH 复件_cna.0060C47C
00403239 |. |68 70C46000 ||PUSH 复件_cna.0060C470 ; ASCII "DATAKUSTIK" 这个字符很特殊,和狗上字一样,是不是要开始读狗了呢?
0040323E |. |50 ||PUSH EAX
0040323F |. |51 ||PUSH ECX
00403240 |. |E8 FD141500 ||CALL 复件_cna.00554742 这个CALL比一般的CALL花费的时间要长,是不是读狗呢?还不好判断,继续
00403245 |. |8BF0 ||MOV ESI,EAX
00403247 |. |83C4 10 ||ADD ESP,10
0040324A |. |66:85F6 ||TEST SI,SI
0040324D |. |74 10 ||JE SHORT 复件_cna.0040325F 如果跳过去如何呢。
0040324F |. |E8 67101500 ||CALL 复件_cna.005542BB 不跳的话就执行这句
00403254 |> |45 ||INC EBP
00403255 |. |83C7 08 ||ADD EDI,8
00403258 |. |83FD 04 ||CMP EBP,4
0040325B |.^\72 C0 |\JB SHORT 复件_cna.0040321D 返回到开始321D地方。再次执行
0040325D |. EB 18 |JMP SHORT 复件_cna.00403277
0040325F |> 8B44EC 40 |MOV EAX,DWORD PTR SS:[ESP+EBP*8+40]
00403263 |. 85C0 |TEST EAX,EAX
00403265 |. 74 10 |JE SHORT 复件_cna.00403277
00403267 |. 6A 00 |PUSH 0
00403269 |. 891D 400E6C00 |MOV DWORD PTR DS:[6C0E40],EBX
经过跟踪,如果有狗,CALL完复件_cna.00554742 后JE SHORT 复件_cna.0040325F就跳了,如果没狗,那么就会从0040324F开始继续运行,然后跳回0040321D,再次执行 。没有狗的话会在这段代码循环4次,而且CALL 0044472这个时间都比较长,那么可以肯定这里就是读狗的地方了。
00554742 /$ 55 PUSH EBP
00554743 |. 8BEC MOV EBP,ESP
00554745 |. 83EC 14 SUB ESP,14
00554748 |. 53 PUSH EBX
00554749 |. 56 PUSH ESI
0055474A |. 57 PUSH EDI
0055474B |. 833D A8CE6800>CMP DWORD PTR DS:[68CEA8],0
00554752 |. 0F85 0A000000 JNZ cna32.00554762 有狗没狗都是不跳,继续!
00554758 |. C705 A8CE6800>MOV DWORD PTR DS:[68CEA8],cna32.0068CDA8
00554762 |> A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554767 |. 66:8B40 1C MOV AX,WORD PTR DS:[EAX+1C]
0055476B |. 66:8945 FC MOV WORD PTR SS:[EBP-4],AX
0055476F |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554774 |. 8B40 34 MOV EAX,DWORD PTR DS:[EAX+34]
00554777 |. 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
0055477A |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
0055477F |. 66:8B40 1E MOV AX,WORD PTR DS:[EAX+1E]
00554783 |. 66:8945 F8 MOV WORD PTR SS:[EBP-8],AX
00554787 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
0055478C |. 66:C740 06 00>MOV WORD PTR DS:[EAX+6],0
00554792 |. 66:8B45 0C MOV AX,WORD PTR SS:[EBP+C]
00554796 |. 8B0D A8CE6800 MOV ECX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
0055479C |. 66:8941 1C MOV WORD PTR DS:[ECX+1C],AX
005547A0 |. 66:8B45 08 MOV AX,WORD PTR SS:[EBP+8]
005547A4 |. 8B0D A8CE6800 MOV ECX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
005547AA |. 66:8941 08 MOV WORD PTR DS:[ECX+8],AX
005547AE |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547B3 |. 8378 34 00 CMP DWORD PTR DS:[EAX+34],0
005547B7 |. 0F85 19000000 JNZ cna32.005547D6 有狗和有狗都不跳,继续
005547BD |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547C2 |. 66:C740 18 20>MOV WORD PTR DS:[EAX+18],20
005547C8 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547CD |. 50 PUSH EAX
005547CE |. E8 8DFAFFFF CALL cna32.00554260
005547D3 |. 83C4 04 ADD ESP,4
005547D6 |> A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547DB |. 66:C740 42 00>MOV WORD PTR DS:[EAX+42],0
005547E1 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547E6 |. 66:C740 1E 00>MOV WORD PTR DS:[EAX+1E],0
005547EC |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547F1 |. C740 3A 00000>MOV DWORD PTR DS:[EAX+3A],0
005547F8 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005547FD |. 66:C740 44 00>MOV WORD PTR DS:[EAX+44],0
00554803 |. 66:C745 F0 00>MOV WORD PTR SS:[EBP-10],0
00554809 |. E9 04000000 JMP cna32.00554812
0055480E |> 66:FF45 F0 /INC WORD PTR SS:[EBP-10]
00554812 |> 0FBF45 F0 MOVSX EAX,WORD PTR SS:[EBP-10]
00554816 |. 83F8 08 |CMP EAX,8
00554819 |. 0F8D 35000000 |JGE cna32.00554854
0055481F |. 0FBF45 F0 |MOVSX EAX,WORD PTR SS:[EBP-10]
00554823 |. 8B4D 10 |MOV ECX,DWORD PTR SS:[EBP+10]
00554826 |. 8A0408 |MOV AL,BYTE PTR DS:[EAX+ECX]
00554829 |. 0FBF4D F0 |MOVSX ECX,WORD PTR SS:[EBP-10]
0055482D |. 8B15 A8CE6800 |MOV EDX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
00554833 |. 884411 24 |MOV BYTE PTR DS:[ECX+EDX+24],AL
00554837 |. 0FBF45 F0 |MOVSX EAX,WORD PTR SS:[EBP-10]
0055483B |. 8B4D 14 |MOV ECX,DWORD PTR SS:[EBP+14]
0055483E |. 8A0408 |MOV AL,BYTE PTR DS:[EAX+ECX]
00554841 |. 0FBF4D F0 |MOVSX ECX,WORD PTR SS:[EBP-10]
00554845 |. 8B15 A8CE6800 |MOV EDX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
0055484B |. 884411 2C |MOV BYTE PTR DS:[ECX+EDX+2C],AL
0055484F |.^ E9 BAFFFFFF \JMP cna32.0055480E
00554854 |> A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554859 |. 66:C740 18 00>MOV WORD PTR DS:[EAX+18],0
0055485F |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554864 |. 50 PUSH EAX
00554865 |. E8 F6F9FFFF CALL cna32.00554260
0055486A |. 83C4 04 ADD ESP,4
0055486D |. 66:8945 F4 MOV WORD PTR SS:[EBP-C],AX
00554871 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00554874 |. 25 FFFF0000 AND EAX,0FFFF
00554879 |. 83F8 02 CMP EAX,2
0055487C |. 0F85 31000000 JNZ cna32.005548B3 这个很关键,因为在这个跳转之前都是顺序执行的,但是有狗的话就跳了。所以必须跳。
00554882 |. 66:8B45 FC MOV AX,WORD PTR SS:[EBP-4]
00554886 |. 8B0D A8CE6800 MOV ECX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
0055488C |. 66:8941 1C MOV WORD PTR DS:[ECX+1C],AX
00554890 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00554893 |. 8B0D A8CE6800 MOV ECX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
00554899 |. 8941 34 MOV DWORD PTR DS:[ECX+34],EAX
0055489C |. 66:8B45 F8 MOV AX,WORD PTR SS:[EBP-8]
005548A0 |. 8B0D A8CE6800 MOV ECX,DWORD PTR DS:[68CEA8] ; cna32.0068CDA8
005548A6 |. 66:8941 1E MOV WORD PTR DS:[ECX+1E],AX
005548AA |. 66:8B45 F4 MOV AX,WORD PTR SS:[EBP-C]
005548AE |. E9 D6000000 JMP cna32.00554989
005548B3 |> 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] 跳到这里。
005548B6 |. 25 FFFF0000 AND EAX,0FFFF
005548BB |. 83F8 0F CMP EAX,0F
005548BE |. 0F84 11000000 JE cna32.005548D5 不能跳!继续执行
005548C4 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
005548C7 |. 25 FFFF0000 AND EAX,0FFFF
005548CC |. 83F8 0E CMP EAX,0E
005548CF |. 0F85 09000000 JNZ cna32.005548DE 这里必须跳。貌似判断EBP-C里放的东西。我还没搞清楚这个数值干嘛的。
005548D5 |> 66:8B45 F4 MOV AX,WORD PTR SS:[EBP-C]
005548D9 |. E9 AB000000 JMP cna32.00554989
005548DE |> F745 F4 FFFF0>TEST DWORD PTR SS:[EBP-C],0FFFF
005548E5 |. 0F84 3E000000 JE cna32.00554929 必须跳
005548EB |. F645 0C 02 TEST BYTE PTR SS:[EBP+C],2
005548EF |. 0F84 2B000000 JE cna32.00554920
005548F5 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
005548FA |. 66:C740 18 22>MOV WORD PTR DS:[EAX+18],22
00554900 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554905 |. 50 PUSH EAX
00554906 |. E8 55F9FFFF CALL cna32.00554260
0055490B |. 83C4 04 ADD ESP,4
0055490E |. 0FB7C0 MOVZX EAX,AX
00554911 |. 83F8 06 CMP EAX,6
00554914 |. 0F85 06000000 JNZ cna32.00554920
0055491A |. 66:C745 F4 00>MOV WORD PTR SS:[EBP-C],100
00554920 |> 66:8B45 F4 MOV AX,WORD PTR SS:[EBP-C]
00554924 |. E9 60000000 JMP cna32.00554989
00554929 |> A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
0055492E |. 33C9 XOR ECX,ECX
00554930 |. 66:8B48 1C MOV CX,WORD PTR DS:[EAX+1C]
00554934 |. 83F9 02 CMP ECX,2
00554937 |. 0F85 43000000 JNZ cna32.00554980 必须跳。
0055493D |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554942 |. 66:C740 18 07>MOV WORD PTR DS:[EAX+18],7
00554948 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
0055494D |. 50 PUSH EAX
0055494E |. E8 0DF9FFFF CALL cna32.00554260
00554953 |. 83C4 04 ADD ESP,4
00554956 |. 66:8945 F4 MOV WORD PTR SS:[EBP-C],AX
0055495A |. F745 F4 FFFF0>TEST DWORD PTR SS:[EBP-C],0FFFF
00554961 |. 0F84 19000000 JE cna32.00554980
00554967 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
0055496C |. 66:C740 18 01>MOV WORD PTR DS:[EAX+18],1
00554972 |. A1 A8CE6800 MOV EAX,DWORD PTR DS:[68CEA8]
00554977 |. 50 PUSH EAX
00554978 |. E8 E3F8FFFF CALL cna32.00554260
0055497D |. 83C4 04 ADD ESP,4
00554980 |> 66:8B45 F4 MOV AX,WORD PTR SS:[EBP-C]
00554984 |. E9 00000000 JMP cna32.00554989
00554989 |> 5F POP EDI
0055498A |. 5E POP ESI
0055498B |. 5B POP EBX
0055498C |. C9 LEAVE
0055498D \. C3 RETN
改完后,运行后 还出来“hardlock狗,,请插入 ....”。还是进不了程序。
这个和模拟狗的情况一样,启动的监测狗程序应该废了,但是程序运行会自己监测狗。
因为找不到这个字符串。有也是在user32.dll空间里去了,一时间难住了。我在这个地方停了至少3-4天。菜啊。没办法。
后来换成了C32ASM这个工具找字符串,它查找的结果非常的明朗,简洁。开始都是什么OTPY_ 、IDS_、IDM_、IDD_。学过VC的应该很清楚这些是什么。
继续找啊找。
眼前一亮,居然发现IDE_HARDLOCK_STATUS,大喜。不过通过别的(reshacker等汉化)工具我还能找到IDE_HARDLOCK。不知道C32ASM和OLLYDBG等为什么都找不到。疑惑。
00403290->PUSH 27C
00427D5D->PUSH 27C.
于是找到这段代码。
0040321D |> /8B47 02 |/MOV EAX,DWORD PTR DS:[EDI+2]
00403220 |. |85C0 ||TEST EAX,EAX
00403222 |. |74 09 ||JE SHORT cna32.0040322D
00403224 |. |A1 400E6C00 ||MOV EAX,DWORD PTR DS:[6C0E40]
00403229 |. |85C0 ||TEST EAX,EAX
0040322B |. |74 27 ||JE SHORT cna32.00403254
0040322D |> |66:8B07 ||MOV AX,WORD PTR DS:[EDI]
00403230 |. |66:8B4F FE ||MOV CX,WORD PTR DS:[EDI-2]
00403234 |. |68 7CC46000 ||PUSH cna32.0060C47C
00403239 |. |68 70C46000 ||PUSH cna32.0060C470 ; datakustik
0040323E |. |50 ||PUSH EAX
0040323F |. |51 ||PUSH ECX
00403240 |. |E8 FD141500 ||CALL cna32.00554742
00403245 |. |8BF0 ||MOV ESI,EAX
00403247 |. |83C4 10 ||ADD ESP,10
0040324A |. |66:85F6 ||TEST SI,SI
0040324D |74 10 JE SHORT cna32.0040325F
0040324F |. |E8 67101500 ||CALL cna32.005542BB
00403254 |> |45 ||INC EBP
00403255 |. |83C7 08 ||ADD EDI,8
00403258 |. |83FD 04 ||CMP EBP,4
0040325B |.^\72 C0 |\JB SHORT cna32.0040321D
0040325D |. EB 18 |JMP SHORT cna32.00403277
0040325F |> 8B44EC 40 |MOV EAX,DWORD PTR SS:[ESP+EBP*8+40]
00403263 |. 85C0 |TEST EAX,EAX
00403265 |. 74 10 |JE SHORT cna32.00403277
00403267 |. 6A 00 |PUSH 0
00403269 |. 891D 400E6C00 |MOV DWORD PTR DS:[6C0E40],EBX
0040326F |. E8 5CDEFFFF |CALL cna32.004010D0
00403274 |. 83C4 04 |ADD ESP,4
00403277 |> 33D2 |XOR EDX,EDX
00403279 |. 66:85F6 |TEST SI,SI
0040327C |. 0F94C2 |SETE DL
0040327F |. 8BFA |MOV EDI,EDX
00403281 |. 85FF |TEST EDI,EDI
00403283 |. 897C24 1C |MOV DWORD PTR SS:[ESP+1C],EDI
00403287 75 22 JNZ SHORT cna32.004032AB
00403289 |. 81E6 FFFF0000 |AND ESI,0FFFF
0040328F |. 56 |PUSH ESI
00403290 |. 68 7C020000 |PUSH 27C 就是这里。看看看前面的代码。不正式开始读狗的代码吗?F8运行
00403295 |. 6A 15 |PUSH 15
00403297 |. E8 544D0200 |CALL cna32.00427FF0 到这句,就报错了。哈哈,大喜,是不是只要跳过这句就可以了呢。那么在00403287处必须跳转。
0040329C |. 0FBFC0 |MOVSX EAX,AX
0040329F |. 83C4 0C |ADD ESP,0C
004032A2 |. 83F8 04 |CMP EAX,4
004032A5 |.^ 0F84 67FFFFFF \JE cna32.00403212
004032AB |> 6A 01 PUSH 1
004032AD |. E8 FE0B1200 CALL cna32.00523EB0
004032B2 |. 83C4 04 ADD ESP,4
004032B5 |. 85FF TEST EDI,EDI
004032B7 |. 0F84 98020000 JE cna32.00403555
004032BD |. 68 60976F00 PUSH cna32.006F9760
004032C2 |. E8 C94A0200 CALL cna32.00427D90
004032C7 |. B9 20000000 MOV ECX,20
004032CC |. BE 60976F00 MOV ESI,cna32.006F9760
004032D1 |. 8D7C24 60 LEA EDI,DWORD PTR SS:[ESP+60]
004032D5 |. 8D4424 60 LEA EAX,DWORD PTR SS:[ESP+60]
004032D9 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
004032DB |. 50 PUSH EAX
004032DC |. E8 CF4A0200 CALL cna32.00427DB0
004032E1 |. 83C4 08 ADD ESP,8
004032E4 |. 33ED XOR EBP,EBP
004032E6 |. 8D4424 5C LEA EAX,DWORD PTR SS:[ESP+5C]
什么都不说了。00403287 75 22 JNZ SHORT cna32.004032AB JNZ直接改成JMP。
再次运行,还是提示没有狗。OK。选第二个地方。00427D5D->PUSH 27C.先看红色那句。
00427CA0 /$ 83EC 20 SUB ESP,20
00427CA3 |. 8D4424 00 LEA EAX,DWORD PTR SS:[ESP]
00427CA7 |. 53 PUSH EBX
00427CA8 |. 56 PUSH ESI
00427CA9 |. 57 PUSH EDI
00427CAA |. 68 E0A06300 PUSH cna32.0063A0E0 ; /mmhhduschaugstabaguadausheidha
00427CAF |. 50 PUSH EAX ; |String1
00427CB0 |. 33DB XOR EBX,EBX ; |
00427CB2 |. 33FF XOR EDI,EDI ; |
00427CB4 |. FF15 10E35D00 CALL DWORD PTR DS:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00427CBA |. A1 98D06000 MOV EAX,DWORD PTR DS:[60D098]
00427CBF |. 83F8 03 CMP EAX,3 ; Switch (cases 0..3)
00427CC2 |. 77 23 JA SHORT cna32.00427CE7
00427CC4 |. FF2485 787D42>JMP DWORD PTR DS:[EAX*4+427D78]
00427CCB |> A1 84A46F00 MOV EAX,DWORD PTR DS:[6FA484] ; Case 1 of switch 00427CBF
00427CD0 |. EB 29 JMP SHORT cna32.00427CFB
00427CD2 |> A1 90A46F00 MOV EAX,DWORD PTR DS:[6FA490] ; Case 0 of switch 00427CBF
00427CD7 |. EB 22 JMP SHORT cna32.00427CFB
00427CD9 |> A1 88A46F00 MOV EAX,DWORD PTR DS:[6FA488] ; Case 2 of switch 00427CBF
00427CDE |. EB 1B JMP SHORT cna32.00427CFB
00427CE0 |> A1 8CA46F00 MOV EAX,DWORD PTR DS:[6FA48C] ; Case 3 of switch 00427CBF
00427CE5 |. EB 14 JMP SHORT cna32.00427CFB
00427CE7 |> A1 84A46F00 MOV EAX,DWORD PTR DS:[6FA484] ; Default case of switch 00427CBF
00427CEC |. 8B0D 90A46F00 MOV ECX,DWORD PTR DS:[6FA490]
00427CF2 |. F7D0 NOT EAX
00427CF4 |. 0BC1 OR EAX,ECX
00427CF6 |. A3 8CA46F00 MOV DWORD PTR DS:[6FA48C],EAX
00427CFB |> A9 00000010 TEST EAX,10000000
00427D00 74 45 JE SHORT cna32.00427D47 不能跳。要往下执行才行。
00427D02 |. 8D4C24 15 LEA ECX,DWORD PTR SS:[ESP+15]
00427D06 |. 6A 01 PUSH 1
00427D08 |. 51 PUSH ECX
00427D09 |. E8 C6C91200 CALL cna32.005546D4
00427D0E |. 66:8BD8 MOV BX,AX
00427D11 |. 83C4 08 ADD ESP,8
00427D14 |. 81E3 FFFF0000 AND EBX,0FFFF
00427D1A 75 2B JNZ SHORT cna32.00427D47 不能跳,要往下执行才行
00427D1C |. B9 08000000 MOV ECX,8
00427D21 |. BF 8CD06000 MOV EDI,cna32.0060D08C
00427D26 |. 8D7424 15 LEA ESI,DWORD PTR SS:[ESP+15]
00427D2A |. 33C0 XOR EAX,EAX
00427D2C |. F3:A6 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:>
00427D2E |. 74 05 JE SHORT cna32.00427D35
00427D30 |. 1BC0 SBB EAX,EAX
00427D32 |. 83D8 FF SBB EAX,-1
00427D35 |> 8BF8 MOV EDI,EAX
00427D37 |. 85FF TEST EDI,EDI
00427D39 75 0C JNZ SHORT cna32.00427D47 不能跳,要往下执行才行
00427D3B |. 5F POP EDI
00427D3C |. 5E POP ESI
00427D3D |. B8 01000000 MOV EAX,1
00427D42 |. 5B POP EBX
00427D43 |. 83C4 20 ADD ESP,20
00427D46 |. C3 RETN
00427D47 |> 33F6 XOR ESI,ESI 在上面的语句中有很多都往这里跳。如果跳的绝对完蛋了。所以不能往这里跳。看下面分析。
00427D49 |. 33C0 XOR EAX,EAX
00427D4B |. 85FF TEST EDI,EDI
00427D4D |. 0F95C0 SETNE AL
00427D50 |. 8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
00427D53 |. 8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
00427D56 |. 8D1480 LEA EDX,DWORD PTR DS:[EAX+EAX*4]
00427D59 |. 8D04D3 LEA EAX,DWORD PTR DS:[EBX+EDX*8]
00427D5C |. 50 PUSH EAX
00427D5D |. 68 7C020000 PUSH 27C
在这里呢。根据上一句的经验,没有狗的话,执行到这里绝对要报错。
00427D62 |. 6A 10 PUSH 10
00427D64 |. E8 87020000 CALL cna32.00427FF0
果然,运行提示报错。而且是关键是这里报错代码是0.正是碰到那句。看来这里不能让它执行。往上找跳转。
00427D69 |. 83C4 0C ADD ESP,0C
00427D6C |. 8BC6 MOV EAX,ESI
00427D6E |. 5F POP EDI
00427D6F |. 5E POP ESI
00427D70 |. 5B POP EBX
00427D71 |. 83C4 20 ADD ESP,20
00427D74 \. C3 RETN
好了。把上面几句改成顺序执行就Ok了。仔细看代码,发现有三个地方调用了00427CA0,可以认定这段就是在软件运行时候监测狗的代码。拔狗就出错。
修改好,保存,运行----------------------------------------------------------------------------
OK!
软件顺利打开。运行的时候也没有“找不到狗的提示”了。
打开,保存。编辑、输出、输入。参数设置,都没问题。只不过唯一遗憾的是无法计算。也只能算完成了90%吧。
现在还菜到家,以后我再慢慢找怎么这个原因。如果有高手愿意带带我的话,PM我吧。我单位还有几个sentinl狗的软件..........以后再搞它了。
谢谢。以上是我学习2个礼拜破解的收获。欢迎大家拍砖,交流。
[课程]FART 脱壳王!加量不加价!FART作者讲授!