这是我第一次来,我真的希望你们能帮助我,因为我现在已经没有想法了。
我已经搜索了几个小时的答案,但找不到实际可行的答案。
我想直接将代码注入正在运行的进程中。是的,你没有看错。我正在尝试将代码注入另一个应用程序,并且——不管你信不信——这只是为了扩展它的功能。
我在 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,更改了一堆优化设置,但这些都没有任何效果。您认为可能的解决方案是什么?我可能遗漏了一些明显的东西。
无论如何,这是(在您看来)获取函数长度(可读性、可靠性、易用性)的最佳方式吗?
我希望我解释了我必须做的一切,以便您能够提供帮助。如果您还有其他问题,请随时发表评论。
感谢您的时间和努力。
我需要将汇编命令翻译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。由于这是考试的准备,如果有人能提供帮助,我会非常高兴:)
我看到仅通过比较位模式如何实现平等,但是如何写一个小于或大于运算符的自有数据呢?机械地相互比较值的实际过程是什么?
我正在尝试使用 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-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?
我在Z80组装编程; 我对字节序感到困惑.
关于以下说明:
LD HL,d16
Run Code Online (Sandbox Code Playgroud)
该字节将21 FF DF导致H = FF和L = DF或H = DF和L = FF?
我正在编写一个 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) 我正在阅读英特尔文档,第一卷。1 和3.6.1 64 位模式下的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并提到操作数的大小默认为 32 位。并且只能用REX.W指令前缀(在其他前缀之后)以使其长度为 64 位。
我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如int操作数?跟签有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀操作(正如也提到的,前缀仅持续特定指令,而不是整个段,这应该是(大小,地址或操作数)默认值和包含在段描述符中)。
我理解正确吗?
那么关键字“inline”会导致调用被函数体替换吗?所以我猜这意味着我们完全跳过电话?就像如果我们查看 .asm 文件,我们不会找到调用指令?
像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:在地址之前使用是否有任何惩罚,或者是否有办法查看操作码,以便我可以确认我正在查看正确的参考
machine-code ×10
assembly ×8
x86 ×3
x86-64 ×3
c++ ×2
64-bit ×1
disassembly ×1
endianness ×1
function ×1
inline ×1
nasm ×1
opcode ×1
visual-c++ ×1
windows ×1
x86-16 ×1
z80 ×1