1.哈希校验怎么用
哈希校验是一款小巧好用的哈希计算器,也是一款md5校验工具。支持文件拖放,速度很快,可以计算文件的 MD5、SHA1、CRC32 的值。
哈希校验在论坛上、软件发布时经常用,是为了保证文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统。每个文件都可以用Hash MD5验证程序算出一个固定的MD5码来。软件作者往往会事先计算出他的程序的MD5码并帖在网上。因此,在网上看到某个程序下载旁注明了 MD5 码时,可以把它记下来,下载了这个程序后用Hash验证程序计算你所下载的文件的MD5码,和你之前记下MD5码比较,就知道你下的是不是原版了,如果两者相同,那么你所下载的是原版。如果计算出来的和网上注明的不匹配,那么你下载的这个文件不完整,或是被别人动过手脚。
使用方法就是:打开哈希校验,把你下载的东西拖进Hash窗口,会自动得出你这个文件的MD5码,如果和你下载的里的那个 MD5码不同就说明被动过手脚,反之则说明是没问题的。
2.怎么运用HASH软件
病毒分析教程 By 孤月冷刀
一.专业病毒分析师对提交的可疑文件进行分析的流程:
1.通过虚拟机模拟可疑文件的运行,检测他的动作。
2.反编译程序,通过汇编语言判断程序的性质
3.病毒分析师需要有熟练的各种分析软件的操作能力,还需要有强的汇编言知识,还需要对windows中程序底层运行方式有一定的了解
二.病毒的行为大致上分为4种:
1.对文件的操作
2.对注册表的的操作3.对进程的操作
4.联网行为
所以,就要有分析这4种行为的工具.
三.具体分析过程
No.1 监视方法分析病毒.
分析过程中用到了大量的工具,这些工具分为专一型的,综合型的.
◆专一型的监视工具:
文件监视:FileMon
注册表监视:RegMon、Regsnap
进程监视:ProcView
网络监视:TcpView
◆ 综合型的监视工具:
SSM:文件、注册表、进程、网络监视
E盾:文件、注册表、进程、网络监视
ProcMonitor:文件、注册表、进程监视
◆ 内核分析、监视工具:
由于病毒大都会用内核方法隐藏自己,所以需要内核分析工具,常用的内核分析工具有下面的:
IceSword
SnipeSword
Gmer
Rootkit unhooker
Wsyscheck
◆ 系统辅助分析工具:
其实有很多杀毒软件附带的工具就是很好的分析工具,举几个软件说下:
Atool
ToolsLoader
360安全卫士
卡卡上网安全助手
金山清理专家
◆ 系统诊断工具:
Sreng扫描报告
360安全卫士诊断工具
卡卡上网安全助手
金山清理专家
No.2反编译、调试方法分析病毒.
这种方法需要有更多的基础知识,需要了解系统内部工作原理和汇编语言.并且工具的运用也需要很多的训练…
※ 查壳工具
Peid
FFI
※ 脱壳工具
FFI
各种壳的专用脱壳工具
※ 反编译工具
W32dasm
C32asm
IDA pro
※ 文件hash校验工具
Hash
HashCalc
※ 动态调试工具
OllyDbg
SoftIce(这个比较难用)
※ 文件编辑工具
UltraEdit
ResScope
ResHacker
3.什么是哈希算法
哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。
计算方法:
用来产生一些数据片段(例如消息或会话项)的哈希值的算法。使用好的哈希算法,在输入数据中所做的更改就可以更改结果哈希值中的所有位;因此,哈希对于检测数据对象(例如消息)中的修改很有用。此外,好的哈希算法使得构造两个相互独立且具有相同哈希的输入不能通过计算方法实现。典型的哈希算法包括 MD2、MD4、MD5 和 SHA-1。哈希算法也称为“哈希函数”。
另请参阅: 基于哈希的消息验证模式 (HMAC), MD2, MD4, MD5,消息摘要, 安全哈希算法 (SHA-1)
MD5一种符合工业标准的单向 128 位哈希方案,由 RSA Data Security, Inc. 开发。 各种“点对点协议(PPP)”供应商都将它用于加密的身份验证。哈希方案是一种以结果唯一并且不能返回到其原始格式的方式来转换数据(如密码)的方法。质询握手身份验证协议(CHAP) 使用质询响应并在响应时使用单向 MD5哈希法。按照此方式,您无须通过网络发送密码就可以向服务器证明您知道密码。
质询握手身份验证协议(CHAP)“点对点协议(PPP)”连接的一种质询响应验证协议,在 RFC 1994 中有所描述。 该协议使用业界标准 MD5哈希算法来哈希质询串(由身份验证服务器所发布)和响应中的用户密码的组合。
点对点协议
用点对点链接来传送多协议数据报的行业标准协议套件。RFC 1661 中有关于 PPP 的文档。
另请参阅: 压缩控制协议 (CCP),远程访问,征求意见文档 (RFC),传输控制协议/Internet 协议 (TCP/IP),自主隧道。
4.哈希函数怎么用pascal
暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但。
也只能如此了。 最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通过某种算法,可以把一个字符串"压缩" 成一个整数,这个数称为Hash,当然,无论如何,一个32位整数是无法对应回一个字符串的,但在程序中,两个字符串计算出的Hash值相等的可能非常小,下面看看在MPQ中的Hash算法 unsigned long HashString(char *lpszFileName, unsigned long dwHashType) { unsigned char *key = (unsigned char *)lpszFileName; unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE; int ch; while(*key != 0) { ch = toupper(*key ); seed1 = cryptTable[(dwHashType < < 8) ch] ^ (seed1 seed2); seed2 = ch seed1 seed2 (seed2 < < 5) 3; } return seed1; } Blizzard的这个算法是非常高效的,被称为"One-Way Hash",举个例子,字符串"unitneutralacritter.grp"通过这个算法得到的结果是0xA26067F3。
是不是把第一个算法改进一下,改成逐个比较字符串的Hash值就可以了呢,答案是,远远不够,要想得到最快的算法,就不能进行逐个的比较,通常是构造一个哈希表(Hash Table)来解决问题,哈希表是一个大数组,这个数组的容量根据程序的要求来定义,例如1024,每一个Hash值通过取模运算 (mod)对应到数组中的一个位置,这样,只要比较这个字符串的哈希值对应的位置又没有被占用,就可以得到最后的结果了,想想这是什么速度?是的,是最快的O(1),现在仔细看看这个算法吧 int GetHashTablePos(char *lpszString, SOMESTRUCTURE *lpTable, int nTableSize) { int nHash = HashString(lpszString), nHashPos = nHash % nTableSize; if (lpTable[nHashPos].bExists && !strcmp(lpTable[nHashPos].pString, lpszString)) return nHashPos; else return -1; //Error value } 看到此,我想大家都在想一个很严重的问题:"假如两个字符串在哈希表中对应的位置相同怎么办?",究竟一个数组容量是有限的,这种可能性很大。解决该问题的方法很多,我首先想到的就是用"链表",感谢大学里学的数据结构教会了这个百试百灵的法宝,我碰到的很多算法都可以转化成链表来解决,只要在哈希表的每个入口挂一个链表,保存所有对应的字符串就OK了。
事情到此似乎有了完美的结局,假如是把问题独自交给我解决,此时我可能就要开始定义数据结构然后写代码了。然而Blizzard的程序员使用的方法则是更精妙的方法。
基本原理就是:他们在哈希表中不是用一个哈希值而是用三个哈希值来校验字符串。 中国有句古话"再一再二不能再三再四",看来Blizzard也深得此话的精髓,假如说两个不同的字符串经过一个哈希算法得到的入口点一致有可能,但用三个不同的哈希算法算出的入口点都一致,那几乎可以肯定是不可能的事了,这个几率是1:18889465931478580854784,大概是10的 22.3次方分之一,对一个游戏程序来说足够安全了。
现在再回到数据结构上,Blizzard使用的哈希表没有使用链表,而采用"顺延"的方式来解决问题,看看这个算法: int GetHashTablePos(char *lpszString, MPQHASHTABLE *lpTable, int nTableSize) { const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2; int nHash = HashString(lpszString, HASH_OFFSET); int nHashA = HashString(lpszString, HASH_A); int nHashB = HashString(lpszString, HASH_B); int nHashStart = nHash % nTableSize, nHashPos = nHashStart; while (lpTable[nHashPos].bExists) { if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB) return nHashPos; else nHashPos = (nHashPos 1) % nTableSize; if (nHashPos == nHashStart) break; } return -1; //Error value } 1. 计算出字符串的三个哈希值(一个用来确定位置,另外两个用来校验) 2. 察看哈希表中的这个位置 3. 哈希表中这个位置为空吗?假如为空,则肯定该字符串不存在,返回 4. 假如存在,则检查其他两个哈希值是否也匹配,假如匹配,则表示找到了该字符串,返回 5. 移到下一个位置,假如已经越界,则表示没有找到,返回 6. 看看是不是又回到了原来的位置,假如是,则返回没找到 7. 回到3 怎么样,很简单的算法吧,但确实是天才的idea, 其实最优秀的算法往往是简单有效的算法。