标签: machine-code

Visual C++ 在函数末尾附加 0xCC (int3) 字节

这是我第一次来,我真的希望你们能帮助我,因为我现在已经没有想法了。

我已经搜索了几个小时的答案,但找不到实际可行的答案。

我想直接将代码注入正在运行的进程中。是的,你没有看错。我正在尝试将代码注入另一个应用程序,并且——不管你信不信——这只是为了扩展它的功能。

我在 Windows 上使用 Visual Studio 2012 Express Edition。

我有以下代码:

__declspec(naked) void Foo()
{
    __asm
    {
        // Inline assembly code here
    }
}
__declspec(naked) void FooEnd() {}

int main()
{
    cout << HEX(Foo) << endl;
    cout << HEX(FooEnd) <<  endl;
    cout << (int)FooEnd - (int)Foo << endl;

    // Inject code here using WriteProcessMemory

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了保持可读性,大部分代码已被删除,但我可以根据要求发布它的其他部分。

输出如下:

0x010B1000
0x010B1010
16
Run Code Online (Sandbox Code Playgroud)

结果大小实际上是不正确的。这些函数以正确的顺序编译(确保使用 /ORDER),但是编译器在每个扩展其大小的方法之后添加了一堆 0xCC(int 3)字节,所以我无法获得真正的(有用的)数字包含实际可执行代码的字节数。

在另一个 stackoverflow 问题中,据说禁用“编辑并继续”会使这些额外的字节消失,但无论如何,这对我不起作用。

我还尝试使用 Release setup 而不是 Debug,更改了一堆优化设置,但这些都没有任何效果。您认为可能的解决方案是什么?我可能遗漏了一些明显的东西。

无论如何,这是(在您看来)获取函数长度(可读性、可靠性、易用性)的最佳方式吗?

我希望我解释了我必须做的一切,以便您能够提供帮助。如果您还有其他问题,请随时发表评论。

感谢您的时间和努力。

c++ windows assembly machine-code visual-c++

1
推荐指数
1
解决办法
1863
查看次数

将汇编器 (8086) 命令转换为机器代码

我需要将汇编命令翻译MOV BL,[ALPHA]成 intels 8086 处理器的机器代码。因此,ALPHA 是数据段第 11 个位置的 1 字节变量,已加载到寄存器中DS

我已经翻译了MOV AL,[ALPHA]我的另一项任务。在这里,我MOV AL/AX,addr在指令集表中找到了 ,这样我就可以将整个内容翻译成1010|0000 1010|0000机器A0 10代码。

我倾向于使用MOV r/m1,r/m2指令集表,但我不是 100% 确定,因为我在选择部件时遇到了问题r/m。由于这是考试的准备,如果有人能提供帮助,我会非常高兴:)

assembly machine-code x86-16

1
推荐指数
1
解决办法
2336
查看次数

小于和大于在二进制逻辑级别上如何工作?

我看到仅通过比较位模式如何实现平等,但是如何写一个小于或大于运算符的自有数据呢?机械地相互比较值的实际过程是什么?

machine-code

1
推荐指数
1
解决办法
3732
查看次数

如何强制 NASM 将 int3 编码为 0xCC

我正在尝试使用 NASM 组装以下代码

 section .text
 global _start


_start:

mov eax, 1
int 3
Run Code Online (Sandbox Code Playgroud)

objdump -D产量:

test:     file format elf64-x86-64


Disassembly of section .text:

0000000000400080 <_start>:
 400080:    b8 01 00 00 00          mov    $0x1,%eax
 400085:    cd 03                   int    $0x3
Run Code Online (Sandbox Code Playgroud)

有趣的是,当用 GAS 组装时,int 3被编码为0xCC而不是cd 03,这是为什么呢?

x86 assembly nasm machine-code

1
推荐指数
1
解决办法
974
查看次数

rbp不允许作为SIB基础?

我对x86-64二进制编码很新.我正在尝试修复一些旧的"汇编程序"代码.

无论如何,我正在尝试做这样的事情(英特尔语法):

mov    [rbp+rcx], al
Run Code Online (Sandbox Code Playgroud)

