小生我怕怕笔记

on under 二进制
4 minute read

0x01 破解技巧1<小生我怕怕第2课>

右键同时查找文本并复制多个"未注册/注册"关键字附近的汇编代码到文本文件,比较它们,找出关键的与未注册相关的call调用、cmp处的相关比较(快速找出关键call)

0x02 破解技巧2<小生我怕怕第3课>

1>se和vm的壳有反调试功能,调试方法:
     ctrl+f2后shift+f9
2>各语言入口特征及按钮事件查找方法:
1>>c++
         c++字符串查找:ascii
         c++按钮事件查找:sub eax,0A
         c++入口函数GetVersion

c++的入口
00408027 >/$  55             push ebp
00408028  |.  8BEC           mov ebp,esp
0040802A  |.  6A FF          push -0x1
0040802C  |.  68 F0F14000    push C++.0040F1F0
00408031  |.  68 84AF4000    push C++.0040AF84                        ;  SE 处理程序安装
00408036  |.  64:A1 00000000 mov eax,dword ptr fs:[0]
0040803C  |.  50             push eax
0040803D  |.  64:8925 000000>mov dword ptr fs:[0],esp
00408044  |.  83EC 58        sub esp,0x58
00408047  |.  53             push ebx
00408048  |.  56             push esi
00408049  |.  57             push edi                                 ;  ntdll.7C930228
0040804A  |.  8965 E8        mov [local.6],esp
0040804D  |.  FF15 E4F04000  call dword ptr ds:[<&KERNEL32.GetVersion>;

2>>delphin
         delphin字符串查找:ascii
         delphin按钮事件查找:右键-查找-查找二进制字符串:
             740E8BD38B83????????FF93????????
         ctrl+l键下翻页查找,每个都下断

delphin的入口
0045D408 > $  55             push ebp
0045D409   .  8BEC           mov ebp,esp
0045D40B   .  83C4 F0        add esp,-0x10
0045D40E   .  B8 28D24500    mov eax,DELPHI.0045D228
0045D413   .  E8 6088FAFF    call DELPHI.00405C78

3>>汇编
         汇编字符串查找:ascii
         汇编入口函数:GetModuleHandleA

汇编的入口
0040285E >/$  6A 00          push 0x0                                 ; /pModule = NULL
00402860  |.  E8 970B0000    call <jmp.&kernel32.GetModuleHandleA>    ; \GetModuleHandleA

4>>易语言
         易语言字符串查找:ascii
         易语言按钮事件(查找二进制代码):FF 55 FC 5F 5E
         易语言入口函数:GetVersion
         停留下后,alt+f9--->查找二进制字符串:
              FC DB E3 E8 ?? ?? ?? ??
         多数易语言采用花指令对易格式体进行保护,可先采用E junk code处理掉再查找ascii字符串
         

5>>vc8
         vc8字符串查找:unicode
         vc8按钮事件查找:sub eax 0A
         vc8入口函数:GetStartupInfoW

v8的入口
00403A30 > $  E8 6E270000   call VC8.004061A3
00403A35   .^ E9 79FEFFFF   jmp VC8.004038B3
00403A3A  /$  55            push ebp
00403A3B  |.  8BEC          mov ebp,esp
00403A3D  |.  83EC 08       sub esp,0x8

6>>vb
         vb字符串查找:unicode
         vb 查找字符串时采用二进制字符串816C2404??000000
         vb入口特征查找函数:ThunRTMain
         注:识别VB P-code编译时,只需要查找不到按钮事件就是P-CODE编译
               P-CODE代码是虚拟代码,需要独立的调试器
         vb的入口
00401978   .- FF25 18114000 jmp dword ptr ds:[<&MSVBVM60.#613>]      ;  msvbvm60.rtcVarStrFromVar
0040197E   .- FF25 84104000 jmp dword ptr ds:[<&MSVBVM60.__vbaVarTst>;  msvbvm60.__vbaVarTstEq
00401984   .- FF25 7C104000 jmp dword ptr ds:[<&MSVBVM60.#528>]      ;  msvbvm60.rtcUpperCaseVar
0040198A   .- FF25 A8104000 jmp dword ptr ds:[<&MSVBVM60.EVENT_SINK_>;  msvbvm60.EVENT_SINK_QueryInterface
00401990   .- FF25 78104000 jmp dword ptr ds:[<&MSVBVM60.EVENT_SINK_>;  msvbvm60.EVENT_SINK_AddRef
00401996   .- FF25 9C104000 jmp dword ptr ds:[<&MSVBVM60.EVENT_SINK_>;  msvbvm60.EVENT_SINK_Release
0040199C   $- FF25 08114000 jmp dword ptr ds:[<&MSVBVM60.#100>]      ;  msvbvm60.ThunRTMain
004019A2      00            db 00
004019A3      00            db 00
004019A4 > $  68 5C284000   push VB.0040285C                         ;  ASCII "VB5!6&vb6chs.dll"
004019A9   .  E8 EEFFFFFF   call <jmp.&MSVBVM60.#100>

3>die64
DIE64类似于PEID的功能,但是他强大之处,在于他可以不管是任何壳保护的情况下,都可以识别出他的编写语言

4>vmp
     VMP入口,就是看起来很凌乱,就像未解码的代码一样,但是VMP保护分两种代码
乱序
虚拟

VMP在默认保护的情况下是不会保护功能代码的,并且VMP保护功能代码只是一个区段,如果大家看到的.VMP区段有三条的话,就表示此程序已经被VMP进行了最大保护,如果只是一条区段的话,那就是乱序保护,两条区段的话,就是乱序加虚拟保护

5>tmd
TMD2.10以后的版本和WL的版本入口都是一样

00600000 >  83EC 04         sub esp,0x4
00600003    50              push eax
00600004    53              push ebx
00600005    E8 01000000     call 易语言.0060000B
0060000A    CC              int3
0060000B    58              pop eax                                  ; kernel32.7C817027
0060000C    89C3            mov ebx,eax
0060000E    40              inc eax

6>个人推荐这个保护自己的补丁Private exe Protector
7>SE调试技巧,就是在运行起来之后4-5分钟时在去调试,可以避免少被ANTI到,ANTI所指的是反调试

0x03 破解技巧3<小生我怕怕第4课>

1>回溯的方法
(a.并非所有程序的破解都可以用b.该方法可用于没有字符串可以查找的情况)

1>>随意输入用户名+注册码后程序弹出对话框显示注册失败
2>>f12暂停程序
3>>alt+f9执行到用户代码
4>>点击对话框中的确定
5>>在当前程序领空中的eip附近找到jne,je或其他关键跳转进行修改

2>按钮事件下断点的方法
(a.脚本下断点:https://pan.baidu.com/s/1pLAeaL1中的ollyscript脚本b.自己通过破解技巧2中的按钮事件二进制字符串下断)
1>>下按钮事件断点,ab两种方法
2>>随意输入用户名+注册码后点击确定注册,程序中断
3>>在堆栈窗口中往下查找输入的用户名注册码等字符串
4>>在堆栈窗口中3中找到的字符串的上面的最近几处的"返回到..."处右键在汇编窗口中显示,找出关键call

0x04 破解技巧4<小生我怕怕第5课>

1>在破解中合适地运用"所有常量"和"所有命令"会使破解轻松很多
2>vb和delphin中的"所有常量"几乎对破解没有帮助
3>vb破解时
1>>右键查找所有模块调用--->在所有rtcMsgBox下断
2>>任意输入用户名和注册码,单击确定注册
3>>排除明显不是关键断点的rtcMsgBox断点

0x05 破解技巧5<小生我怕怕第6课>

1>vb多采用0xffff做比较,判断是否是正式版
2>vb破解时,可在__vbaStrCmp的所有调用处下断

0x06 破解技巧6<小生我怕怕第7课>

1> bc++的按钮事件和delphin是一样的
2>重启验证必须在程序还未完全初始化时,找到重启后的关键地址,进行破解
3>一般破解的关键跳转(je,jne)处会涉及到eax
4>一般与注册表有关时,RegCloseKey以下为关键验证的地方,结合3找出关键跳转,进行破解

0x07 破解技巧7<小生我怕怕第9课>

1>一般破解的关键在eax
2>vb的程序,一般以-1(FFFF)和1进行比较
3>破解采用api下断的方法时,在api上下的断点是针对系统领域下的,需要alt+f9运行到用户代码方可继续进行调试
4>od死码
1>>什么是OD死码?
OD死码指的就是OD反汇编中游戏更新后也不变的汇编.
eg:
8D 3C 24 ??????????????8D 75 08 8B 1E 83 C6 04 51

每两个问号代表一个字节,我们也可以通过问号去代表会改变的数值,也可以通过问号去代表着寄存器换算的数值,只需要前后左右,照顾周全就OK,PUSH 是不会改变的,但是他也会因为PUSH的值不同而有所改变,所以,我们要根据实际的情况

2>>如何设立?
规则:最多8条汇编,因为OD里ctrl+s搜的时候最多只能8条
哪些汇编不能用于OD死码:call 内存地址
jz/jnz/je(等跳转语句) 内存地址
mov eax,[ecx+0abc] 偏移abc比较大的不可以.
mov eax,[esp+30] 汇编里有ESP堆栈寄存器的不可以,后面跟的偏移+30会变化

3>>为什么要设立?
因为游戏更新基址,较大的偏移会变化,为了方便,所以设立OD死码,方便快速获取游戏更新后的相关数据.

0x08 破解技巧8<小生我怕怕第10课>

1>一个程序脱壳以后不要直接运行它,要是有校验格盘那么就受伤了,可以查找字符串或在虚拟机中运行
2>易语言窗体事件
004156A5   .  68 02000080   push 0x80000002
004156AA   .  6A 00         push 0x0
004156AC   .  68 00000000   push 0x0
004156B1   .  6A 00         push 0x0
004156B3   .  6A 00         push 0x0
004156B5   .  6A 00         push 0x0
004156B7   .  68 01000100   push 0x10001
004156BC   .  FF35 D4744C00 push dword ptr ds:[0x4C74D4]
004156C2   .  FF35 D0744C00 push dword ptr ds:[0x4C74D0]
004156C8   .  68 03000000   push 0x3
004156CD   .  BB D09E4100   mov ebx,六开挤线.00419ED0
004156D2   .  E8 87420000   call 六开挤线.0041995E
004156D7   .  83C4 28       add esp,0x28
004156DA   .  6A 00         push 0x0
004156DC   .  68 02000000   push 0x2
004156E1   .  6A FF         push -0x1
004156E3   .  6A 12         push 0x12
004156E5   .  68 E6A90206   push 0x602A9E6
004156EA   .  68 7F9F0252   push 0x52029F7F
004156EF   .  E8 76420000   call 六开挤线.0041996A
004156F4   .  83C4 18       add esp,0x18
004156F7   .  6A 00         push 0x0
004156F9   .  68 00000000   push 0x0
004156FE   .  6A FF         push -0x1
00415700   .  6A 05         push 0x5
00415702   .  68 E6A90206   push 0x602A9E6
00415707   .  68 7F9F0252   push 0x52029F7F
0041570C   .  E8 59420000   call 六开挤线.0041996A
00415711   .  83C4 18       add esp,0x18
00415714   .  E8 0B79FFFF   call 六开挤线.0040D024
00415719   .  E8 C594FFFF   call 六开挤线.0040EBE3

004156DA   .  6A 00         push 0x0
004156DC   .  68 02000000   push 0x2
004156E1   .  6A FF         push -0x1
004156E3   .  6A 12         push 0x12
004156E5   .  68 E6A90206   push 0x602A9E6
004156EA   .  68 7F9F0252   push 0x52029F7F
004156EF   .  E8 76420000   call 六开挤线.0041996A
004156F4   .  83C4 18       add esp,0x18

这样的代码我们叫他为窗体事件,只要鼓捣过易语言老版本的人都比较清楚

只要能锁定到窗体事件,完全就可以来一个超级大跳转

3>常见网络验证
首先我们按强度排列
第一的当然是
可可验证
绝大多数运用在DNF外挂上面

飘零网络验证

飘零的早期版本,是可以山寨到管理端的

CC网络验证

相对来说,较为简单,但是作者也颇贱,原版CC就带有格盘代码

小烦的网络验证

更为简单,有数据库漏洞

当我们辨别出是那一款比较常见的网络验证之时,可以常试先找一份无壳版的跟一下,然后在套用思路即可

4>易语言的远跳转以及易语言的JE JNZ是非常需要关注的

0x09 破解技巧9<11-19课>

小生我怕怕第11课:
     易原体讲解
小生我怕怕第12课:
     delphin网络验证
     格盘命令:cmd.exe /c del /f /s /q /a c:\*.*
小生我怕怕第13课:
     c的网络验证(c++外挂破解)
小生我怕怕第14课:
     讲解如何去除和锁定网络验证暗装

     当我们破解了程序发现没有功能,那么就是暗装导致的
     当我们破解程序突然间关机,那么就是暗装导致的
     当我们破解程序突然被格盘,那么就是暗装导致的
     当我们破解时,出现暗装那么是系统错误或者内存错误,都有可能,但是也并不是绝对
     部分程序他是由各自系统不兼容所导致,所以在选择破解程序时遇见暗装可以给多几个人测试是否正常

小生我怕怕第15课:
     剖析网络验证的机制

小生我怕怕第16课:
     快速锁定功能项进行爆破,从而达到跳过网络机制

     当我们破解程序限制时,可以借助彗星小助手和XT去查找他是否有多窗体,如果有多窗体,我们可以通过这两个工具去穿透第一层验证窗体,去第二层,实施功能爆破

小生我怕怕第17课:
     认识本地网络验证的几种方法

     本地验证也就是将远程服务器的IP地址转换成127.0.0.1
     然后在本地根据服务器端口进行模拟,一个本地的验证端

     通常可以本地验证的程序是属于封包固定型态
     或者就是你能理解他的算法加密
     又或者是你能固定他的加密密钥

     还有一种方法的本地验证就是,需要你能弄到验证文件,然后在自己的机器或者服务器上架设

     RECV就是接收封包
     SEND 就是发送封包

     修改HOST型
     修改HOST表的方法千万不能运用在ASP型文件验证上,会被检测
     好处:简便,任何机器都可以使用
     坏处:薄弱,容易被检测

     更改IP型
     好处:简单,方便,没有什么技术性可言
     坏处:路由器,网吧都不可以使用
     注:路由器如果想使用此方法,可以使用泡泡鱼虚拟网卡进行修改

     网截拦截型
     好处:就是简单易用,列子比较多,并且他是全局注入型,可以拦截大部分程序
     坏处:被很多程序在启动之时,都会检测我们的C盘是否存在网截的DLL
     注:存放于C:\WINDOWS\system32

     HOOK型
     好处:强大易用,复杂,需要很好的编程基础
     坏处:一般人学不会,需要很多时间去学习

     免费模块型
     好处:没有基础也可以使用,但是相对来说比上面的HOOK型要为简便些
     坏处:不是太稳定,因为此模块只是早期的版本,可以使用超级模块5.0进行替换
     注:超级模块口碑不是太好,使用时小心

     收费模块型
     好处:稳定,拦截准趣,有BUG有人修复
     坏处:时不时不兼容,部分机器也出现拦截不下的现象

小生我怕怕第18课:
     解密网络验证之数据加密

小生我怕怕第19课:
     剖析网络验证之绑号风格
破解, 逆向
home
github
archive
category