为什么Linux Open系统调用不需要路径的缓冲区大小参数?
为什么open系统调用不需要像write系统调用那样的缓冲区大小参数? 这两个系统调用如何对其字符串参数有所不同? open系统调用是否假定路径参数的零终端字符串,而write系统调用则没有?如果是这样,为什么不一致? 为什么不对使用字符串/数组的系统调用中的全部(或无)需要大小参数? 解决方案 Unix是作为用于组装程序编写的程序的操作系统,后来是针对C中的程序编写的.因此,在与操作系统交谈时使用同一惯例是很自然的. Linus在设计Linux时复制了UNIX API,因此这就是为什么具有相同设计的原因.由于不允许在路径或其他标识符中出现nul字节,因此不会终止符号字符串来丢失功能. a write呼叫将任意二进制数据写入文件.此数据不一定是文本,因此使用字符串约定没有多大意义.
0 2024-03-02
编程技术问答社区
从php-script中运行PHP-Script而不阻止
我正在建造一个蜘蛛,该蜘蛛将穿越各种站点和数据挖掘. 由于我需要单独获取每个页面,这可能需要很长时间(也许是100页). 我已经将set_time_limit设置为每页2分钟,但是似乎Apache在5分钟后会杀死脚本. 这通常不是问题,因为这将来自cron或类似的东西,而这些时间限制没有.但是,我也希望管理员能够通过http-interface手动启动. 我将在整个持续时间内保持活力并不重要,我将使用ajax触发提取并偶尔与Ajax一起检查. 我的问题是如何在php-script中启动fetth,而无需终止脚本呼叫时的获取. 也许我可以使用System('Script.php&'),但我不确定它会解决问题. 还有其他想法吗? 解决方案 $cmd = "php myscript.php $params > /dev/null 2>/dev/null &"; # when we call this particular command,
2 2024-02-27
编程技术问答社区
获取运行Android 8 Oreo的设备的CPU使用率
我真的很困惑.我刚刚注意到,从Android 8开始所有系统调用,例如/proc/stat将禁用.好的,但是在Android 8中获得CPU使用情况有什么可解决的问题?根本没有系统电话.我不熟悉一些API吗? 我真的希望有我现在看不到的解决方案. 解决方案 否,所有/proc/stat已被禁用于非系统应用程序,作为侧渠道. 更多信息,并在此处获得Google的正式回复:/37140047
2 2024-02-17
编程技术问答社区
Android中的SYSCALL_INLINE
我需要在Android NDK中内部使用SYSCALL来防止包装器功能的挂钩. 在Linux中,有Syscall_inline之类的宏,它允许使用SYSCALL无包装功能.因此,宏将SYSCALL装配代码嵌入到项目中. 我在Android NDK中找不到类似的宏. 也许我可以像这样写自己的功能; https://git.busybox.net/uclibc/tree/libc/sysdeps/linux/arm/syscall.c 但我需要拥有ARM_64,X86和X86_64版本的ARM_64,同一功能的版本. 你能帮我吗?我如何找到解决方案? 解决方案 Android的Linux内核仍然使用相同的系统通用数字和ABI与常规Linux,不是吗? (因此,如何从用户空间访问系统?),因此您应该能够使用普通方法,并使用的呼叫号码. 您可以在 arch/x86_64/syscall_arch.h .它对于每个不同数量的args
2 2024-02-17
编程技术问答社区
Android NDK是否支持大多数UNIX系统调用?
我正在尝试修复,然后移植一个旧项目,用C在Android上运行.该项目使用系统调用,例如stat(文件,inode)和系统(命令). 这些功能是否在Android NDK中得到了完全支持?还是我会更好地重写Java的整个项目? 解决方案 是的,您可以使用Android NDK使用系统调用和LIBC功能. system() - blob/master/libc/docs/overview.txt >
0 2024-02-17
编程技术问答社区
在Android 5.0.1_r1中从c++向java发送一个意图
浏览了几篇文章后,我发现我可以将意图发送以下代码(用于调试的第二行): int ret = system("am broadcast -a android.intent.action.MIKE_ACCESSED --user 0"); __android_log_print(ANDROID_LOG_DEBUG, "gxp18", "Shell command returned %i", ret); 不幸的是,这总是返回(无论系统中使用什么命令(" ...")): shell命令返回32512 有趣的是,我可以使用: 成功地通过ADB发送意图 adb shell am broadcast -a android.intent.action.MIKE_ACCESSED 注意!我不使用NDK.我在帖子中报告的代码是对Android框架中一部分代码的修改.特别是,它是Android服务之一的一部分.我正在使用AOSP并修改源代码的部分. 解决方案 1)禁用
0 2024-02-15
编程技术问答社区
如何钩住我的安卓应用的系统调用
我想拦截Connect()系统调用并使用我自己的自定义实现.自定义实现将采取一些操作,例如打印日志以简单起见,然后进一步调用系统实现. 我看了看浏览一段时间后,我遇到这已经回答问题.但是这里描述的方法给了我以下错误. *****跳到案例标签[-fpermissive] jni/test.cpp:107:20:错误:跨越'uint32_t Entry_page_start的初始化' 'uint32_t page_size'***** int hook_call(char *soname, char *symbol, unsigned newval) { soinfo *si = NULL; Elf32_Rel *rel = NULL; Elf32_Sym *s = NULL; unsigned int sym_offset = 0; if (!soname || !symbol || !newval) return 0; si = (soinfo*) dlopen(son
0 2024-02-11
编程技术问答社区
拦截Android内核中的系统调用--当模块被移除时,设备会重新启动
我一直在试图拦截Android内核中的Syscall(Maguro的3.0.72).我将内核模块用于此目的.一个示例如下: #include #include MODULE_LICENSE ("Dual BSD/GPL"); asmlinkage long (*orig_call_open) (const char __user * filename, int flags, int mode); asmlinkage long (*orig_call_read) (unsigned int fd, char __user * buf, size_t count); #define SYS_CALL_TABLE_ADDR 0xc0058828 void **sys_call_table; asmlinkage long new_sys_open (const char __user * f
0 2024-02-09
编程技术问答社区
linux的alarm()是如何被内核处理的
我正在阅读有关 Alarm()呼叫在Linux上的工作方式. 警报(5)将在最小5秒内发送 sigalrm ,以进行此通话. 当时引起了警报,这要归功于内核达到零的下方计数器. 我的疑问是在这里 - 我们可以有n个发出警报调用的流程数量,并且系统中有一个倒数计数器用于此目的.因此,内核必须跟踪其必须在一个下方计数器的情况下向信号发送信号的所有过程.它如何做? [它是否维护链接的排序列表,每个节点表示该过程?] 解决方案 我不是Linux内核开发人员,但是给定 man-page 对于alarm(),您已经可以期望它如何实现. 首先,很明显,警报值是每个进程.由于内核已经保持到程序数据结构( task_struct ) ,它只是将所需的警报时间存储在那里.然后,Linux仅使用其内部计时器系统在指定的时间注册回调.然后说回调将sigalrm传递到您的流程中. 不需要内核 - 全球状态或链接的警报链接链接列表.内核只是保留一个过程列表,并将警报超时存储为每个过程
2 2024-01-22
编程技术问答社区
Assembly execve /bin/bash (x64)
我是ASM的新手,我正试图执行SYSCALL到/bin/bash.但是我目前遇到以下问题: 我的代码适用于第一个参数长度小于8个字节的任何执行呼叫,即"/bin/sh"或"/bin/ls": .section .data name: .string "/bin/sh" .section .text .globl _start _start: #third argument of execve, set to NULL xor %rdx, %rdx #push nullbyte to the stack pushq %rdx #push /bin/sh to the stack pushq name #copy stack to rdi, 1st arg of execve mov %rsp, %rdi #copy 59 to rax, defining syscall nu
8 2024-01-09
编程技术问答社区
32位Linux上的Syscall或sysenter?
自从MS -DOS以来,我知道使用中断的系统调用.在旧论文中,我看到了对int 80h的引用,以调用Linux上的系统功能.由于现在很长一段时间,我知道int 80h被弃用了syscall指令.但是我无法在32位机器上使用它. 问题 仅在64位平台上使用syscall指令? 32位Linux不利用syscall? 样品测试 在我的32位Linux(ubuntu精确)上,此程序以核心转储终止: global _start _start: mov eax, 4 ; 4 is write mov ebx, 1 ; 1 is stdout mov ecx, message ; address of string mov edx, length ; number of byt
0 2024-01-08
编程技术问答社区
打印存储在EDX:EAX的64位数字到标准输出端
我分别存储在EDX中的64位数字:EAX AS 21C3677C:82B40000.我试图将数字打印到第24329020081764000000个十进制器上,是否有系统调用可以让我完成此操作? 解决方案 有人必须怜悯这个人和他的同学.如果"只是呼叫printf"不作弊,那么使用此功能也不应该作弊.我从我遇到过的第一个ASM程序之一中偷走了这一点.它使用DOS中断,每三个数字逗号找到磁盘尺寸和打印dx:ax.你们可能不需要逗号.我已经修改了多年 - 可能很快就会制作rdx:rax版本.非常适合显示阶乘.它非常幼稚和效率低下,但仍然有效.随意改进它.当然,当您将角色放在缓冲区中之后,这只是" Hello World",带有不同的歌词. 其他解决方案 Here is an example how to print the 64 bit number with printf. This code works with YASM. Build the binary with th
4 2024-01-08
编程技术问答社区
写入系统调用不会从寄存器中打印字符
我想打印AAAA,以下以下内容: BITS 32; ;write; push 0x41414141; pop ecx ; mov eax, 4 ; write is syscall 4 for Ubuntu 32-bit mov ebx, 1 ; stdout mov edx, 4 ; int 0x80 ; ;exit; mov eax, 1 ; mov ebx, 0 ; int 0x80 ; 然而,一旦组装并链接了此代码仅退出,没有错误,什么问题? 解决方案 您的代码的快速修复: push 0x41414141 ; put 'AAAA' into stack memory mov ecx,esp ; pointer to the 'AAAA' mov eax, 4 ; write is syscall 4 for 32-bit Linux mov
0 2024-01-08
编程技术问答社区
在Linux的32位代码中,"int 0x80 "和 "syscall "哪个更好?
我研究Linux内核,并发现对于X86_64架构中断int 0x80在调用系统调用 1 . 不起作用 对于i386体系结构(32位x86用户空间),更可取的是:syscall>或int 0x80,为什么? 我使用Linux内核版本3.4. 脚注1:int 0x80在某些情况下确实在64位代码中工作,但从不建议使用. 如果您在64位代码中使用32位INT 0x80 Linux ABI会发生什么? 解决方案 syscall是在x86-64上输入内核模式的默认方法.该指令在英特尔处理器上的32位操作模式. 上不可用 sysenter是一种最常用于以32位操作模式调用系统调用的指令.它类似于syscall,但是使用更难,但这是内核的关注. int 0x80是调用系统调用的遗留方式,应避免. 调用系统调用的首选方法是使用 vdso 在每个过程中,地址空间允许更有效地使用系统调用(例如,在某些情况下根本不输入内核模式).与遗产int 0x80相比,VDSO还要处理更
10 2024-01-08
编程技术问答社区
在.net应用程序中拦截DateTime.Now
我们有一个应用程序,该应用程序使用当前日期(使用dateTime.now)来计算特定值. 我们还需要能够根据其他日期在服务器上运行这些计算. 不幸的是,这两个明显的选择是不可行的 - a)尽管我们拥有该应用程序的代码,但由于政治以及其他环境也使用该服务的事实,将无法更改并注入特定日期, b)由于服务器上运行的其他应用程序和流程,我们无法更改系统日期. 我想知道的是: 是否可以拦截对框架进行的呼叫(DateTime.STEMITION.在这种情况下为现在)并返回特定值? 这可以来自同一应用程序.不幸的是,我不确定您是否可以实际以这种方式拦截这些呼叫,即使这样,也能够识别呼叫过程. 我意识到您可能会使用一些测试框架来执行此操作,但是无论如何,它们都需要您更改代码库. 谢谢 解决方案 如果您除了在运行时完全没有其他方法,可以使用首先下载binary class Program { static void Main(string[] args) { v
4 2024-01-04
编程技术问答社区
为什么在linux x86_64 (nasm)上,写系统调用时最后会打印`%`?
以下Hello-World程序在打印字符串的末尾显示%符号.为什么要删除它? 这是我的程序: section .data msg db "hello, world!" section .text global _start _start: mov rax, 1 ; syscall 1 (write) mov rdi, 1 ; arg 1 = 1 (stdout) mov rsi, msg ; arg 2 = msg ("hello, world!") mov rdx, 13 ; arg 3 = 13 (char count) syscall ; call write mov rax, 60 ; syscall 60 (exit) mov rdi, 0 ; arg 1 = 0 (OK) syscall ; cal
6 2023-12-26
编程技术问答社区
Ubuntu 16.04 汇编代码的外壳
.global main main: call func .string "/bin/sh" func: push %rsp pop %rsi pop %rdi mov $0x00, %edx mov $0x3b, %eax syscall 我写了像上面的召集栏杆以执行/bin/sh 我编译了它,但是当我尝试执行程序时,/bin/sh: 0: Can't open ????发生此错误. 它不会执行/bin/sh.我想知道为什么我不能执行/bin/sh 我正在使用ubuntu 16.04和x64架构 解决方案 您的代码很难遵循,因为以一种怪异的方式使用推送/pop,但是在strace -f ./a.out下运行程序以跟踪系统呼叫显示: ... dynamic linker and libc init stuff before main() is called ... execve("/bin/sh",
2 2023-12-16
编程技术问答社区
GNU汇编程序(Mac OS X 64位)。不合法的指令。4
我是GNU汇编机的新手,我正在尝试执行此代码: .globl _main _main: movl $1, %eax movl $0, %ebx int $0x80 该程序应通过系统调用出口(1)退出.编译(无警告): gcc test.s 但是运行它给了我错误:Illegal instruction: 4 感谢您的帮助! 解决方案 如果您要编译64位可执行文件,则应写下这样的内容: movq $0x2000001, %rax movq $0, %rdi syscall
4 2023-12-16
编程技术问答社区
如果该壳牌码不通过0作为Execve的环境指针,为什么它会起作用?
我的理解是,由于x64调用惯例,应将第三个参数execve,envp存储在rdx中.但是此shellCode并不为此寄存器归零,它仅零RSI寄存器(存储ARV).因此,如果RDX的当前值不指向有效位置,则会导致segfault,否? 我错过了什么吗? 解决方案 asm dis 写rdx(带0):注意 cdq 在syscall> 之前. EAX=59的符号位是0,因此edx = 0,并将EDX零延迟写入RDX. 那是 linux特殊案例null argv或envp指针像空列表一样工作(指向记忆中的null指针).请参阅"人页面: MAN页面不建议使用C程序的实践,因为它不适合其他Unixes,但ShellCode却没有,并且保存了机器代码大小的字节. 在_start中,在Linux下的静态可执行文件中,除RSP以外的所有REGS均为0. (X86-64 SYSV ABI无法保证这是内核选择在输入用户空间之前避免信息泄漏的方便值. ,他们还通过将机器代码字节
2 2023-12-16
编程技术问答社区
汇编克隆的系统调用线程函数未被调用
我试图使用" clone" syscall创建线程...我搜索了很多! 例如, link1 现在,这是我在Linux X64的汇编中的源代码: FORMAT ELF64 EXECUTABLE ENTRY thread_linux_x64 THREAD_MEM_SIZE = 1024 define PROT_READ 0x1 define PROT_WRITE 0x2 define PROT_EXEC 0x4 define MAP_PRIVATE 0x02 define MAP_ANONYMOUS 0x20 define CLONE_VM 0x00000100 define CLONE_FS 0x00000200 define CLONE_FILES 0x00000400 define CLONE_SIGHAND 0x00000800 define CLONE_P
2 2023-12-16
编程技术问答社区