千里冰封 发表于 2016-12-19 13:12

汇编小知识之【特征码】

本帖最后由 千里冰封 于 2016-12-25 22:45 编辑

有矛就有盾,逆向不费劲。【吾爱汇编论坛】{:5_121:}

首先,我们知道计算机都是二进制的电子计算机。二进制就是说我们计算机的大脑(CPU)只认识0和1这两个数字,其他的东西它通通不认识,不管是2345这些数字,还是我们在电脑手机里看到的图片视频软件,他们最终都会被转化成一堆一堆的0101,这一个0或者一个1就叫一个比特位(bit),八比特位组成一个字节(byte 或者 B)。
换算单位如下:
1B   =   8bit
1K   =1024B
1M=1024K
。。。。。。。。。。。。
比如,一张100KB的图片就是10万多个字节=80万多个比特位,也就是说在计算机的眼里,这张100KB的图片就是80万多个0101组成的一串东西。
直接打0110计算机看看得是爽,但是人看得不爽啊,人要编写一段程序就要不停的写一大串0101,这太难写太难读而且太容易出错了,随便哪个地方把0写成了1都会出问题,于是人类就要想办法偷懒了,人们就把在编程中会用到的这些固定的0101串,用一些简单的英文字母来表示。比如“1000100111011000” 就按照约定被替换成了“mov ax,bx ”,执行程序的时候另外再让用另外一个程序把这些字母按规则重新变成0101,这个程序就叫编译器,因为后面的语言被叫汇编语言,所以这种程序就被称为汇编编译器。{:5_117:}



为什么这里的汇编语言要用英文写呢?


当汇编语言的思想流行起来后,大家就一致决得必须抛弃0101这种折磨死人不偿命的机器代码了,然后生产处理器(CPU)的厂家就直接把各种操作 处理器(CPU) 的指令用汇编语言表示了,这样你就可以直接使用这些汇编语言写成的指令去直接控制处理器。因为因特尔是处理器领域的王者,你要使用英特尔的处理器就必须使用它规定的那些汇编指令,英特尔是美国的公司,因此他用英文编写这些指令就非常正常了。所以,汇编这一层用什么语言主要看生产处理器(CPU)的公司用啥语言。{:6_210:}




时代继续往前走,人们继续越来越懒。虽然汇编语言看起来比0101这种东西舒服多了,但是它仅仅是把0101这种东西一个字一个字对应的翻译过来了,但是它的思维依然是机器的思维,不符合人类自己的思维习惯。于是人们要继续开发更加符合人类自己思维的语言,毕竟写程序的是人不是机器,用符合自己思维的语言去写程序肯定更加轻松。于是在汇编语言之后又出现了一大堆更加高级的编程语言,我们就以其中大名鼎鼎的C语言为例。



C语言是怎么工作的呢,你随便发明一种新的语言这计算机的处理器认得么?C语言它当然不认得,但是你不是认得汇编指令么,那么我用C语言写好一个程序之后再利用一个软件将C语言翻译成汇编语言让你执行不就是了。实际上它也是这么干的,这个把C语言翻译成汇编语言的东西就叫编译器。


所以问题的核心其实在编译器上,只要你高兴,你完全可以随意定义一套编程语言,定义一套语法,但是你要是想让你发明的新语言能够正常工作,你必须给他弄一个配套的编译器出来,用这个编译器把你发明的语言翻译成汇编语言。《编译原理》,就是专门教你怎么去开发编译器的。


除了汇编语言要和生产处理器(CPU)的厂家绑定以外,其他的高级语言都是很自由的,而我们现在的主流编程语言也都是这些高级编程语言,直接使用汇编语言的已经非常少了。


上面的分析,来自网络,不是我写的。{:6_209:}




接下来进入主题:


通过上面的分析,我们知道,高级语言写的程序,要通过---编译器---翻译成汇编语言,然后把汇编语言通过---汇编编译器---翻译成机器代码,让电脑去执行。

