这段时间一直在看这个视频教程,前部分是我自己做的笔记,后部分是总结课里的课件,一起贴出来!
1. 脱MoleBox
hr ESP并bp VirtualProtect中断三次返回,删除bp VirtualProtect断点 Ctrl+B:89 01---nop掉,直接运行4次!即可到达OEP附近。NOP掉的是mov dword ptr [ecx], eax语句,NOP后可使得到的IAT全部有效,可能起到对IAT处理的作用。
2. 脱DLL文件与脱EXE文件主要的不同在于 要获取重定位地址。
1) 脱UPX壳的DLL文件。
100A0A2F 83C7 04 add edi, 4 (执行完这句后的EDI为重定位的地址)
100A0A32 8D5E FC lea ebx, dword ptr [esi-4]
100A0A35 31C0 xor eax, eax
100A0A37 8A07 mov al, byte ptr [edi] (传递重定位地址的关键语句)
100A0A39 47 inc edi
用lordpe脱壳后,修改重定位,注意添入的是上面得到的值减去该DLL在内存中的基址,同时用lordpe载入时注意一下基址是否正确。再修复(import REC中的选项的“使用来自磁盘的PE头”的勾去掉,修复EXE程序时记得勾上)。
2) 脱ASPACK的DLL文件
100771E5 8BB5 39050000 mov esi, dword ptr [ebp+539] ([ebp+539]的值是重定位RVA)
100771EB 03B5 22040000 add esi, dword ptr [ebp+422]
100771F1 833E 00 cmp dword ptr [esi], 0
用lordpe脱壳后,修改重定位,注意添入的是上面得到的值减去该DLL在内存中的基址,同时用lordpe载入注意一下基址是否正确。再修复(import REC中的选项的“使用来自磁盘的PE头”的勾去掉,修复EXE程序时记得勾上)。
3) 可以尝试使用PETools的插件-》重定位重建工具来修复脱壳后的DLL重定位表。
3. IAT查找:
1) 可以enter进调用函数的CALL,然后在数据窗口中跟随-》内存地址,将数据窗口改成地址形式。
2) 对C类程序,可以ctrl+b搜索FF 15,然后在数据窗口中跟随-》内存地址,将数据窗口改成地址形式。
3) 其他的可以,可以ctrl+b搜索FF 25,然后在数据窗口中跟随-》内存地址,将数据窗口改成地址形式。
4. delphi的入口特征:
004014BC /EB 10 jmp short 004014CE
004014BE |66:623A bound di, dword ptr [edx]
004014C1 |43 inc ebx
004014C2 |2B2B sub ebp, dword ptr [ebx]
004014C4 |48 dec eax
004014C5 |4F dec edi
004014C6 |4F dec edi
004014C7 |4B dec ebx
004014C8 |90 nop
004014C9 -|E9 98404C00 jmp 008C5566
004014CE \A1 8B404C00 mov eax, dword ptr [4C408B]
004014D3 C1E0 02 shl eax, 2
004014D6 A3 8F404C00 mov dword ptr [4C408F], eax
5. 若发现花指令,可以尝试使用virtualfree、virtualalloc、virtualprotect断点。
6. 用BC++和delphi编写的程序,用资源查看器查看,会发现有“RC数据”。
7. 脱穿山甲的壳(手工记录,仅做提示之用,具体课程参考黑鹰破解提高班11、12课)
1) 穿山甲保护选项介绍(可用Armadillo find protected来查看有哪些保护选项):
Debug-Blocker 阻止调试器
CopyMem-II 双进程
1、Nanomites Processing
The Nanomites provide additional protection against memory-dumping for your programs. They will protect your program even if it is somehow stripped out of the SoftwarePassport/Armadillo shell. If your program can use the Debugger-Blocker or CopyMem-II, it should be able to use Nanomites as well. Besides enabling this option, you must mark sections within your program where Nanomites are permitted to reside and won't cause any speed problems, and use a custom build of the Armadillo engine. This option can only be used with the Debugger-Blocker or CopyMem-II protections.
Nanomites Processing就是通常所谓的CC,Armadillo最让人头痛的保护措施。
2、Import Table Elimination
Import Table Elimination is another anti-dumping defense. It removes the import table of the program, making it much more difficult to reconstruct the unprotected program file. Unlike CopyMem-II and the Nanomites, this defense does not require the Debugger-Blocker, but it is only available in custom builds.
Import Table Elimination一般是把输入表放在壳申请的内存处并且乱序处理。
对于输入表乱序,以前有两种解法:①、写代码重新排序;②、直接用ImportRec“创建新的IAT”功能
来构造新的输入表。
3、Code Splicing
Strategic Code Splicing is another anti-dumping defense. It removes portions of your code and places them randomly in memory, changing them so that they still operate the same but are coded differently. Unlike CopyMem-II and the Nanomites, this defense does not require the Debugger-Blocker, but it is only available in custom builds.
Code Splicing通常称为远程地址,Armadillo会把程序中的部分代码挪移到壳申请的内存段运行,普通
dump会导致此部分代码丢失。以前有两种解法:①、修改VirtualAlloc返回地址,使其把挪移的代码放
到无用的壳区段;②、Dmp后补上那个包含挪移代码的壳申请的内存段。
4、Memory-Patching Protections
He Memory-Patching Protections prevent an attacker from using a loader to change your program's code in memory, once it's loaded. If you handle any part of the expiration logic in your program's code, or use environment variables to control features that are only allowed in the paid-for version, then your program might be vulnerable to a memory-patching attack.
If you use this option, you MUST use either CopyMem-II or the monitoring thread (or both),
or it won't be able to do anything.The only time this option can cause a problem is if your program uses self-modifying code -- this option would consider that an attack, and would deliberately crash your program to stop it.
内存校验。
2) 穿山甲全保护脱壳过程一(Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks,以下分析基于特定程序,使用时请具体情况具体分析)。
1、到达OEP(脚本来完成,脚本名称为Armadillo Detach from Client + Unpack (Ricardo 1000 Bytes Method) v0.1.txt)。记下入口点的头两个字节、OEP的头两个字节、OEP地址和子进程PID。附加子进程,返回用户代码,还原OEP头两个字节。
2、找、处理IAT。找到IAT。用ArmaDetach载入加壳程序,记下子进程号,打开另一个OD,附加这个子进程,返回用户代码,还原入口点的头两个字节,ctrl+g搜索“GetModuleHandleA”,在如下地方下好断点:
7C80B6C1 > 8BFF MOV EDI,EDI
7C80B6C3 55 PUSH EBP
7C80B6C4 8BEC MOV EBP,ESP
7C80B6C6 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
7C80B6CA 74 18 JE SHORT kernel32.7C80B6E4 ; 下硬件断点的地方
7C80B6CC FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80B6CF E8 C0290000 CALL kernel32.7C80E094
7C80B6D4 85C0 TEST EAX,EAX
7C80B6D6 74 08 JE SHORT kernel32.7C80B6E0
7C80B6D8 FF70 04 PUSH DWORD PTR DS:[EAX+4]
7C80B6DB E8 7D2D0000 CALL kernel32.GetModuleHandleW
7C80B6E0 5D POP EBP
7C80B6E1 C2 0400 RETN 4
多次shift+f9,堆栈出现如下所示时(若有试用提示框,则应在提示框后),去掉硬件断点,返回用户代码:
00129288 /00129528
0012928C |00DD602D 返回到 00DD602D 来自 kernel32.GetModuleHandleA
00129290 |001293DC ASCII "kernel32.dll"
00129294 |00000000
返回后,来到这里:
00DD602D 8B0D 7C41E000 MOV ECX,DWORD PTR DS:[E0417C]
00DD6033 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DD6036 A1 7C41E000 MOV EAX,DWORD PTR DS:[E0417C]
00DD603B 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00DD603E 75 16 JNZ SHORT 00DD6056
00DD6040 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00DD6046 50 PUSH EAX
00DD6047 FF15 BC62DF00 CALL DWORD PTR DS:[DF62BC] ; kernel32.LoadLibraryA
00DD604D 8B0D 7C41E000 MOV ECX,DWORD PTR DS:[E0417C]
00DD6053 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DD6056 A1 7C41E000 MOV EAX,DWORD PTR DS:[E0417C]
00DD605B 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00DD605E 0F84 2F010000 JE 00DD6193 ; 改成“Jmp 00DD6193”,MAGIC跳,跳了就不会对IAT进行加密。
00DD6064 33C9 XOR ECX,ECX
00DD6066 8B07 MOV EAX,DWORD PTR DS:[EDI]
00DD6068 3918 CMP DWORD PTR DS:[EAX],EBX
00DD606A 74 06 JE SHORT 00DD6072
00DD606C 41 INC ECX
00DD606D 83C0 0C ADD EAX,0C
00DD6070 ^ EB F6 JMP SHORT 00DD6068
将JE 00DD6193改成“Jmp 00DD6193”,来到00DD6193,如下所示:
00DD6193 83C7 0C ADD EDI,0C
00DD6196 89BD 78FDFFFF MOV DWORD PTR SS:[EBP-288],EDI
00DD619C 83C6 04 ADD ESI,4
00DD619F 395F FC CMP DWORD PTR DS:[EDI-4],EBX
00DD61A2 ^ 0F85 49FEFFFF JNZ 00DD5FF1
00DD61A8 EB 03 JMP SHORT 00DD61AD ; 在这里下F2断点
在00DD61A8处下断点,然后shift+F9,停在00DD61A8,回去撤消00DD605E处的修改(防止穿山甲全检测),取消00DD61A8处的断点。打开内存,在程序的CODE段下F2断点,shift+f9,停在了OEP(此时的OEP已经被修改了),然后查找IAT(查找的方法是在第一个OD里二进制复制两个输入函数,然后在第二个OD的内存里“搜索”),二进制复制(一定要复制准确),然后在第一个OD的相同位置进行粘贴。此时可以把第二个OD和ArmaDetach关掉。
3、Code Splicing处理(由ArmInline来完成)。打开ArmInlin,选择好进程,将“length of spliced code”设为20000,点“remove splices”。记住不要关闭“ArmInline”。
4、挪动IAT(如果有输入表乱序,则进行这个步骤)。
5、用lordpe和importrec脱壳和修复(剪切无效指针)。
6、Nanomites处理(由ArmInline来完成)。此时程序可以运行,如果有异常,则进行处理Nanomites。点“locate”,然后点“repair dump”,选择脱壳修复后的文件。
7、可能还有自校验需要处理。
3) 穿山甲全保护脱壳过程二
1、到达OEP(脚本来完成,脚本名称为Armadillo Detach from Client + Unpack (Ricardo 1000 Bytes Method) v0.1.txt)。忽略所有异常,如不能正常运行脚本,直接运行,添加忽略异常后再运行脚本或者直接shift+f9。记下入口点的头两个字节、OEP的头两个字节、OEP地址和子进程PID。附加子进程,返回用户代码,还原OEP头两个字节。
2、找、处理IAT。用ArmaDetach载入加壳程序,记下子进程号,打开另一个OD,附加这个子进程,返回用户代码,,还原入口点的头两个字节,ctrl+g搜索“VirtualProtect”,然后下断,几次shift+f9,直接有一次缓冲比较大。
3、Code Splicing处理(由ArmInline来完成)
4、挪动IAT
5、Nanomites处理(由ArmInline来完成)
6、可能还有校验需要处理
4) 穿山甲DLL文件的脱壳、穿山甲的EXE标准或者最小保护也可以参考此文(操作时需要灵活掌握,可能会省略一些步骤,Armadillo 2.51 - 3.xx DLL Stub -> Silicon Realms Toolworks)
2、找、处理IAT。OD载入,搜索“GetModuleHandleA”,在下面地方下断。
7C80B6C1 > 8BFF mov edi, edi
7C80B6C3 55 push ebp
7C80B6C4 8BEC mov ebp, esp
7C80B6C6 837D 08 00 cmp dword ptr [ebp+8], 0
7C80B6CA 74 18 je short 7C80B6E4 ; 下硬件断点
7C80B6CC FF75 08 push dword ptr [ebp+8]
7C80B6CF E8 C0290000 call 7C80E094
7C80B6D4 85C0 test eax, eax
7C80B6D6 74 08 je short 7C80B6E0
7C80B6D8 FF70 04 push dword ptr [eax+4]
7C80B6DB E8 7D2D0000 call GetModuleHandleW
7C80B6E0 5D pop ebp
7C80B6E1 C2 0400 retn 4
7C80B6E4 64:A1 18000000 mov eax, dword ptr fs:[18]
7C80B6EA 8B40 30 mov eax, dword ptr [eax+30]
7C80B6ED 8B40 08 mov eax, dword ptr [eax+8]
7C80B6F0 ^ EB EE jmp short 7C80B6E0
多次shift+f9,当堆栈如下所示时,返回用户代码:
00068EBC /0006915C
00068EC0 |00B65CE1 返回到 00B65CE1 来自 kernel32.GetModuleHandleA
00068EC4 |00069010 ASCII "kernel32.dll"
00068EC8 |00000000
在如下地方,删除硬件断点,做如下修改。
00B65CE1 8B0D AC40B900 mov ecx, dword ptr [B940AC]
00B65CE7 89040E mov dword ptr [esi+ecx], eax
00B65CEA A1 AC40B900 mov eax, dword ptr [B940AC]
00B65CEF 391C06 cmp dword ptr [esi+eax], ebx
00B65CF2 75 16 jnz short 00B65D0A
00B65CF4 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
00B65CFA 50 push eax
00B65CFB FF15 BC62B800 call dword ptr [B862BC] ; kernel32.LoadLibraryA
00B65D01 8B0D AC40B900 mov ecx, dword ptr [B940AC]
00B65D07 89040E mov dword ptr [esi+ecx], eax
00B65D0A A1 AC40B900 mov eax, dword ptr [B940AC]
00B65D0F 391C06 cmp dword ptr [esi+eax], ebx
00B65D12 0F84 2F010000 je 00B65E47 ; 改成“jmp 00B65E47”
00B65D18 33C9 xor ecx, ecx
00B65D1A 8B07 mov eax, dword ptr [edi]
00B65D1C 3918 cmp dword ptr [eax], ebx
00B65D1E 74 06 je short 00B65D26
00B65D20 41 inc ecx
00B65D21 83C0 0C add eax, 0C
00B65D24 ^ EB F6 jmp short 00B65D1C
来到00B65E47,在如下地方下断点。
00B65E47 83C7 0C add edi, 0C
00B65E4A 89BD 78FDFFFF mov dword ptr [ebp-288], edi
00B65E50 83C6 04 add esi, 4
00B65E53 395F FC cmp dword ptr [edi-4], ebx
00B65E56 ^ 0F85 49FEFFFF jnz 00B65CA5
00B65E5C EB 03 jmp short 00B65E61 在这里下断点
Shift+f9,撤消上面的修改(防止穿山甲全检测),至此就处理完了IAT,接下来就找重定位地址。
Ctrl+g搜索“GetTickCount”,来到如下地方。
7C8092C5 > BA 0000FE7F mov edx, 7FFE0000 ; 在这里下好断点
7C8092CA 8B02 mov eax, dword ptr [edx]
7C8092CC F762 04 mul dword ptr [edx+4]
7C8092CF 0FACD0 18 shrd eax, edx, 18
7C8092D3 C3 retn
F9运行两次(一般情况下运行两次),取消断点,返回用户代码。“所有命令序列”-》输入
Push eax
Xchg cx,cx
Pop eax
Stc
来到如下地方,并下好断点。
00B7CF27 /74 2B je short 00B7CF54
00B7CF29 |8B85 D0B0FFFF mov eax, dword ptr [ebp+FFFF>
00B7CF2F |8B00 mov eax, dword ptr [eax]
00B7CF31 |8B00 mov eax, dword ptr [eax]
00B7CF33 |0305 10A3B900 add eax, dword ptr [B9A310]
00B7CF39 |8B8D D0B0FFFF mov ecx, dword ptr [ebp+FFFF>
00B7CF3F |8B09 mov ecx, dword ptr [ecx]
00B7CF41 |8901 mov dword ptr [ecx], eax
00B7CF43 |8B85 D0B0FFFF mov eax, dword ptr [ebp+FFFF>
00B7CF49 |83C0 04 add eax, 4
00B7CF4C |8985 D0B0FFFF mov dword ptr [ebp+FFFFB0D0]>
00B7CF52 ^|EB CA jmp short 00B7CF1E
00B7CF54 \50 push eax ; 在这里下好断点
00B7CF55 66:87C9 xchg cx, cx
00B7CF58 58 pop eax
00B7CF59 F9 stc
00B7CF5A 2D F1234392 sub eax, 924323F1
00B7CF5F A2 B5469372 mov byte ptr [729346B5], al
00B7CF64 43 inc ebx
F9运行,出现如下地方。
00B7CF59 C705 E0C0B800 6>mov dword ptr [B8C0E0], 0B8C>
00B7CF63 A1 E49FB900 mov eax, dword ptr [B99FE4]
00B7CF68 8B00 mov eax, dword ptr [eax] ; 重定位的RVA
00B7CF6A 8985 3CD9FFFF mov dword ptr [ebp-26C4], ea>
00B7CF70 A1 E49FB900 mov eax, dword ptr [B99FE4]
00B7CF75 83C0 04 add eax, 4
00B7CF78 A3 E49FB900 mov dword ptr [B99FE4], eax
00B7CF7D A1 E49FB900 mov eax, dword ptr [B99FE4]
00B7CF82 8B00 mov eax, dword ptr [eax] ; 重定位的SIZE
00B7CF84 8985 78D9FFFF mov dword ptr [ebp-2688], ea>
00B7CF8A A1 E49FB900 mov eax, dword ptr [B99FE4]
00B7CF8F 83C0 04 add eax, 4
00B7CF92 A3 E49FB900 mov dword ptr [B99FE4], eax
00B7CF97 83BD 3CD9FFFF 0>cmp dword ptr [ebp-26C4], 0
00B7CF9E 74 6F je short 00B7D00F
00B7CFA0 83BD 78D9FFFF 0>cmp dword ptr [ebp-2688], 0
00B7CFA7 74 66 je short 00B7D00F
00B7CFA9 8B85 FCD7FFFF mov eax, dword ptr [ebp-2804>
00B7CFAF 8B8D 0CD8FFFF mov ecx, dword ptr [ebp-27F4>
00B7CFB5 3B48 34 cmp ecx, dword ptr [eax+34]
00B7CFB8 74 55 je short 00B7D00F ; 重定位的MAGIC JUMP,改成jmp short 00B7D00F
00B7CFBA FFB5 78D9FFFF push dword ptr [ebp-2688]
00B7CFC0 8B85 0CD8FFFF mov eax, dword ptr [ebp-27F4>
00B7CFC6 0385 3CD9FFFF add eax, dword ptr [ebp-26C4>
在上述三个地方下好断点和相应修改,F9运行,作好记录。
CTRL+G搜索“CreateThread”,来到如下地方。
7C810657 > 8BFF mov edi, edi ; 下好断点
7C810659 55 push ebp
7C81065A 8BEC mov ebp, esp
7C81065C FF75 1C push dword ptr [ebp+1C]
7C81065F FF75 18 push dword ptr [ebp+18]
7C810662 FF75 14 push dword ptr [ebp+14]
7C810665 FF75 10 push dword ptr [ebp+10]
7C810668 FF75 0C push dword ptr [ebp+C]
7C81066B FF75 08 push dword ptr [ebp+8]
7C81066E 6A FF push -1
7C810670 E8 D7FDFFFF call CreateRemoteThread
7C810675 5D pop ebp
7C810676 C2 1800 retn 18
F9,打开内存,在此DLL的第二个区段(.text)下好断点,F9运行,就到达了OEP。
然后脱壳,再修改重定位表,再修复。(若脱壳后还显示穿山甲的壳,可以通过 PE TOOLS把修改主连接版本和次连接版本)。
5) 识别Code Splicing区段。Armadillo的Code Splicing可以使用Arminline来修复现在最新版0.95基本可以自动识别Code Splicing的区段当然,也有部分他是自动识别不了的
那么我们手动查找Code Splicing的方法(经验)有以下两点
1、因为Code Splicing被称为远地址跳,就是从程序的地址跳到 内存动态的地址,这个地址每次调试都可以不一样 因此,可以通过查找这些跳转来得到Code Splicing的区段一般通过查找Ctrl+B:E9
2、Code Splicing所在的区段一般是在程序内存地址的最下面(Alt+M)并且,区段长度基本都是20000有以上两种途径,我们基本上可以手动识别Code Splicing的区段了!
6) 不太一样的Armadillo脱壳破解(标准版穿山甲,运行时有两个进程时的脱壳)
a) bp OpenMutexA,运行,返回用户代码,来到如下地方
0052585D . 85C0 test eax, eax
0052585F 75 04 jz short 00525865 ; 把这里改成jnz short 00525865
00525861 . C645 E0 00 mov byte ptr [ebp-20], 0
00525865 > 8B45 E0 mov eax, dword ptr [ebp-20]
00525868 . 25 FF000000 and eax, 0FF
0052586D . 85C0 test eax, eax
0052586F . 0F84 97010000 je 00525A0C
运行,返回拥护代码,来到如下地方
00525C4D . 85C0 test eax, eax
00525C4F 0F84 82010000 jne 00525DD7 ;把这里改成je 0525dd7
00525C55 . 6A 01 push 1 ; /Priority = THREAD_PRIORITY_ABOVE_NORMAL
00525C57 . FF15 30115300 call dword ptr [<&KERNEL32.GetCurrent>; |[GetCurrentThread
00525C5D . 50 push eax ; |hThread
00525C5E . FF15 34115300 call dword ptr [<&KERNEL32.SetThreadP>; \SetThreadPriority
00525C64 . C685 5CF9FFFF>mov byte ptr [ebp-6A4], 0
00525C6B . 68 B4145300 push 005314B4 ; /FileName = "Kernel32"
00525C70 . FF15 3C115300 call dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryA
00525C76 . 8985 58F9FFFF mov dword ptr [ebp-6A8], eax
00525C7C . 83BD 58F9FFFF>cmp dword ptr [ebp-6A8], 0
00525C83 . 74 32 je short 00525CB7
运行,取消断点,返回用户代码。
b) ctrl+g搜索“GetModuleHandleA”,来到如下地方
7C80B6C1 > 8BFF mov edi, edi
7C80B6C3 55 push ebp
7C80B6C4 8BEC mov ebp, esp
7C80B6C6 837D 08 00 cmp dword ptr [ebp+8], 0
7C80B6CA 74 18 je short 7C80B6E4 ; 在这里下硬件断点
7C80B6CC FF75 08 push dword ptr [ebp+8]
7C80B6CF E8 C0290000 call 7C80E094
7C80B6D4 85C0 test eax, eax
7C80B6D6 74 08 je short 7C80B6E0
多次shift+f9,当返回时机(缓冲开始,第二个返回是返回程序领空,7C80B6CA处的跳是实现的)到来,返回用户代码,来到如下地方。
00C0653E 8B4D 08 mov ecx, dword ptr [ebp+8] ; kernel32.7C800000
00C06541 3BC8 cmp ecx, eax
00C06543 75 07 jnz short 00C0654C
00C06545 B8 A8B3C100 mov eax, 0C1B3A8
00C0654A EB 2F jmp short 00C0657B
00C0654C 393D D8B7C100 cmp dword ptr [C1B7D8], edi
00C06552 B8 D8B7C100 mov eax, 0C1B7D8
00C06557 74 0C je short 00C06565 ;将这里改成jmp short 00C06565
00C06559 3B48 08 cmp ecx, dword ptr [eax+8]
00C0655C 74 1A je short 00C06578
00C0655E 83C0 0C add eax, 0C
00C06561 3938 cmp dword ptr [eax], edi
00C06563 ^ 75 F4 jnz short 00C06559
00C06565 FF75 0C push dword ptr [ebp+C]
00C06568 FF75 08 push dword ptr [ebp+8]
00C0656B FF15 F890C100 call dword ptr [C190F8] ; kernel32.GetProcAddress
00C06571 5F pop edi
00C06572 5E pop esi
00C06573 5B pop ebx
00C06574 5D pop ebp
00C06575 C2 0800 retn 8
根据00C0656B处的函数以及回跳分析,发现00C06557处跳了 就跳过了IAT加密。
c) 进行前面所过的跟随CreateThread以及相关步骤,也可以不用跟随CreateThread,直接在内存中的代码(第二个)段下断点,运行。
8. 脱AsProtect的壳
1) 需要注意的:
1、脚本运行完成之后,如果在KERNEL32函数范围内有个别分散的函数没有修复。GetProcAddress
2、如果不在KERNEL32函数范围内并且集中有2个以上函数没有修复,那就是需要修复SDK,如GetHardwareID,CheckKeyAndDecrypt,GetRegistrationKeys,GetModeInformation,GetRegistrationInformation,这些都是ASProtect的API,我们需要手动修复,看学站长近期发表了一篇文章,甚为详细!
2) 具体过程(以下为文字描述,具体过程请参照黑鹰破解提高班18课)
1、利用脚本处理IAT,到达Stolen OEP'Start。脚本名称为Aspr2.XX_unpacker_v1.14aE by VolX.osc。用importrec载入,填上OEP时发现不行,这里我们随便填一个(一般填1000,1500,2000,不行再试其他的)。对无效的指针根据“需要注意的”进行修改。然后填上OEP进行修复。
2、对于1.41版本,可以在.data上下断,运行,在.code下断,运行,到达OEP,用LORDPE脱壳,用importrec修复(用插件,在user32.dll里不能修复的,是messageboxA)。
4、脱此壳的DLL。在.rdata或.idata段下内存写入断点,运行,清除内存断点,来到如下地方。
0046F48C 8366 0C 00 and dword ptr [esi+C], 0 ; DLL处理,要NOP掉
0046F490 03C2 add eax, edx
0046F492 8BD8 mov ebx, eax
0046F494 56 push esi
0046F495 57 push edi
0046F496 50 push eax
0046F497 8BF3 mov esi, ebx
0046F499 8BFB mov edi, ebx
0046F49B AC lods byte ptr [esi]
0046F49C C0C0 03 rol al, 3 ; 解码出DLL名
0046F49F AA stos byte ptr es:[edi]
0046F4A0 803F 00 cmp byte ptr [edi], 0
0046F4A3 ^ 75 F6 jnz short 0046F49B
0046F4A5 58 pop eax
0046F4A6 5F pop edi
0046F4A7 5E pop esi
0046F4A8 50 push eax
0046F4A9 FF95 20854100 call dword ptr [ebp+418520]
0046F4AF 0BC0 or eax, eax ; 此时的ESI-00400000 就是输入表的RVA,需要记录下来
0046F4B1 75 43 jnz short 0046F4F6
0046F4B3 90 nop
0046F4B4 90 nop
0046F4B5 90 nop
0046F4B6 90 nop
0046F4B7 53 push ebx
0046F4B8 FF95 24854100 call dword ptr [ebp+418524] ; 加载DLL
0046F4BE 0BC0 or eax, eax
0046F4C0 75 34 jnz short 0046F4F6
0046F4C2 90 nop
0046F4C3 90 nop
0046F4C4 90 nop
0046F4C5 90 nop
0046F4C6 8B95 46F84000 mov edx, dword ptr [ebp+40F846]
0046F4CC 0195 351B4000 add dword ptr [ebp+401B35], edx
0046F4D2 0195 391B4000 add dword ptr [ebp+401B39], edx
0046F4D8 6A 00 push 0
0046F4DA FFB5 351B4000 push dword ptr [ebp+401B35]
0046F4E0 FFB5 391B4000 push dword ptr [ebp+401B39]
0046F4E6 6A 00 push 0
0046F4E8 FF95 2C854100 call dword ptr [ebp+41852C]
0046F4EE 6A 00 push 0
0046F4F0 FF95 28854100 call dword ptr [ebp+418528]
0046F4F6 60 pushad
0046F4F7 2BC0 sub eax, eax
0046F4F9 8803 mov byte ptr [ebx], al ; 清空DLL名,需要NOP掉
0046F4FB 43 inc ebx
0046F4FC 3803 cmp byte ptr [ebx], al
0046F4FE ^ 75 F9 jnz short 0046F4F9
0046F500 61 popad
0046F501 8985 3EF84000 mov dword ptr [ebp+40F83E], eax ; 保存DLL基址
0046F507 C785 42F84000 0>mov dword ptr [ebp+40F842], 0
0046F511 8B95 46F84000 mov edx, dword ptr [ebp+40F846]
0046F517 8B06 mov eax, dword ptr [esi]
0046F519 0BC0 or eax, eax
0046F51B 75 07 jnz short 0046F524
0046F51D 90 nop
0046F51E 90 nop
0046F51F 90 nop
0046F520 90 nop
0046F521 8B46 10 mov eax, dword ptr [esi+10]
0046F524 03C2 add eax, edx
0046F526 0385 42F84000 add eax, dword ptr [ebp+40F842]
0046F52C 8B18 mov ebx, dword ptr [eax]
0046F52E 8B7E 10 mov edi, dword ptr [esi+10]
0046F531 03FA add edi, edx
0046F533 03BD 42F84000 add edi, dword ptr [ebp+40F842]
0046F539 85DB test ebx, ebx
0046F53B 0F84 62010000 je 0046F6A3
0046F541 F7C3 00000080 test ebx, 80000000
0046F547 75 1D jnz short 0046F566
0046F549 90 nop
0046F54A 90 nop
0046F54B 90 nop
0046F54C 90 nop
0046F54D 03DA add ebx, edx
0046F54F 83C3 02 add ebx, 2
0046F552 56 push esi
0046F553 57 push edi
0046F554 50 push eax
0046F555 8BF3 mov esi, ebx
0046F557 8BFB mov edi, ebx
0046F559 AC lods byte ptr [esi]
0046F55A C0C0 03 rol al, 3 ; 这个函数解码出函数名
0046F55D AA stos byte ptr es:[edi]
0046F55E 803F 00 cmp byte ptr [edi], 0
0046F561 ^ 75 F6 jnz short 0046F559
0046F563 58 pop eax
0046F564 5F pop edi
0046F565 5E pop esi
0046F566 3B9D 46F84000 cmp ebx, dword ptr [ebp+40F846]
0046F56C 7C 11 jl short 0046F57F
0046F56E 90 nop
0046F56F 90 nop
0046F570 90 nop
0046F571 90 nop
0046F572 83BD 1A204000 0>cmp dword ptr [ebp+40201A], 0
0046F579 75 0A jnz short 0046F585
0046F57B 90 nop
0046F57C 90 nop
0046F57D 90 nop
0046F57E 90 nop
0046F57F 81E3 FFFFFF0F and ebx, 0FFFFFFF
0046F585 53 push ebx
0046F586 FFB5 3EF84000 push dword ptr [ebp+40F83E]
0046F58C FF95 1C854100 call dword ptr [ebp+41851C]
0046F592 3B9D 46F84000 cmp ebx, dword ptr [ebp+40F846]
0046F598 7C 0F jl short 0046F5A9
0046F59A 90 nop
0046F59B 90 nop
0046F59C 90 nop
0046F59D 90 nop
0046F59E 60 pushad
0046F59F 2BC0 sub eax, eax
0046F5A1 8803 mov byte ptr [ebx], al ; 清空函数名,需要NOP掉
0046F5A3 43 inc ebx
0046F5A4 3803 cmp byte ptr [ebx], al
0046F5A6 ^ 75 F9 jnz short 0046F5A1
0046F5A8 61 popad
0046F5A9 0BC0 or eax, eax
0046F5AB ^ 0F84 15FFFFFF je 0046F4C6
0046F5B1 3B85 2C854100 cmp eax, dword ptr [ebp+41852C] ; 比较是否是MessageBoxA
0046F5B7 74 20 je short 0046F5D9
0046F5B9 90 nop
0046F5BA 90 nop
0046F5BB 90 nop
0046F5BC 90 nop
0046F5BD 3B85 C4FD4000 cmp eax, dword ptr [ebp+40FDC4] ; 比较是否是registerhotkey
0046F5C3 74 09 je short 0046F5CE
0046F5C5 90 nop
0046F5C6 90 nop
0046F5C7 90 nop
0046F5C8 90 nop
0046F5C9 EB 14 jmp short 0046F5DF
0046F5CB 90 nop
0046F5CC 90 nop
0046F5CD 90 nop
0046F5CE 8D85 31FE4000 lea eax, dword ptr [ebp+40FE31]
0046F5D4 EB 09 jmp short 0046F5DF
0046F5D6 90 nop
0046F5D7 90 nop
0046F5D8 90 nop
0046F5D9 8D85 4BFE4000 lea eax, dword ptr [ebp+40FE4B]
0046F5DF 56 push esi
0046F5E0 FFB5 3EF84000 push dword ptr [ebp+40F83E]
0046F5E6 5E pop esi
0046F5E7 39B5 12204000 cmp dword ptr [ebp+402012], esi ; 比较是否是skinPPwt.dll
0046F5ED 74 15 je short 0046F604
0046F5EF 90 nop
0046F5F0 90 nop
0046F5F1 90 nop
0046F5F2 90 nop
0046F5F3 39B5 16204000 cmp dword ptr [ebp+402016], esi ; 比较是否是skinPPwt.dll
0046F5F9 74 09 je short 0046F604
0046F5FB 90 nop
0046F5FC 90 nop
0046F5FD 90 nop
0046F5FE 90 nop
0046F5FF EB 63 jmp short 0046F664
0046F601 90 nop
0046F602 90 nop
0046F603 90 nop
0046F604 80BD 16564100 0>cmp byte ptr [ebp+415616], 0
0046F60B 74 57 je short 0046F664 ; magic jump
0046F60D 90 nop
0046F60E 90 nop
0046F60F 90 nop
0046F610 90 nop
0046F611 EB 07 jmp short 0046F61A ; 下面便是加密了
0046F613 90 nop
0046F614 90 nop
0046F615 90 nop
0046F616 0100 add dword ptr [eax], eax
0046F618 0000 add byte ptr [eax], al
0046F61A 8BB5 0BF94000 mov esi, dword ptr [ebp+40F90B]
0046F620 83C6 0D add esi, 0D
0046F623 81EE 02184000 sub esi, 00401802
0046F629 2BF5 sub esi, ebp
0046F62B 83FE 00 cmp esi, 0
0046F62E 7F 34 jg short 0046F664
0046F630 90 nop
0046F631 90 nop
0046F632 90 nop
0046F633 90 nop
0046F634 8BB5 0BF94000 mov esi, dword ptr [ebp+40F90B]
0046F63A 53 push ebx
0046F63B 50 push eax
0046F63C E8 8DB2FFFF call 0046A8CE
0046F641 8BD8 mov ebx, eax
0046F643 58 pop eax
0046F644 33C3 xor eax, ebx
0046F646 C606 68 mov byte ptr [esi], 68
0046F649 8946 01 mov dword ptr [esi+1], eax
0046F64C C746 05 8134240>mov dword ptr [esi+5], 243481
0046F653 895E 08 mov dword ptr [esi+8], ebx
0046F656 C646 0C C3 mov byte ptr [esi+C], 0C3
0046F65A 5B pop ebx
0046F65B 8BC6 mov eax, esi
0046F65D 8385 0BF94000 0>add dword ptr [ebp+40F90B], 0D
0046F664 5E pop esi
0046F665 60 pushad
0046F666 8BD0 mov edx, eax
0046F668 2BBD 46F84000 sub edi, dword ptr [ebp+40F846]
0046F66E 8BC7 mov eax, edi
0046F670 B9 01010000 mov ecx, 101
0046F675 8DBD EBEC4000 lea edi, dword ptr [ebp+40ECEB]
0046F67B F2:AF repne scas dword ptr es:[edi]
0046F67D 0BC9 or ecx, ecx
0046F67F 74 13 je short 0046F694
0046F681 90 nop
0046F682 90 nop
0046F683 90 nop
0046F684 90 nop
0046F685 81E9 01010000 sub ecx, 101
0046F68B F7D1 not ecx
0046F68D 89948D EBE84000 mov dword ptr [ebp+ecx*4+40E8EB], edx
0046F694 61 popad
0046F695 8907 mov dword ptr [edi], eax ; API函数的系统地址(或是加密地址)填充到IAT
0046F697 8385 42F84000 0>add dword ptr [ebp+40F842], 4
0046F69E ^ E9 6EFEFFFF jmp 0046F511
0046F6A3 83C6 14 add esi, 14
0046F6A6 8B95 46F84000 mov edx, dword ptr [ebp+40F846]
0046F6AC ^ E9 D0FDFFFF jmp 0046F481 ; 循环处理
0046F6B1 8DBD EBEC4000 lea edi, dword ptr [ebp+40ECEB] ; 修改上面几处后,直接这里F4
然后在.text段下内存访问断点,运行,就到了OEP,删除内存断点。用LORDPE脱壳,再用LORDPE修改入口点为OPE地址,点保存,再修改输入表RVA,保存,确定,保存,重建PE。
3) 补充
a) INT3和内存访问异常。忽略所有异常,运行查看记录,在最后一次INT3和内存访问异常后,在代码段下断点,shift+f9,到达OEP,看看有没有stole code。也可以通过bp GetModuleHandleA,运行两次,二进制搜索“83,C4,28,5D,5F,5E,5B,C3”两次,来到如下所示地方:
00FC89B4 C600 E3 mov byte ptr [eax], 0E3
00FC89B7 8D5424 04 lea edx, dword ptr [esp+4]
00FC89BB A1 C031FD00 mov eax, dword ptr [FD31C0]
00FC89C0 E8 A7BCFFFF call 00FC466C
00FC89C5 E8 AEEFFEFF call 00FB7978
00FC89CA 8BC3 mov eax, ebx
00FC89CC E8 43A2FCFF call 00F92C14
00FC89D1 E8 26F0FFFF call 00FC79FC ; 在这里下硬件执行断点
00FC89D6 83C4 28 add esp, 28
然后运行,F7,打开内存,在代码段下断点,shift+f9,就到了OEP,看看有没有stole code。。
b) 当真正到达OEP时,堆栈中显示返回的是系统领空,若返回的是程序领空,我们应该去那里看一看,说不定真正的OEP就在那里;查找OEP时,可以在“可执行模块中”选择主程序,再搜索“FF 25”、“FF 15”。
9. 对于VB程序的自校验,可以下rtcFileLen,rtcFileLenth断点,二进制搜索20 12 40。VBExplorer查找按钮事件。有提示框则bp rtcMsgBox。通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq。万能断点法(816C24法,查找**框)。
10. Delphi和BC++的破解总结:DEDE、PE Explorer作为强有力的辅助工具找按妞事件;Point-H法;bp GetDlgItem/GetDlgItemTextA(断输入框);bp MessageBoxA(W)(断对话框)---Ctrl+N;字符串法---插件/搜索所有参考文本;如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样的,可以通过查找FormCreate/FormShow----DEDE,找到关键标志位!来判断程序怎么样的判断是否注册或者用户类型
11. 尝试查找模块间调用,以寻找信息。
12. 尝试用万能断点法(point-h法)。下好断点,运行,断下来了,再在代码段下断,运行,来到了程序领空。
13. 看效果而不是看代码。用ExitProcess退出和用其他方式推出,可能是同一个地方,只要改掉其中一个,另一个也达到破解效果。
14. 脱壳时遇到回跳的,在它下一条指令上F4会跑飞,在回跳指令上多次F4会多次断下,那就在回跳指令上按F4到最后一次(跑飞的前一次),然后单步走。
15. 查找无效的IAT。用Importrec”获取输入表”,发现有无效的IAT,在Importrec上找到无效IAT的地址,加上00400000,用OD载入程序,”DD 地址”,在此处下硬件写入断点,多次F9,直到寄存器中出现函数,此函数就是加密后的IAT。
16. IceLicense的判断与破解。出现带“trail license”的字样,且是delphi程序,可以怀疑进行了IceLicense的保护。用”pe explorer”载入,在RC数据中双击主窗口,点击IceLicense前的加号,点击下拉出来的(可能是commonwin),在属性/事件中看到” onLicenseexpired”,”onlicenselnvalid”,”onAppKeyIncorrect”等信息,在“onregistered”后看到“icelicenseregistered”,将” onLicenseexpired”,”onlicenselnvalid”,”onAppKeyIncorrect”等的数值改成” onregistered”。
17. 对于DELPHI程序,可以通过查找“mov ebx, eax“指令,将其替换成“mov ebx,eax”.
打开破解的思路之门
按钮事件:程序通过按钮触发一系列事情经过就叫着按钮事件,那么这个按钮就叫着事件按钮
1、有注册错误/正确提示
bp MessageBoxA
bp rtcMsgBox
用户输入信息
|||||
软件判断是否正确
(je/jne/jz/jnz...)
|||||
Y--------------N
||||| |||||
正确提示 错误提示
如果事先找不到按钮事件
可以通过下消息断点,返回后回嗍即可找到按钮事件起始位置
*********************************************************************
2、无任何提示
bp GetDlgItem
用户输入信息
|||||
信息保存(reg/ini/dll...)
|||||
Y--------------N
||||| |||||
无提示 无提示
或者
||||| |||||
--------------
|||||
提示信息保存,需要重启
$$$$$$下次启动的时候来判断Y/N$$$$$$
可以通过bp GetDlgItem获取按钮事件代码
*********************************************************************
3、未注册一启动或者关闭就跳出个注册框或者提示框
bp RegOpenKey(A)
bp CreateFileA
bp GetPrivateProfileStringA
软件启动的时候,是怎么知道自动打开注册框或者提示框的呢?
那么他在启动的时候一定是读取到某个东西来判断的
是什么东西?reg/ini/dll/其他
至于保存到什么文件,可以使用以下方法
1、查找字符串,看是否有可疑文件名或者注册表键名
2、猜。。。下断点观察
3、按钮事件跟踪
*********************************************************************
4、未注册一启动或者关闭就打开网页链接
bp ShellExecuteA
类似的组合
Cmp/test/其他判断
Je/jne/jne/jz XXXXXXXX
00409D4E 68 48B54300 PUSH 0043B548 ; ASCII "http://www.*.com"
00409D53 68 40B54300 PUSH 0043B540 ; ASCII "open"
00409D58 50 PUSH EAX
00409D59 FF1528134300 CALL DWORD PTR DS:[<&SHELL32.ShellExecuteA>] ; SHELL32.ShellExecuteA
软件启动---判断是否注册---是否Open
断下后回嗍代码即可找到关键点,常用的方法,转存跟踪法
*********************************************************************
5、未注册就功能使用限制
判断是否注册---某种功能是否让你使用---如果不能够用,一定会有提示的,或是错误提示或是弹出注册框等
那么从提示入手即可找到解除限制的关键
不完美破解:解除功能限制
*********************************************************************
6、未注册就日期限制
bp GetLocalTime 获取本地时间
bp GetSystemTime 获取系统时间
bp GetFileTime 获取文件时间
一般下这几个断点比较难分析关键
捷径:查找字符串--找可疑文件--一般以DLL多见
只要不让它读取到这个DLL即可解除限制
*********************************************************************
7、Demo(演示试用版)--功能残缺
这个和上面的功能限制不一样哦
功能限制是软件本身就有这个功能,对程序而言,相对应的功能代码也存在
Demo即是没这个功能,空架子一个而已
一句话:破解也无用!
*********************************************************************
8、网络验证
无法登陆有错误提示者:下消息断点回嗍代码,找按钮事件,从来来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了
无法登陆自动退出者:下bp ExitProcess断下(一般可以断下)回嗍代码,找按钮事件,从来来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了
*********************************************************************
9、狗加密
一般狗加密软件,一启动就会检测所需要的狗文件,若没有狗文件,提示错误
这里我们有两个入手点
1、“一启动就会检测所需要的狗文件”,下bp CreateFileA等断点,断下后,回嗍
2、“若没有狗文件,提示错误”,下bp MessageBoxA,断下后,回嗍
*********************************************************************
总结:
从上面的介绍说明可以看出,有这么一个共同点---按钮事件
可以这么说,按钮事件是我们的思路之门
按钮事件可以这样得来:
1、 通过下相应断点,回嗍代码
2、 通过辅助工具快捷的得到(VBExplorer、DEDE)
按钮事件
断得下来,断得正确
-----------------------------------------------------
黑鹰基地破解提高班破解总结课
一些常规断点
拦截窗口:
bp CreateWindow 创建窗口
bp CreateWindowEx(A/W) 创建窗口
bp ShowWindow 显示窗口
bp UpdateWindow 更新窗口
bp GetWindowText(A/W) 获取窗口文本
拦截消息框:
bp MessageBox(A/W) 创建消息框
bp MessageBoxExA 创建消息框
bp MessageBoxIndirect(A/W) 创建定制消息框
拦截警告声:
bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)
拦截对话框:
bp DialogBox 创建模态对话框
bp DialogBoxParam(A/W) 创建模态对话框
bp DialogBoxIndirect 创建模态对话框
bp DialogBoxIndirectParam(A/W) 创建模态对话框
bp CreateDialog 创建非模态对话框
bp CreateDialogParam(A) 创建非模态对话框
bp CreateDialogIndirect 创建非模态对话框
bp CreateDialogIndirectParam(A/W) 创建非模态对话框
bp GetDlgItemText(A) 获取对话框文本
bp GetDlgItemInt 获取对话框整数值
拦截剪贴板:
bp GetClipboardData 获取剪贴板数据
拦截注册表:
bp RegOpenKey(A/W) 打开子健
bp RegOpenKeyEx(A/W) 打开子健
bp RegQueryValue(A/W) 查找子健
bp RegQueryValueEx(A/W) 查找子健
bp RegSetValue(A/W) 设置子健
bp RegSetValueEx(A/W) 设置子健
功能限制拦截断点:
bp EnableMenuItem 禁止或允许菜单项
bp EnableWindow 禁止或允许窗口
拦截时间:
bp GetLocalTime 获取本地时间
bp GetSystemTime 获取系统时间
bp GetFileTime 获取文件时间
bp GetTickCount 获得自系统成功启动以来所经历的毫秒数
bp GetCurrentTime 获取当前时间(16位)
bp SetTimer 创建定时器
bp TimerProc 定时器超时回调函数
拦截文件:
bp CreateFileA 创建或打开文件 (32位)
bp OpenFile 打开文件 (32位)
bp ReadFile 读文件 (32位)
bp WriteFile 写文件 (32位)
bp GetPrivateProfileStringA (ini文件)
拦截驱动器:
bp GetDriveTypeA 获取磁盘驱动器类型
bp GetLogicalDrives 获取逻辑驱动器符号
bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径
★★VB程序专用断点★★
bp __vbaStrCmp 比较字符串是否相等
bp __vbaStrComp 比较字符串是否相等
bp __vbaVarTstNe 比较变量是否不相等
bp __vbaVarTstEq 比较变量是否相等
bp __vbaStrCopy 复制字符串
bp __vbaStrMove 移动字符串
bp MultiByteToWideChar ANSI字符串转换成Unicode字符串
bp WideCharToMultiByte Unicode字符串转换成ANSI字符串
各分类语言程序的破解思路
C类
Point-H法
bp GetDlgItem/GetWindowText(A/W)/GetWindowTextLength(A/W) (断输入框)
bp MessageBox(A/W)(断对话框)
字符串法
B、D类
DEDE、PE Explorer作为强有力的辅助工具
关键还是找按妞事件
Point-H法
bp GetDlgItem/GetWindowText(A/W)/GetWindowTextLength(A/W) (断输入框)
bp MessageBoxA(断对话框)
字符串法
FormCreate
V类
VBExplorer、GetVBRes、SmatCheck作为强有力的辅助工具
关键还是找按妞事件
bp rtcMsgBox(断对话框)
E类
有E-Code Explorer作为辅助工具查找按钮事件
ECode法
需要注意的:
1、 时刻不要忘记经典组合
2、 对于有注册错误/正确提示、未注册一启动或者关闭就跳出个注册框或者提示框、未注册一启动或者关闭就打开网页链接、未注册就功能使用限制、未注册就日期限制、未注册标题上有未注册或者试用字样的等等程序,大家就要想到可以通过找到这一类判断,然后转存跟踪!
3、 要警惕使用自带DLL/DLL函数来判断是否注册的程序,如38课
4、 要警惕CrC型的比较追码
5、 要警惕两类IceLicense保护的破解
6、 要警惕使用壳的注册机制的软件的破解,比如:使用了Armadillo、ASProtect注册机制的软件
重启验证
时代在变,技术在发展,可以说,现在80%-90%的软件基本都是重启验证类型的
1、 注册表类型
Bpx RegOpenKeyA(W)
Bpx RegOpenKeyExA(W)
2、 INI文件类型(*.reg/*.ini)
Bpx GetPrivateProfileStringA
3、 其他文件类型(*.dat/*.lic…)
Bpx CreateFileA(W)
Bpx ReadFile
4、 DLL文件操作类型
没有什么有效的拦截函数。不妨,试一下Bpx CreateFileA(W).余下的就是通过你的经验去判断了,例如:35课
注意:建议使用Bpx断点,这样,比较快捷、准确。尚若Bpx失效,再尝试bp
方便断点设置的有以下3个断点插件,APIBreak中国版(不带Point-H),APIBreak英文版(带Point-H)、+BP-Olly,这3个文件我都拷贝给大家,大家放到OD的Plugin目录即可.
其实,大家在课程里面也有看到,在很多程序破解方法里面显示,上面介绍的重启验证的断点效果和那些分类程序语言里面介绍的方法达到的效果基本一样,殊途同归!这就是我们提到的—多思路破解。
用多种思路思考某一个问题有助于提高我们的思维敏捷性和所谓的直觉(第六感)
不脱壳破解的思路
这个也叫SMC/Iniline Patching
对于,压缩壳,只需要在跳转向OEP处Patch即可,需要找到空闲处(不被重定位)
对于,加密壳、需要处理的很多,比如Crc校验,壳的完整性校验,内存校验等
每一种加密壳的Iniline Patching的手段方法各异,大家可以在有基础的时候自行深入研究,我个人开的破解班里面介绍得要多一些。
说明:
大家可能发现了,在这一期破解班里并没有提及算法分析课程,原因如下:
1、 通过对我个人开设的学员的了解(跟他们接触多),他们的代码分析能力还不是很够(他们的基础和能力整体应该高于黑鹰会员),没有代码分析能力,算法分析从何谈起呢。况且,算法分析不是一朝一夕的事情,并不可能通过几节课程来达到目的。但是,追码和爆破是提高代码分析能力的最有效快速的途径,所以,大家,要注重代码分析能力。
2、 算法分析不太好使用语音动画的形式来表述,文章倒是算法分析的最好的方式。
出于以上考量,本期破解班并未开设算法分析课时,这是为大家考量,若开设了,你们看不懂==白搭,还浪费的大家的学习时间和我的教学时间。后期,可能根据黑鹰高层决定,算法分析可能作为专门一期课程。
去nag框的方法
1、 若是Delphi&BCB程序,可以通过FormCreate法查找到FormCreate,再单步跟踪,找到窗口的调用CALL,一般它的具体形式是call dword ptr ds:[edx+E8]
2、 OD载入程序后,单步跟踪,找到窗口的调用CALL
注意看第37课
两个经典方法需要注意的
1、 Point-H法
此法类似下断点bp GetWindowText(A/W),但是,在某些Point-H断不下来的情况下,bp GetWindowText(A/W)却可以断下来。Point-H能够断下来的,bp GetWindowTextA基本上都可以顺利断下。
2、 转存跟踪法
方法很好用,很经典,大家要好好利用
再就是到底是byte/word/Dword断点,一般情况下是byte,其他特殊情况大家临场判断。
后记总结
破解思路方法介绍很多,大家,要灵活运用。灵活的前提是:多练。所以,大家就多找点程序来玩玩吧.
再一次强调几点
1、 我总结的破解里面的几个经典词汇:按钮事件/事件按钮、断得下来/断得正确、代码回嗍/回嗍代码
2、 不要忘记Delphi的经典组合mov eax,ebx(mov eax,ecx/mov al,1);以及会在Delphi或者其他语言程序里面出现的xor eax,eax(or eax,eax).
3、 多逛逛破解论坛,国内推荐(bbs.pediy.com/www.unpack.cn),但是要提醒大家的是:1)善于使用论坛/网站的搜索功能(精确搜索/模糊搜索),这是学习的开始,2)不要对别人要求太多,因为,别人没有义务去帮你,你也没权利要求别人帮你,3)注意提问的方法、态度。
4、 善于使用几种辅助工具
5、 有问题上短训班论坛破解版块提问,多看看置顶帖。
- [hwsoot] 学习 04/26 03:20
- [游客] 能不能把破解版发我啊?谢谢啊.zjjhfhj@qq.com 05/11 17:35
- [parse] 赞一个! 04/17 20:46
- [游客] 能不能把破解版发我啊?谢谢啊,673856545@qq.com 04/17 13:53
- [游客] 能不能把破解版发我啊?谢谢啊,86738484@qq.com 04/06 21:26
- [游客] 解决了 谢谢~~ 02/24 08:56
- [游客] 怎么解决的呢? 02/24 08:54
- [游客] 能把你破解的版本发给我吗,谢谢.306844939@qq.com 01/18 19:34
- [游客] 通过了,谢谢~~~ 12/06 16:38
- [gsyangchao] 非常不错! 10/09 10:43
- [游客] [url=http://www.gddzbq.com]深圳搬家公司[/url] [url=http 03/02 15:10
- [ewer87] 找到了.PHPmyadmin.. 05/24 14:00
- [ewer87] 请问你在8tt,那个数据库是怎么应用的? 是自己上传么? 为什么传不上去? 不懂。我是第 05/24 13:19