菜鸟学算法<一>知识准备篇 By:鹭影依凌
菜鸟学算法<一>知识准备篇 By:鹭影依凌菜鸟学算法<一>知识准备篇
刚刚上任,急着给兄弟们一点见面礼,嘿嘿
前言:论坛上有关算法分析的文章不少,也不少精品
但对于刚学CARACK来说,只是叹为观止
原因如下:
1.论坛高手如云,菜鸟也不占少数,有些甚至对汇编指令还不是很熟悉
2.不少算法分析文章分析的是相当完美了,但是作者仅仅展示给的是最终的成果,而没有把分析的思路,分析的过程展示给我们
相信更多的兄弟需要的是一种分析思想,分析理念!
本文(本系列)将对这些问题展开逐一讨论
第一篇:必要基础知识
第二篇:软件注册流程
第三篇:算法分析实例
声明:
1.以下内容都是个人在学习中的一些心得体会,写给新手的,高手飘过
2.文章难免有疏漏之处,欢迎各位兄弟批评指正
3.本文原创于UnPaKcN,如转载,请保持文章完整性
==文章结构==
1.ASCii表(基础)
2.对特殊汇编指令讲解(推荐)
3.定位程序注册代码段
一、ASCII表
◇数 字类:
数字0123456789
十六进制30 31 32 33 34 35 36 37 38 39
十进制48 49 50 51 52 53 54 55 56 57
◇大写字母:
字母ABCDEFGHIJKLMNOPQRSTUVWXYZ
十六进制41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A
十进制65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
◇小写字母:
小写字母abcdefghijklmnopqrstuvwxyz
十六进制61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A
十进制97 98 99 100101102103104105106107108109110111112113114115116117118119120121122
◇特殊字符:
字符 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
十六进制20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 3A 3B 3C 3D 3E 3F 40 5B 5C 5D 5E 5F 60 7B 7C 7D 7E
十进制32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 58 59 60 61 62 63 64 91 92 93 94 95 96123124125126
=>记忆技巧<=
数字:'0'~'9' -> 30~39
大写字母:'A'~'Z' -> 41~5A
小写字母:'a'~'z' -> 61~7A
特别字符:空格' '-> 20
连字符'-'-> 2D
备注:连字符在序列号中经常用到,应熟记
■对字符的ASCII值一定要熟悉,深入分析非密码学算法的关键
很多算法是在字符的ASCII值上"做文章"的
#举个典型的例子
算法描述如下:
->取用户名每个字符的ASCII值,累加以后做为序列号
示例代码
004B32BB|>8B4D F0 /mov ecx, dword ptr ;ASCII "prc2.0ultrain@163.com"
004B32BE|.8A0C01|mov cl, byte ptr ;字符串的第i个字符
004B32C1|.81E1 FF000000 |and ecx, 0FF;取cl
004B32C7|.0FAFC8|imulecx, eax;ECX = ECX * EAX
004B32CA|.03F9|add edi, ecx;EDI = EDI + ECX
004B32CC|.40|inc eax ;EAX++
004B32CD|.4A|dec edx ;EDX--
004B32CE|.^ 75 EB \jnz short 004B32BB;循环length(string)次
■大写小写转化
大写 -> 小写: 加20H
小写 -> 大写: 减20H
■另外,还要对一下知识有一定了解
1.数值的十进制和16进制转化
2.字符直接变数字
3.数字直接变字符
4....
二、汇编指令
1.数据传送(Data transfer)
2.算术运算(Arithmetic)
3.逻辑运算和移位指令(Logic& Shift)
4.串操作(String manipulation)
5.控制转移(Control Transfer)
6.处理器控制(Processor Control)
具体查阅8086系统指令手册
常用指令特别讲解
●指令MOV作用:
1.完成寄存器与寄存器、寄存器与内存之间数据传递
2.完成标志位、密码表等的初始化
其中密码表一般为内存地址
标志位一般为寄存器,少量是内存地址
●关于堆栈的指令
1.压栈
ESP的值要减少
2.出栈
ESP的值要增加
跟踪堆栈的时候,不同的ESP格式的内存地址指向同一内存地址
建议尽量不要在内存地址是ESP格式的情况下锁定跟踪
●目的地址传送指令LEA
作用主要有两个
1.装载有效地址
指令示例:
mov eax, dword ptr ;
lea ebx, dword ptr ;
经过跟踪发现存放的是某字符串
那么EBX保存的是该字符串的地址
2.完成算术运算
lea eax, dword ptr ;
等价于:EAX = EDI + XX;
●算术运算指令
求反:NEC
主要理解其用法:以 0 减之
往往和OR一起结合,完成对字符串长度的取值
乘法MUL
MUL ECX
运算:EAX = EAX * ECX
除法DIV
DIV ECX
运算:EAX = EAX / ECX
EDX = EAX % ECX
●逻辑运算指令
"与"运算&
"或"运算^
"异或"运算|
以上三条指令常用作算法运算
做注册机时候分析起来比较头痛
"测试"test
操作,进行异或运算
特点:
(1).不保存异或结果
(2).常和条件跳转指令结合在一起
测试一般有三个方向
1.对标志位值进行测试
格式如下
test EAX,EAX
je/jne xxxxxxxx
2.对某位进行测试
test EAX,4
je/jne xxxxxxxx
对倒数第三位进行测试
3.进行奇偶测试
test EAX,80000001
je/jne xxxxxxxx
●移位指令
左移->乘
SHLEAX,2
等价于EAX = EAX * (2^2)
右移->除
SHREAX,3
等价于EAX = EAX / (2^3)
三、定位程序注册代码段
1.试注册,判断保护方式
序列号(变相的序列号)
所谓变相的序列号就是程序没有输入注册码的地方,但会以文本文件方式通过读取特定的文件
如keyfile等
这类仍可以归类为序列号保护方式
2.查壳/脱壳
有壳脱之
无壳进行下一步
3.定位程序注册代码段
(1)超级字符串定位
A.有错误提示"invalid regcode!"
B.没有错误提示,但有正确提示"Thank you,..."
C.
(2)通过API断点
A.有对话框
bp MessageBoxA(W)
B.没有对话框
bp GetWindowTextA(W)
bp GetDlgItemTextA(W)
C.重启验证
bp RegCreateKeyA(W)
bp RegDeleteKeyA(W)
bp RegQueryValueA(W)
bp RegCloseKey
bp RegOpenKeyA(W)
(3)其它
对付不同语言的工具选择
DEDE:确定delphi的按钮动作对应的代码
VB:SmartCheck
注意:必须是明码比较的VB程序
4.方法的选择
选择流程如下
字符串->对话框->文本->其它
调试还很依赖经验和运气,暂时无思路的程序可以先放放
有时候可以根据软件注册对话框样式猜出大致用什么思路定位,甚至可以猜到它的加密算法
5.AntiDbg
"高级话题",暂时回避{偶暂时对这方面涉猎太少}o(n_n)o
暂时先告一段落,希望能对论坛的兄弟们有所帮助~~
鹭影依凌 分析算法可以算是最高境界啦。。。
路漫漫其修远兮 吾将上下而求索 貌似很复杂的说,慢慢研究了!
页:
[1]