汇编代码和机器代码是一 一对应的,那么,如果高级语言代码翻译成的汇编代码也是一 一对应的,是不是说我们只要知道了相应的机器代码或者汇编代码,就可以确定某个高级语言代码呢?
比如:我们知道了易语言的单击按钮的机器代码是 FF 55 FC 5F 5E,我们就可以在所有这些代码上下断点,就必然可以响应所有的易语言按钮单击事件。
据我理解,所谓 的某个高级语言的特征码,也就是某段高级语言翻译成汇编代码后,对应的,固定格式的 机器代码或者汇编代码(因为汇编代码和机器代码一 一对应)。
我所说的固定格式,是指 {:5_118:}想表达不知道用啥词了,还是举例子说吧。

比如:易语言的编辑框, 编辑框1.内容=“ 吾爱汇编论坛” 编辑框2.内容=“千里冰封”,这2个编辑框的共同点,就是我所说的固定格式,也就是我所理解的特征码。 不同的地方,我们可以用“?”去表示。比如:我随便乱写一个E8 52 46 13 00 和 E8 42 12 35 60 我们的特征码可以写成
E8 ?? ?? ?? ??   .我只是举例啊,胡乱写的代码。{:5_187:}


所以我们可以多找一些特征码,然后再去逆向的时候,就可以直接去定位了。(前提是无壳)
怎么去找呢?我的思路是:可以自己写点代码,然后通过对比,去发现。


接下来就是汇总特征码的环节:

易语言特征码:
易语言体【非常重要】
FF25

机器码汇编码
信息框特征码55 push ebp
8BEC      mov ebp,esp
BB 06000000mov ebx,0x6
E8 ????????   call ????????
68 01030080push 0x80000301
6A 00   push 0x0
68 00000000 push 0x0
68 04000080 push 0x80000004
6A 00   push 0x0
68 ????????push ????????   
68 04000000push 0x4
BB ????????mov ebx,????????
E8 ????????call ????????
83C4 34add esp,0x34
8BE5 mov esp,ebp
5D pop ebp

static/image/hrline/1.gif


