汇编网首页登录博客注册
240420643的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏

[2010-05-17 17:36] 黑鹰破解提高班笔记!

这段时间一直在看这个视频教程,前部分是我自己做的笔记,后部分是总结课里的课件,一起贴出来!

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、        有问题上短训班论坛破解版块提问,多看看置顶帖。
评论次数(3)  |  浏览次数(2749)  |  类型(加密与解密) |  收藏此文  | 

[  游客   发表于  2010-10-28 22:08  ]

caicai

[  游客   发表于  2011-06-30 18:03  ]

我以为有什么多大本事呢,就这点水平,难怪我的软件至今无人能破解。

[  rotapple   发表于  2011-08-30 23:08  ]

自己写的还是摘录的?

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码