X86逆向之:提取按钮特征码

Posted lyshark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X86逆向之:提取按钮特征码相关的知识,希望对你有一定的参考价值。

特征码的用途非常的广泛,比如最常见的杀毒软件,就是使用了特征码定位技术来实现比对查杀的,提取特征码的目的就是为了快速定位到软件中的核心代码处,网上也有很多公开的特征码,我这里收集了一些比较有用的,如下所示:

--------------------------------------------------------------
常用按钮特征:
VB语言:81 6C 24
易语言:FF 55 FC 5F 5E或(e-debug)
万能断点:F3A58BC883E103F3A4E8
Delphi:740E8BD38B83????????FF93????????
MFC:sub eax,0a
VC++6.0:sub eax,0a

--------------------------------------------------------------
飘零云:
55 8B EC 81 EC 84 00 00 00 C7 45 FC 00 00 00 00 C7 45 F8 00 00 00 00 C7 45 F4 00 00 00 00 C7 45
F0 00 00 00 00 C7 45 EC 00 00 00 00 C7 45 E8 00 00 00 00
--------------------------------------------------------------
蓝屏防御特征码:
55 8B EC 81 EC 14 00 00 00 68 0C 00 00 00
--------------------------------------------------------------
蓝屏保护特征码:
55 8B EC BB 06 00 00 00
--------------------------------------------------------------
蓝屏特征码(断首retn)

飘零金盾1.5
55 8B EC BB 06 00 00 00

飘零金盾2.0
55 8B EC EB 10 56 4D 50 72 6F 74 65 63 74 20 62 65 67 69 6E 00 BB 06 00 00 00

飘零一般无VM通用
0F 84 ?? ?? ?? ?? E8 ?? ?? ?? ?? EB ??

飘零3.0
55 8B EC EB 10 56 4D 50 72 6F 74 65 63 74 20 62 65 67 69 6E 00 BB 06 00 00 00
--------------------------------------------------------------
飘零商业版3.5(爆破特征码,先搜到期时间,retn,再搜特征码 mov eax,1 retn)
无VM 
55 8B EC 81 EC 18 00 00 00 C7 45 FC 00 00 00 00 C7 45 F8 00 00 00 00 C7 45 F4 00 00 00 00
有VM 
B8 01 00 00 00 55 8B EC 83 EC 18 C7 45 FC 00 00 00 00 C7 45 F8 00 00 00 00 C7 45 F4 00 00 00 00
-------------------------------------------------------------
雷音(NOP)
75D2
-------------------------------------------------------------
飘零2.8(断首修改 mov eax,1 retn)

push ebp
mov ebp,esp
sub esp,0x38
mov dword ptr ss:[ebp-0x4],0x0
mov dword ptr ss:[ebp-0x8],0x0
mov dword ptr ss:[ebp-0xC],0x0
mov dword ptr ss:[ebp-0x10],0x0
------------------------------------------------------------
可可V8(断首修改 mov eax,0 retn)

ks_CheckKeyE: 55 8B EC 81 EC CC 00 00 00 C7 45 FC 00 00 00 00 68 0C 00 00 00
取签名数据: 55 8B EC 81 EC 10 00 00 00 68 08 00 00 00
可可V9(断首修改 mov eax,64 retn)
ks_CheckKeyE: 55 8B EC 81 EC 10 00 00 00 68 08 00 00 00
取签名数据: 75 FB FF E6 55 8B EC 88 00 00 00
退出验证: 55 8B EC 8B 45 08 50
---------------------------------------------------------
558BEC81ECCC000000C745FC00000000680C000000 第一段登入验证
558BEC81EC100000006808000000 第二段登入验证

再比如CF游戏中的数据的定位特征:

HOOK_游戏代码 8B 00 8B 08 8B 91 A8 00 00 00 地址-15 4E5E95
4E5EA