机器码汇编吗
信息框具体格式52push edx
50push eax
57push edi
53push ebx
FF15 B0434800call dword ptr ds:[<&USER32.MessageBoxA>>

static/image/hrline/1.gif


 机器码汇编码
窗口特征码55push ebp
8BECmov ebp,esp
68 02000080push 0x80000002
6A 00push 0x0
68 01000000push 0x1
6A 00push 0x0
6A 00push 0x0
6A 00push 0x0
68 01000100push 0x10001
68 ????0106push 0x601????
68 ????0152push 0x5201????
68 03000000push 0x3
BB ????????mov ebx,????????
E8 ????????call ????????
83C4 28add esp,0x28
8BE5mov esp,ebp
5Dpop ebp

static/image/hrline/1.gif


 机器码汇编码
按钮FF55 FCcall ????????
5Fpop edi
5Epop esi

static/image/hrline/1.gif


机器码 汇编码
设置时钟 FF15 ECE26774 call dword ptr ds:[<&USER32.SetTimer>]

static/image/hrline/1.gif


机器码 汇编码
OEP入口55         
push ebp
8BEC            
mov ebp,esp
6A FF             push -1



VB 特征码:
OEP入口:
FF25 6C104000   JMP DWORD PTR DS:[<&MSVBVM60.#100>]      ; MSVBVM60.ThunRTMain68
147C4000             PUSH PACKME.00407C14
E8 F0FFFFFF         CALL <JMP.&MSVBVM60.#100>
0000                     ADD BYTE PTR DS:,AL
0000                  ADD BYTE PTR DS:,AL
0000                  ADD BYTE PTR DS:,AL
3000                  XOR BYTE PTR DS:,AL

static/image/hrline/1.gif



VC7.0 特征码:
OEP入口:


6A 70                  push 70
68 50110001         push hh.01001150
E8 1D020000      call hh.010017B0
33DB                  xor ebx,ebx

static/image/hrline/1.gif



delphi特征码:
OEP入口:


55                  PUSH EBP
8BEC               MOV EBP,ESP
83C4 F0         ADD ESP,-10

static/image/hrline/1.gif

bc++特征码:OEP入口:
EB 10            JMP SHORT BCLOCK.0040164E66                  DB 66                                    ;CHAR 'f'
62                  DB 62                                    ;CHAR 'b'
3A                  DB 3A                                    ;CHAR ':'
43                  DB 43                                    ;CHAR 'C'
2B                  DB 2B                                    ;CHAR '+'
2B                  DB 2B                                    ;CHAR '+'
48                  DB 48                                    ;CHAR 'H'4F                     DB 4F                                    ;CHAR 'O'4F                     DB 4F                                    ;CHAR 'O'
4B                  DB 4B                                    ;CHAR 'K'
90                  NOP
E9                  DB E9
98E04E00      DD OFFSET BCLOCK.___CPPdebugHook
A1 8BE04E00   MOV EAX,DWORD PTR DS:C1E0 02         SHL EAX,2A3 8FE04E00    MOV DWORD PTR DS:,EAX
52                     PUSH EDX
6A 00                PUSH 0                                 ; /pModule = NULL
E8 DFBC0E00    CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
8BD0               MOV EDX,EAXstatic/image/hrline/1.gif


还有很多语言,我只是先列一个大纲。
我在这里抛砖引玉,希望大家有特征码的可以分享出来,我加进帖子里,方便大家查找{:5_116:}


不知道我写的是不是正确,如果写错了,请批评指正,谢谢{:5_121:}

特征码有了,但是有时候为什么搜索不到呢?到目前为止,我知道有以下几种原因:
1、程序被加壳了
2、选取的未知特征码太多【最好找关键特征--[不变的]】
3、查找的二进制字符串,填写错误。
4、查找的命令行太多。
5、OD代码没有显示程序所有代码






























Shark恒 发表于 2016-12-19 13:25

我去。。。8页?其中有很多特征还是空的,是还没补充么?

千里冰封 发表于 2016-12-19 13:32

Shark恒 发表于 2016-12-19 13:25
我去。。。8页?其中有很多特征还是空的,是还没补充么?

是的,还没补,只是先列出来一个大纲,分页存放不同语言的特征码。

千里冰封 发表于 2016-12-19 13:34

Shark恒 发表于 2016-12-19 13:25
我去。。。8页?其中有很多特征还是空的,是还没补充么?

我怎么才能删除,不用的垃圾帖子呢

Shark恒 发表于 2016-12-19 13:35

千里冰封 发表于 2016-12-19 13:34
我怎么才能删除,不用的垃圾帖子呢

举报区申请删除,自己不能删除。

han1317 发表于 2016-12-19 14:18

支持楼主,望持续更新

千里冰封 发表于 2016-12-19 21:03

Shark恒 发表于 2016-12-19 13:35
举报区申请删除,自己不能删除。

鲨鱼老大,有个问题想请教,就是关于这些特征码,我把程序载入od后,居然搜索不到,当用别的方法找到后,在搜索特征码,就能找到了。{:5_117:}

chengweiquan 发表于 2016-12-20 08:58

千里冰封 发表于 2016-12-20 18:20

易语言体 FF25 基本可以秒杀大部分易语言了,其实就是,间接大跳转。
跳转分2类,段内跳转也叫小跳,段间跳转也就是大跳。
不管是大跳,还是小跳,都有,直接跳转,和间接跳转。
FF25 ???????? 其实就是,段间 间接跳转,也叫间接大跳转。

李逍遥hlc 发表于 2017-1-28 22:39

感谢楼主科普,解了我很久的疑惑,万分感谢{:5_116:}
页: [1] 2
查看完整版本: 汇编小知识之【特征码】