Tag: 程序集

从Assembly调用C函数(printf)时的Segfault

我在linux上使用NASM编写一个基本的汇编程序,它从C库(printf)调用一个函数。 不幸的是,我这样做会导致分段错误。 注释掉对printf的调用允许程序无错误地运行。 ; Build using these commands: ; nasm -f elf64 -g -F stabs .asm ; gcc .o -o ; SECTION .bss ; Section containing uninitialized data SECTION .data ; Section containing initialized data text db “hello world”,10 ; SECTION .text ; Section containing code global main extern printf ;————- ;MAIN PROGRAM BEGINS HERE […]

如何编写接受包含整数和标点字符的用户输入的C程序?

解 #include #include int main() { char value[50]; char *end; int sum = 0; long conv; while(conv != 0 ) { printf(“Enter a measurement and unit(Ex: 4′ or 3\”;0′ or 0\” when done): “); fgets(value, 50, stdin); conv = strtol(value, &end, 10); if(strstr(value, “\'”) != NULL) { conv = strtol(value, &end, 10); sum = sum […]

在不使用ebp的情况下实现堆栈回溯

当明确告诉编译器不使用ebp作为堆栈帧指针时,如何实现堆栈回溯?

如何从程序集更改指针值(x86)

这是我的C代码,用于更改指针值 #include #include typedef struct tcb tcb_t; struct tcb { void* sp; int id; }; void* changePointer(struct tcb*); int main(){ struct tcb* s; s=malloc(sizeof(struct tcb*)); printf(“%p\n”,changePointer(s)); printf(“%p\n”,s); return 0; } 这是我的汇编函数(x86) .text .globl changePointer changePointer: push %ebp movl %esp, %ebp movl 0x8(%ebp),%eax//original pointer value movl %ebp,%esp movl %ebp,0x8(%ebp) //it is to be the value after […]

通过Assembler在引导加载程序级别执行C程序

我在Assembler中编写了一个自定义(非常基本的“Hello world!”)引导加载程序,我想在其中执行一个C程序。 由于丢失了stdio.h文件,C程序会工作还是失败? 我怎么能将C程序和引导加载程序捆绑到一个单独的.bin文件中以转换为闪存驱动器/ CD?

更改已编译二进制文件的部分

学习英语作为第二个郎,对错误和尴尬感到抱歉 我已经给出了一个特殊的项目。 该公司已丢失该应用程序的源代码,我必须对其进行更改。 现在,逆向工程整个事情对于一个人来说是不可能的,它太过庞大,但是修补个别function是可行的,因为这些变化并不是那么具有纪念意义。 因此,一种可能的解决方案是编译C代码,然后以某种方式 – 重写地址 – 将其修补到实际二进制文件中,理想情况下,替换CALL指令跳转到的代码,或者将JMP插入到我的代码中。 有没有办法用MingW32来实现这个目的? 如果是,您能提供一个简单的例子吗? 我也对可以帮助我完成任务的书籍感兴趣。 谢谢你的帮助

从我的启动加载程序加载elf-i386

我正在做操作系统项目,直到现在我的bootloader都在运行。 我可以使用bios interuppt加载二进制文件,但我无法从ELF文件格式加载和调用C函数: 这是我想要最终执行的C程序: //build :: cc -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o kmain.o kmain.c void kmain(){ int a = 5; for(;;); } 这是调用kmain()的汇编代码 ; build :: nasm -f elf loader.asm [BITS 32] [GLOBAL start] [EXTERN kmain] section .text start: mov eax, 0 call kmain 这是我的链接器脚本 ENTRY(start) 这就是我如何把所有东西连在一起 ld -m elf_i386 -T link.ld -o […]

来自C ASM的NodeJS按位运算符

这与我的预览问题有关 。 C中函数的完整ASM就在这里 。 我的问题在于: 00408091 |> F6D3 ||NOT BL 00408093 |. FEC3 ||INC BL 00408095 |. 02D3 ||ADD DL,BL 在javascript上,当我在0x35上使用NOT位运算符时,它返回-36而不是预期的0xCA 。 这是为什么? // cmp al, dl if (b <= a) { a -= b; } else { // problem lies here console.log(~b); a += b; a++; } 我的nodejs代码目前是: for (var i = 0; i […]

如何在x86 DOS程序集中读取键盘输入而不“消耗”它?

我需要编写一种可以从C代码调用的键记录function。 这意味着ac程序将调用一个名为startlog的汇编函数,该函数将指示开始记录按下的键,直到调用一个名为endlog的函数。 日志应该像这样工作:写入任何键的ascii值而不干扰startlog和endlog之间的C代码,这意味着如果C代码也需要读取输入(让我们说通过scanf,它可以正常工作)。 我设法通过将中断向量第9个条目(键盘按下的中断)更改为我写的将值写入文件的函数来编写记录器,并且它工作正常。 但是C代码没有得到输入。 基本上我所做的是读取使用int 21h按下的键,但是在读取ascii值后它被“消耗”所以我需要一种方法来再次模拟按键或读取值而不“消耗”它以便下一次键读取它读取相同的键。 (我用英语描述了代码,因为它是冗长而笨拙的汇编代码)

如何从内部获取指向程序的特定可执行文件部分的指针? (也许和libelf一起)

我在Linux环境中,我需要创建一个程序来检索放置在其可执行文件的一个部分中的一些数据。 那么,如何从内部获取指向程序某一部分(通过其名称)的指针? 我知道可以使用elf_getdata()传递section的索引作为get和Elf_Data结构的参数,这个结构的一个字段是d_buf ,它是指向实际数据的指针。 但是,似乎elf_getdata()函数将段数据的副本从文件复制到内存中,这不是我想要的。 我想要一个指向加载时加载到内存中的数据的指针。 伙计们,任何想法?