汇编程序目前正在生成:

88 04 0D
Run Code Online (Sandbox Code Playgroud)

但这似乎不是一个有效的指示.如果我将SIB字节中的基数更改rbp为其他寄存器,则可以正常工作.另一种使其工作的方法是添加一个零字节的位移(88 44 0D 00).这似乎与其他类似的操作码一起发生.

为什么我不能rbp在那里使用mod=00

x86 assembly x86-64 machine-code addressing-mode

1
推荐指数
1
解决办法
178
查看次数

加载到16位寄存器,第一个或第二个寄存器中的最低有效位?

我在Z80组装编程; 我对字节序感到困惑.

关于以下说明:

LD HL,d16
Run Code Online (Sandbox Code Playgroud)

该字节将21 FF DF导致H = FFL = DFH = DFL = FF

assembly z80 machine-code endianness

1
推荐指数
1
解决办法
89
查看次数

为什么我的汇编器不使用 ADD EAX,1 手册文档中的 05 操作码 (add eax,imm32) 简写形式,但对 04 ADD AL, 1 却使用它?

我正在编写一个 x86-64 汇编程序。我正在浏览 Intel x86 手册第 2 卷,试图了解如何从程序集中生成正确的指令。我主要了解它是如何工作的,但一直在组装和拆卸说明以检查我是否正确。

在 ADD 参考表(第 2A 卷,3.31)中:

opcode        | Instruction  
04 ib         | ADD AL, imm8  
05 iw         | ADD AX, imm16  
05 id         | ADD EAX, imm32  
REX.W + 05 id | ADD RAX, imm32  
Run Code Online (Sandbox Code Playgroud)

集合:

;add.s   
add al, 1
add ax, 1
add eax, 1
add rax, 1
Run Code Online (Sandbox Code Playgroud)

拆卸:

.text:
   0:   04 01           add al, 1
   2:   66 83 c0 01     add ax, 1
   6:   83 c0 01        add eax, 1
   9: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly machine-code opcode instruction-encoding

1
推荐指数
1
解决办法
1372
查看次数

为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档,第一卷。1 和3.6.1 64 位模式下的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并提到操作数的大小默认为 32 位。并且只能用REX.W指令前缀(在其他前缀之后)以使其长度为 64 位。

我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如int操作数?跟签有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀操作(正如也提到的,前缀仅持续特定指令,而不是整个段,这应该是(大小,地址或操作数)默认值和包含在段描述符中)。

我理解正确吗?

64-bit assembly x86-64 machine-code instruction-encoding

1
推荐指数
1
解决办法
621
查看次数

C++ 中的“内联”关键字

那么关键字“inline”会导致调用被函数体替换吗?所以我猜这意味着我们完全跳过电话?就像如果我们查看 .asm 文件,我们不会找到调用指令?

c++ inline function machine-code inline-assembly

1
推荐指数
1
解决办法
121
查看次数

如何通过操作码或反汇编查找使用哪种形式的指令?

https://uops.info/和 Agner Fog 的指令表,甚至英特尔自己的手册这样的网站,都列出了相同指令的各种形式。例如add m, r(在 Agner 的表格中)或add (m64, r64)在 uops.info 上,或ADD r/m64, r64在英特尔的手册中(https://www.felixcloutier.com/x86/add)。


这是我在 Godbolt 上运行的一个简单示例

__thread int a;
void Test() {
    a+=5;
}
Run Code Online (Sandbox Code Playgroud)

添加是add DWORD PTR fs:0xfffffffffffffffc,0x5。它以操作码开头64 83 04 25

有几种方法可以编写我的真实代码,但我想查找这可能需要多少个周期以及其他信息。我怎么找到这个指令的参考?我尝试在https://uops.info/table.html 中输入“add”并检查我的架构。但我不知道哪个条目是正在使用的指令。

现在在这种特定情况下,我猜测操作码是Add m64, r64但我不知道fs:在地址之前使用是否有任何惩罚,或者是否有办法查看操作码,以便我可以确认我正在查看正确的参考

assembly x86-64 machine-code disassembly micro-architecture

1
推荐指数
1
解决办法
97
查看次数