Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 学习集会_Assembly - Fatal编程技术网

Assembly 学习集会

Assembly 学习集会,assembly,Assembly,我决定学习汇编语言。这样做的主要原因是能够理解反汇编代码,也许能够编写更有效的代码部分(例如,通过c++),做一些事情,如代码洞等。我看到有无数不同风格的汇编,因此,出于我提到的目的,我应该如何开始?我应该学习什么样的组装?我想先做一些简单的程序(例如计算器)来学习,但目标本身就是熟悉它,这样我就可以理解IDA Pro所显示的代码 我正在使用windows(如果这有什么区别的话) 编辑:看来每个人都指向MASM。虽然我知道它具有高级功能,对汇编代码程序员来说都很好,但这不是我想要的。它似乎有if

我决定学习汇编语言。这样做的主要原因是能够理解反汇编代码,也许能够编写更有效的代码部分(例如,通过c++),做一些事情,如代码洞等。我看到有无数不同风格的汇编,因此,出于我提到的目的,我应该如何开始?我应该学习什么样的组装?我想先做一些简单的程序(例如计算器)来学习,但目标本身就是熟悉它,这样我就可以理解IDA Pro所显示的代码

我正在使用windows(如果这有什么区别的话)


编辑:看来每个人都指向MASM。虽然我知道它具有高级功能,对汇编代码程序员来说都很好,但这不是我想要的。它似乎有if、invoke等指令,这些指令在流行的反汇编程序(如IDA)中没有显示。因此,如果可能的话,我想听到的是任何使用ASM的人的意见(阅读IDA中的反汇编exe代码),而不仅仅是“普通”汇编程序员


编辑:好的。我已经在学习组装了。我在学习MASM,而不是使用对我来说无关紧要的高级东西。我现在正在做的是在C++中的我的代码中尝试我的代码,这样我就可以比从Masm从头开始做任何事情都更快地尝试。但是你会从MASM中得到乐趣。

手工编写的程序集和编译器生成的程序集在从高层次上看时通常是非常不同的。当然,该程序的内部结构非常相似(毕竟,编码
a=b+c
的方法只有这么多),但当你试图对某些东西进行反向工程时,它们并不是问题所在。编译器甚至会在简单的可执行文件中添加大量样板代码:上次我比较时,由GCC编译的“Hello World”大约为4kB,而如果用汇编手工编写,大约为100字节。Windows上的情况更糟:上一次我比较(承认,这是上个世纪)我能得到的最小的“Hello World”时,我选择生成的Windows编译器是52kB!通常,这个样板文件只执行一次(如果有的话),所以它不会对程序速度产生太大影响——正如我上面所说的,程序的核心,即执行时间最多的部分,无论是编译还是手工编写,通常都非常相似

归根结底,这意味着专家汇编程序员和专家反汇编程序是两个不同的专业。通常,它们是在同一个人身上发现的,但它们实际上是分开的,学习如何成为一名优秀的组装编码器对学习逆向工程并没有多大帮助

您要做的是从和中获取IA-32和AMD64(两者都包含在一起)体系结构手册,并浏览有关说明和操作码的早期部分。也许阅读一两篇关于汇编语言的教程,只是为了了解汇编语言的基本知识。然后抓取一个您感兴趣的小示例程序并对其进行反汇编:逐步了解它的控制流,并尝试了解它在做什么。看看你是否可以修补它来做其他事情。然后用另一个程序再试一次,然后重复,直到你感到足够舒服,可以尝试实现一个更有用的目标。您可能会对反向工程社区制作的“crackmes”之类的东西感兴趣,这对那些对反向工程感兴趣的人来说是一个挑战,他们可以尝试一下,并希望在这一过程中学到一些东西。它们的难度从基本的(从这里开始!)到不可能的

最重要的是,你只需要练习。正如在许多其他学科中一样,通过逆向工程,熟能生巧。。。或者至少更好。

我发现这是一个有趣而有用的话题。。。不能说我曾经直接使用过这些知识,但这并不是我阅读这些知识的原因。它让您对代码编译到的指令有了更丰富的了解,这在理解更微妙的bug时有时很有用


不要被标题拖后腿。本书第一部分的大部分内容是埃里克·雷蒙德(Eric Raymond)所说的“黑客行为”:创造性、令人惊讶、几乎是鬼鬼祟祟的解决棘手问题的方法。我(也许你)对安全方面的兴趣要小得多。

我想你应该学习ASCII化的操作码助记符(及其参数),这些助记符由反汇编程序输出,汇编程序可以理解(可以用作输入)

任何汇编程序(如MASM)都可以


和/或你最好读一本关于它的书(有人推荐过这方面的书,我不记得是哪本)。

我开始学习MIPS,它是一种非常紧凑的32位体系结构。这是一个精简的指令集,但这使初学者更容易掌握。您仍然能够理解汇编是如何工作的,而不会因为复杂性而不知所措。您甚至可以下载一个漂亮的小IDE,它将允许您编译MIPS代码:
一旦掌握了诀窍,我认为将更容易转向更复杂的体系结构。至少我是这么想的:)在这一点上,你将掌握内存分配和管理、逻辑流、调试、测试等方面的基本知识。

我不会集中精力尝试在汇编中编写程序,至少一开始不会。如果您使用的是x86(我假设您使用的是,因为您使用的是Windows),那么有很多奇怪的特殊情况,学习这些情况是毫无意义的。例如,许多指令假设您在一个没有明确命名的寄存器上操作,而其他指令在某些寄存器上工作,但在其他寄存器上不工作

我会对您的预期体系结构有足够的了解,让您了解基础知识,然后直接切入并尝试了解编译器的输出。用武器武装自己,然后俯冲下去
C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`