我如何使用Cocoa编辑其他应用程序的内存?我知道编辑必须以root身份完成,但我怎么能在第一时间完成呢?
union LowLevelNumber
{
unsigned int n;
struct
{
unsigned int lowByte : 8;
unsigned int highByte : 8;
unsigned int upperLowByte : 8;
unsigned int upperHighByte : 8;
} bytes;
struct
{
unsigned int lowWord : 16;
unsigned int highWord : 16;
} words;
};
Run Code Online (Sandbox Code Playgroud)
这个联合允许我访问无符号整数字节或逐字.但是,代码看起来相当丑陋:
var.words.lowWord = 0x66;
Run Code Online (Sandbox Code Playgroud)
有没有办法可以让我编写这样的代码:
var.lowWord = 0x66;
Run Code Online (Sandbox Code Playgroud)
更新:
这实际上是关于编写短/漂亮的代码,如上例所示.联合解决方案本身确实有效,我只是每次访问lowWord或lowByte时都不想写.words或.bytes.
以下使用seg-V崩溃:
// my code
int* ipt;
int bool set = false;
void Set(int* i) {
ASSERT(i);
ipt = i;
set = true;
}
int Get() {
return set ? *ipt : 0;
}
// code that I don't control.
struct S { int I, int J; }
int main() {
S* ip = NULL;
// code that, as a bug, forgets to set ip...
Set(&ip->J);
// gobs of code
return Get();
}
Run Code Online (Sandbox Code Playgroud)
这是因为虽然i它不是NULL仍然无效.如果调用代码从NULL指针获取数组索引操作的地址,则会发生同样的问题.
对此的一个解决方案是修剪低阶位: …
我试图找到与下面的汇编块相当的C语言:
.section .text
.globl mystery
.type mystery, @function
mystery:
pushl %ebp
movl %esp, %ebp
xorl %eax, %eax
xorl %exc, %ecx
movl 8(%ebp), %edx
begin:
cmpl 12(%ebp), %ecx
jge done
addl (%edx, %ecx, 4), %eax
incl %ecx
jump begin
done:
movl %ebp, %esp
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
我得到了"开始"部分.它似乎是一个循环,从函数中获取参数并将其与%ecx中的任何内容进行比较.如果满足jge条件,则函数返回,否则它将%edx添加4%ecx,将其移至%eax,递增%ecx,并再次循环.
我真的不明白"神秘"的一部分.特别是xorls和movl语句.如果%eax或%ecx中没有任何内容可以启动,那么xorl正在做什么.我猜测的movl是从函数中取一个参数并将其移动到%edx?
任何见解都是有帮助和赞赏的.
首先,关于这个问题的一些背景:今天,我正在寻找关于测试如何在装配中起作用的解释.不幸的是,我似乎无法在谷歌找到答案,因为"测试","汇编"等都是在其他情况下经常使用的常用词.最终我通过搜索"条件分支"找到了一些信息,这不是我想要的,但是它是一个很好的起点.
我的问题是,我在哪里可以获得有关低级计算机操作的信息?例如,如果我想知道分支语句如何工作,或者cpu缓存如何工作,或者在移位寄存器时多余的位会发生什么?我该如何搜索这些?
我有一个混乱的python生成
source code ->> byte code --> python virtual machine
c语言是否也生成字节码或直接编译?
如果c不生成字节代码,那么它被认为是低级语言的原因?因为Assembly也不生成字节代码,因为它直接在机器上执行,所以它的级别低.
如何在进程的可执行存储器中区分组装"调用"指令(E8 [地址])与其他E8字节(例如,在另一条指令中间的那个)的操作码?(从C语言的角度来看,最好)
是否足以验证E8字节之后的四个字节是否引用有效地址,然后验证该区域(即被调用函数的开始)是否以对应于操作码"push ebp"和"mov ebp"的字节开头,esp"(大多数功能都使用这个序幕)?或者是否有更好的选择,例如检查从入口点到出口点的每个操作码?
顺便说一句,我对这个主题几乎没有经验,所以任何信息都值得赞赏.
谢谢!
我希望能够编写原始机器代码,而无需汇编或任何其他种类的高级语言,而这些语言可以直接放在闪存驱动器上并运行。我已经知道要执行此操作,我需要将主引导记录标头(我已经设法手动完成)格式化到驱动器上。我已完成此操作,并成功使用代码所在驱动器的第一个扇区(在本例中为前512个字节)中的汇编代码,使一行文本显示在屏幕上。但是,我希望能够像在MBR格式化中那样将原始的十六进制代码写入驱动器,而无需诸如汇编之类的任何工具来帮助我。我知道有一种方法可以做到这一点,但是我真的找不到任何不涉及汇编的东西。在哪里可以找到有关此信息?汇编附带了谷歌搜索机器代码或x86编程,这不是我想要的。
我尝试更深入地了解 Public | 之间的差异。私人 | 在 C++ 中从低级角度保护。
三者的差异在记忆中表现如何?
我只是想问:为什么我写的时候:
MOV DL, [BX]
Run Code Online (Sandbox Code Playgroud)
它有效,但是当我写:
MOV DL, [AX]
Run Code Online (Sandbox Code Playgroud)
不是吗?