안녕하세요 ^^
시스템콜을 추가했는데..
인자를 넘기려니, 컴파일오류가 나는군요
투메니 아규먼트 라고 ..
#include<linux/unistd.h> _syscall0(int, rkmem); int main(){ rkmem(0xc0000000); }
간단한 코드인데요, 인자없이하면 되는데 인자만 넣으면 오류가나요
시스템콜의 인자넣는 부분은 따로 어디에 정의하거나 수정해주어야하나요?
_syscall0(type,name)은 인자가 없음을 의미합니다. type:함수리턴형 name:함수이름 _syscall1로 바꿔줘야하고요.
_syscall1(type,name,type1,type_name)형식입니다. 지정한 type1 변수는 ebx cpu범용레지스터에 들어가게되고요.
만약 int newsys(int a)형식으로 호출하게된다면 _syscall1(int,newsys,int,a) 이렇게 호출해줘야합니다.
인자가 2개면 _syscall2,.. 이렇게 되겠지요. unistd.h에는 인자 6까지 변환하는 매크로가 들어갑니다.
[LINUXSRCDIR]/include/linux/unistd.h 를 보면 구현되어있습니다.
모든 디지털의 목표는 아날로그.
system("rm -rf"); <-- 이렇게 바로 인자 넣으셔도 됩니다.
아니면 실행중 인자를 다양하게 바꿔야할 경우 , 아래와 같이 인자를 넣는 방법도 있습니다. 대충 적으면 아래와 같고 활용은 본인이 .. :)
char buf[255]; char * parameter1 = "-rf"; char * parameter2 = "-i"; char * parameter3 = "-r"; if(조건) sprintf(buf,"rm %s",parameter1); else if sprintf(buf,"rm %s",parameter2); else sprintf(buf,"rm %s",parameter3); system(buf);
아지랑이류 초환상 공콤 화랑... 포기하다.. T.T
킴님 감사해요. 도움이 됐습니다. 그용도였군요 ^^ 한벌님은 =.=; 엉뚱하 대답을 해주셧네요..
관심감사합니다..
힘내세요.
이상하네요.. 시스템콜을 호출해보고요.. 인라인어셈으로도 직접 호출해봤는데요. 함수코드가 작동안하는듯해요..
printk 구문이 있는데.. 콘솔이나 dmesg 로그에 남아야할텐데.. 아무결과가 없네요 ..
왜그럴까요..
저도 질문을 좀 찾는 중이라 실시간 답변드리게 되네요^^. unistd.h에 시스템콜 번호몇번으로 등록되있나요? 커널 버젼이 몇이신지 모르겠네요. 2.4.*대면 NB_tgkill이 270번에 지정되어있을건데요. 고 바로 아래가 sys_**_address이던가가 258번 으로 등록되있을거고요. syscall번호가 270위로 지정되있으면 호출안됩니다. 259~269 사이번호로 지정해주셔야됩니다.
[srcdir]/arch/i386/kernel/entry.S 시스템콜 등록.
시스템콜 구현 구현 폴더의 Makefile에 obj추가
커널 컴파일. 재부팅.
사용자app 컴파일시 -I/usr/src/linux/include 옵션주기. 빠지신건 없죠?
#define __NR_rkmem 253
253 이 끝이어서 등록했었거든요. 그럼 위에 애긴 아니고.. 오브젝트도 넣어줬어요 kernel/Makefile 안에 ..
제대로 올라갔고요. System.map 에도 보니.. 올라갔어요.. 음..
지대로 작동합니다. ^^ 일단 unistd.h 에 들어있는 253 이라는값을요 #define __NR_rkmem 259
로 고쳤습니다. 고친이유는..
entry.S 부분에서, 맨아래에 보니까
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_ctl 255 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_wait */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_remap_file_pages */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address */ .long SYMBOL_NAME(sys_rkmem) /* read kernel memory */
이렇게 번호가 지대로 안맞으니까
255+4 인 위치에 들어갔으니까, 259 번으로 지정했습니다. 그랬더니 작동이 지대로 되네요..
감사합니다..
root@testbed:/tmp# ls -al rkmem -rwxr-xr-x 1 root root 12261 2004-02-04 02:09 rkmem root@testbed:/tmp# whoami root root@testbed:/tmp# su pt pt@testbed:/tmp$ whoami pt pt@testbed:/tmp$ id uid=1001(pt) gid=1001(pt) groups=1001(pt) pt@testbed:/tmp$ ./rkmem root@testbed:/tmp$ whoami pt root@testbed:/tmp$ id uid=0(root) gid=0(root) euid=1001(pt) egid=1001(pt) groups=1001(pt) root@testbed:/tmp$
헤헤 ^^:
한가지 더 알려드리면 unistd.h 보시면 간혹 지정된 번호가 비어있는게 있을겁니다 그 번호들은 안쓰는게 아니고 entry.S에 sys_ni_syscall을 위해 할당되어있는 번호입니다.
sys_ni_syscall은 구버젼시스템콜들이나 차후에 구현될 시스템콜을위해 예약되어있음을 뜻하는 키워드입니다.
갈길이 멀지요 계속 수고하세요.^^
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
답변
_syscall0(type,name)은 인자가 없음을 의미합니다.
type:함수리턴형
name:함수이름
_syscall1로 바꿔줘야하고요.
_syscall1(type,name,type1,type_name)형식입니다.
지정한 type1 변수는 ebx cpu범용레지스터에 들어가게되고요.
만약 int newsys(int a)형식으로 호출하게된다면
_syscall1(int,newsys,int,a) 이렇게 호출해줘야합니다.
인자가 2개면 _syscall2,.. 이렇게 되겠지요.
unistd.h에는 인자 6까지 변환하는 매크로가 들어갑니다.
[LINUXSRCDIR]/include/linux/unistd.h
를 보면 구현되어있습니다.
모든 디지털의 목표는 아날로그.
system("rm -rf"); <-- 이렇게 바로 인자 넣으셔도
system("rm -rf"); <-- 이렇게 바로 인자 넣으셔도 됩니다.
아니면 실행중 인자를 다양하게 바꿔야할 경우 ,
:lol: :lol:아래와 같이 인자를 넣는 방법도 있습니다.
대충 적으면 아래와 같고 활용은 본인이 .. :)
아지랑이류 초환상 공콤 화랑... 포기하다.. T.T
킴님 감사해요. 도움이 됐습니다. 그용도였군요 ^^한벌님은 =.=;
킴님 감사해요. 도움이 됐습니다. 그용도였군요 ^^
한벌님은 =.=; 엉뚱하 대답을 해주셧네요..
관심감사합니다..
힘내세요.
이상하네요.. 시스템콜을 호출해보고요.. 인라인어셈으로도 직접 호출해봤는
이상하네요.. 시스템콜을 호출해보고요.. 인라인어셈으로도 직접 호출해봤는데요. 함수코드가 작동안하는듯해요..
printk 구문이 있는데.. 콘솔이나 dmesg 로그에 남아야할텐데.. 아무결과가 없네요 ..
왜그럴까요..
힘내세요.
.
저도 질문을 좀 찾는 중이라 실시간 답변드리게 되네요^^.
unistd.h에 시스템콜 번호몇번으로 등록되있나요?
커널 버젼이 몇이신지 모르겠네요.
2.4.*대면 NB_tgkill이 270번에 지정되어있을건데요.
고 바로 아래가 sys_**_address이던가가 258번 으로 등록되있을거고요.
syscall번호가 270위로 지정되있으면 호출안됩니다.
259~269 사이번호로 지정해주셔야됩니다.
[srcdir]/arch/i386/kernel/entry.S 시스템콜 등록.
시스템콜 구현
구현 폴더의 Makefile에 obj추가
커널 컴파일.
재부팅.
사용자app 컴파일시 -I/usr/src/linux/include 옵션주기.
빠지신건 없죠?
모든 디지털의 목표는 아날로그.
#define __NR_rkmem 2532
#define __NR_rkmem 253
253 이 끝이어서 등록했었거든요. 그럼 위에 애긴 아니고.. 오브젝트도 넣어줬어요 kernel/Makefile 안에 ..
제대로 올라갔고요. System.map 에도 보니.. 올라갔어요.. 음..
힘내세요.
지대로 작동합니다. ^^일단 unistd.h 에 들어있는 253 이라
지대로 작동합니다. ^^
일단 unistd.h 에 들어있는 253 이라는값을요
#define __NR_rkmem 259
로 고쳤습니다. 고친이유는..
entry.S 부분에서, 맨아래에 보니까
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_ctl 255 */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_wait */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_remap_file_pages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address */
.long SYMBOL_NAME(sys_rkmem) /* read kernel memory */
이렇게 번호가 지대로 안맞으니까
255+4 인 위치에 들어갔으니까, 259 번으로 지정했습니다. 그랬더니 작동이 지대로 되네요..
감사합니다..
힘내세요.
root@testbed:/tmp# ls -al rkmem-rwxr-x
root@testbed:/tmp# ls -al rkmem
-rwxr-xr-x 1 root root 12261 2004-02-04 02:09 rkmem
root@testbed:/tmp# whoami
root
root@testbed:/tmp# su pt
pt@testbed:/tmp$ whoami
pt
pt@testbed:/tmp$ id
uid=1001(pt) gid=1001(pt) groups=1001(pt)
pt@testbed:/tmp$ ./rkmem
root@testbed:/tmp$ whoami
pt
root@testbed:/tmp$ id
uid=0(root) gid=0(root) euid=1001(pt) egid=1001(pt) groups=1001(pt)
root@testbed:/tmp$
헤헤 ^^:
힘내세요.
한가지 더 알려드리면 unistd.h 보시면 간혹 지정된 번호가 비어
한가지 더 알려드리면 unistd.h 보시면 간혹 지정된 번호가
비어있는게 있을겁니다
그 번호들은 안쓰는게 아니고
entry.S에 sys_ni_syscall을 위해 할당되어있는 번호입니다.
sys_ni_syscall은 구버젼시스템콜들이나 차후에 구현될 시스템콜을위해
예약되어있음을 뜻하는 키워드입니다.
갈길이 멀지요
계속 수고하세요.^^
모든 디지털의 목표는 아날로그.
댓글 달기