44E5E95
DIRECT 从733E00开始搜 6B 00 94 51 6C 地址+22 F3930CC
玩家数组 同版本的人物基址减去同版本的玩家数组,找到汇编代码的FPS地址使用FPS-36
数组大小 89 54 24 28 8B 54 24 70 89 54 24 34 88 44 24 10 下面的imul eax,eax,00000数组大小 4A8 本人ID 找到OBJECT,往下movzx eax,byte ptr [esi+就是本人ID] FOV 没开镜1070141403 第壹次开镜1055246586 第二次开镜1040583314必须使用AWM 一个静态的就是 模式基址 进入终结者搜2 爆破0 是否为生化 8B 54 24 10 8B 40 48 6A 01 6A 00 6A 00 52 FF D0地址+12 下面 cmp dword ptr {esi+偏移} dx_pos 00 00 00 00 00 00 00 00 00 ?? 00 00 00 ?? 00 00 CD CC CC 3D 本人偏移 55 83 C0 FF 83 F8 37 往上mov ecx,[eax+本人偏移] BFE7630 鼠标Y偏移 D8 C9 D9 C0 D9 E0 下面fld dword ptr [esi+偏移] 鼠标Y偏移_j 50 57 53 D8 86 下面fld dword ptr {esi+偏移} 枪击Y偏移 81 EC CC 00 00 00 56 8B F1 下面test byte ptr [esi+00000偏移],20 枪击Y偏移_j 8B 84 24 80 00 00 00 8D 94 5B FE 0D 00 00 D9 44 95 00 8B 16 上面fld dword ptr [esi+00000偏移] OBJECT D9 44 24 2C D9 44 24 14 D9 C0 DE CA D9 C9 上面 mov esi,{eax+edi+基址} w_hook 汇编=lea ecx,[ebp-000001C8] 整数数值=4265119117 或8D 8D 38 FE FF FF E8 80 FE 06 00 0F B6 D0 85 D2 IsVisible_ecx 从006开始搜 55 8B EC 8B 45 0C 50 8B 4D 08 51 fld dword ptr [esi+00000偏移] IsVisible_call 从005A开始搜 55 8B EC 51 89 4D FC 8B 45 FC 83 C0 10 50 8B 4D 0C 51 8B 55 08 52 无后基址 [1] lea eax,[ebp+00000370]地址+2 或 8B 55 00 8B 82 CC 02 00 00 8B CD 地址-52 无后基址 [2] lea eax,[edi+0000036C]地址+2 或 8D 87 6C 03 00 00 6A 04 D9 18 地址+2 弹道X_Y基址 [1] fld dword ptr [ebx+00000364]地址+2 D8 44 24 28 8B 11 8B 52 20 83 EC 0C D9 5C 24 38 地址+6 弹道X_Y基址 [2] 8B 52 20 83 EC 0C D9 5C 24 38 8D 44 24 4C D9 83 地址-16 就在这俩附近 武器判断基址 主武器搜0 副武器搜1 近身搜2 雷搜3 模式判断基址 人机运输搜180 人机新沙漠-1搜181 人机马厩搜182 人物是否为观战 观战搜1,否则0 是否枪王基址 进入枪王爆破模式搜2 普通爆破搜0 静态就是 传说的不代码子弹穿墙 搜 8B D0 83 C4 04 85 D2 89 54 24 28 找到 cmp dword ptr [edx+00000570],00 写结尾改01 遁地,站着搜:43 00 00 60 42 64 00 00 00 00 00 00 00 00 00 00 普通子弹穿墙:搜索8字 8389772107935907840 无视闪光和烟雾 都是中了搜1 没中搜0 不掉血基址 搜新手地图名 tutorial_D 无后坐力 拿M16进游戏搜搜索1025758992 写-1 射出等于无后+8

但是单单这些还是远远不够的,因为编译器在不断的更新,接下来我将以易语言为重点,提取其按钮的特征码,这样你就可以将此方法应用到其他任何一种编译型语言中去。

在学习前,你需要准备好,练习程序和调试器

OD软件: https://www.cr173.com/soft/32097.html
练习程序:https://files-cdn.cnblogs.com/files/LyShark/练习提取特征码.zip

开始正题

 

1.打开练习小程序,将会看到下面的窗体,点击按钮1将会弹出一个窗口,提示第一个按钮被电击,我们将这段提示记下来,最终实现的效果是,提取通用特征码,然后定位到其他的按钮事件中去。

技术图片

 

2.打开OD将上面的软件拖入后,会看到下面的汇编代码,默认情况下会停留在程序OEP的位置,易语言使用了VC6.0的链接器,所以看汇编代码的话,会感觉就是VC6的杰作。

 技术图片

 

3.直接在反汇编窗口,点击右键,搜索,智能搜索字符串,填入刚才的信息框提示内容,搜索。

技术图片

 

4.按下 ctrl + F 直接搜索弹窗的提示内容就好。直接双击第一个按钮被点击

技术图片

 

5.到达按钮被点击的按钮事件中去。点击push那条指令,按下F2在断首下断点,push的一般为断首。

如果此处没有出现左边的白条,你可以按下ctrl + a 让OD自动分析代码!

技术图片

 

6.点击上方的运行按钮,让程序跑起来,此时并没有断下,那是因为我们没有触发按钮事件

技术图片

 

7.回到练习窗口,点击一下按钮1,触发事件,OD会自动断下

技术图片

 

8.此时我们在按钮事件位置断下了,显然我们已经进入到了按钮事件中去了,我们需要找到上一层调用他的位置。

由于,调用call指令会将当前指令的吓一条指令的地址压入堆栈存储,所以我们就直接观察堆栈中的参数就能够定位到按钮事件的上一层代码的位置了。

技术图片

堆栈中的地址为:00416EE0 这个位置,我们记下来,并且回到OD,直接ctrl+G搜索这个地址。技术图片

可以看到,上面的这个CALL [local.1]就是按钮的触发call,我们接着就可以提取这段特征码了。

技术图片

上面红框处的位置,就是提取到的特征码了,FF 55 FC 5F 5E

 

9.此时已经完工了。我们接着让程序先跑起来,按下F9 ,程序正常弹出窗口。

技术图片

 

10.在OD窗口中,按下Ctrl + G 输入 00401000 跳转到程序的开头位置。

技术图片

 

然后按下 Ctrl + B 按钮,输入提取到的特征码。

技术图片

 

11.跳转到了CALL的位置,直接在CALL处下断。

技术图片

 

12.回到练习程序,点击最后一个按钮,看下是否能断下。

技术图片

成功断下,你可以F7进入这个按钮事件中去了,教程结束。

总结:学会了这一个小技能,对与软件的破解大有帮助,虽然简单,但很实用

思路:比如,你需要破解一个大型程序,你毫无头绪,无法定位按钮的事件,此时你可以先查看该程序使用什么语言编译的 查看工具有DIE64等,然后手动写一个程序,放上一个按钮,加上一些容易搜索到的字符串,然后提取通杀特征,最后应用到那个需要破解的程序中去。

以上是关于X86逆向之:提取按钮特征码的主要内容,如果未能解决你的问题,请参考以下文章

病毒木马查杀实战第019篇:病毒特征码查杀之编程实现

图片识别之验证码识别

图片识别之验证码识别

python skimage库HOG特征提取原码解读

病毒特征码

基于特征码文件恢复工具magicrescue