Category Archives: 지식

G5 마우스 세팅 in linux

우연찮게 https://wiki.archlinux.org/index.php/All_Mouse_Buttons_Working 이페이지를 보던중

나한테 도움되는 내용이 있어서

 

로지텍 G5 마우스의 DPI 설정 g5mouse을 해주는파일이다.

 

신형은 소스를 수정요,  #define MOUSE_G5 0xc041 to #define MOUSE_G5 0xc049 and recompile.

 

부팅시마다 DPI 올리는 버튼 누르는게 귀찮았는데

이걸 스크립트에 작성해놓으면 히히힣

 

 

혹시몰라서 소스도 업로드 해놓음.

 

5736075305.c

 

아래는 파이썬으로 같은내용 구현한거 ㅇㅇ

g5mouse.py

/usr/sbin/g5mouse.py -n  -d 1600 -l NONE /dev/usb/hiddev0

이런식으로 rc.local 등록해두면 편함 ㅇㅇ

OpenWRT DIR-825 Failsafe 모드

WRT 설치하고 몇일동안 신나게 세팅했다 -_-

근데 iptables 건들다가

으앜! accept 를 다날려먹고 그걸 적용시켜버렸어 ㅠㅠ

pc에서 더이상 이더넷을 통한 접속은 impossible

혹시나 리셋 누르면서 전원 넣으면 복구될지 …

해봣는데 반응없어 ㅠㅠ

웹 뒤지고 뒤지다가

http://wiki.openwrt.org/doc/howto/generic.failsafe

이걸 발견!

1. Set your computer's IP to 192.168.1.2, subnet 255.255.255.0

2. Power cycle the router (turn off and turn on)

3.Immediately after the above step, rapidly click a button on the router for 60 seconds (it may be any button). Note: If your router has a ridiculously long boot time (such as DIR-300 A), then you may do this for a longer time.

전원 넣을때 빠르게 뭔가를 클릭하면 된다는데

뭔가가 WDS 버튼이었다 -_-

열심히 광클해주니까

전원램프가 빠르게 깜빡거리더니 나중에는 미친듯 깜빡거림

그와동시에 192.168.1.1 핑나가고 , 펌웨어 재설치 해주고 상황종료

여기다가 USB mod  해서 2개의 USB 포트를 만들생각이었는데

요즘 하는거마다 뻑나서 나중에 해야겠다 ㅠ

그나저나 내 세팅값 어디로 ㅠㅠ

esp와 ebp의 차이

32비트 레지스터 – 접두어로 Extended의 E를 따다 쓴다
EAX – Accumulator Register  누산기에 해당하며 대부분의 연산들이 수행된다.
EBX – Base Register  일반적인 데이터 레지스터로, 원래 16비트 모드에서는 포인터로 사용했다.
ECX – Counter Register  개수, 횟수 등을 저장하는 카운터로 주로 사용된다.
EDX – Data Register  누산기의 확장으로 누산기와 관련된 연산에서 사용된다. EDX와 EAX를 합쳐 64비트 연산을 하는 경우가 대표적이다.
ESI – Source Index  문자열 연산에서 사용되는 원본 주소를 담는다.
EDI – Destination Index   문자열 연산에서 사용되는 목적 주소를 담는다.
EBP – Base Pointer  현재 스택 프레임의 주소를 담으며, 일반적인 목적으로 쓰기도 한다.
ESP – Stack Pointer  스택의 꼭대기 주소를 담는다.
EIP – Instruction Pointer  현재 실행되는 명령의 주소를 담는다.
16비트 – 32비트 레지스터 에서 E만 빼면된다 ( ex > EAX – AX )  당연하겠지만 오버플로는 버려진다.
8비트 – AH,AL 같이 H와 L 이 접미사로 붙는다 H(high)는 상위 8비트 L(low)는 하위 8비트로 나타낸다
64비트 – E의 접두어 대신에 R을 쓴다 (ex > EAX – RAX )
세그멘테이션 (Segmentation:분할,구분)
CS (Code Segment) – 프로그램의 실행명령어(Instruction) 들이 저장되어있는 공간 (함수)
DS (Data Segment) – 데이터들이 저장되어있는공간 (전역변수,상수)
SS (Stack Segment) – 스택 메모리의 공간 (지역변수)
ES (Extra Segment) – 변수들을 위한 추가 메모리 영역
플래그(Flag:깃발,신호기)
    제어플래그 – 프로세서의 동작을 제어하는 플래그
    DF(Direction Flag:방향 플래그) – movs나 cmps 같은 블록데이터이동방향 결정 (1이면 감소)
    IF(Interrupt Flag:인터럽트 플래그) – 1이면 인터럽트 사용가능
    TF(Trap Flag:트랩 플래그) – 1이면 명령어 수행시마다 정지(Trap)
    상태플래그 – 특정 명령의 결과를 나타내는 플래그
    CF(Carry Flag:캐리 플래그) – MSB(최상위비트)에서 올림수 또는 내림수가 발생하면 SET
    OF(Overflow Flag:오버플로 플래그) – 결과가 2의보수로 표현할수있는범위가 아니면 SET
    SF(Sign Flag:부호 플래그) – 결과가 음수이면 SET
    ZF(Zero Flag:제로 플래그) – 결과가 0 이면 SET
    AF(Auxiliary Carry Flag:보조캐리 플래그) – 3번째와 4번째비트간에 캐리가 발생하면 SET
    PF(Parity Plag:패리티 플래그) – 짝수 패리티일경우 SET
사용자 삽입 이미지
참고문서 :

메모리 구조

메모리 구조에대해서 정리를 해보려고 한다 (메모리 구조가 맞나?)
아래는 간단한 함수, 전역변수, 지역변수, 동적할당, static(?) 의 주소값을 뿌려준다.
#include <stdio.h>
#include <stdlib.h>

void func1(){ return ; }
void func2(){ return ; }
void func3();  // 3번은 뒤에다가 선언
int g1=0;
int g2=0;

int main()
{
int l1=0;
int l2=0;

void * h1 = malloc(10);
void * h2 = malloc(10);

printf("global 1 : 0x%008X\n",&g1);
printf("global 2 : 0x%008X\n",&g2);
printf("local  1 : 0x%008X\n",&l1);
printf("local  2 : 0x%008X\n",&l2);
printf("heap   1 : 0x%008X\n",h1);
printf("heap   2 : 0x%008X\n",h2);
printf("\n");
printf("static 1 : 0x%08X\n","Alpha");
printf("static 2 : 0x%08X\n","Beta");
printf("\n");
printf("function1: 0x%08X\n",func1);
printf("function2: 0x%08X\n",func2);
printf("function3: 0x%08X\n",func3);
printf("mainfunc : 0x%08X\n",main);
free(h1);
free(h2);
return 0;
}
void func3(){ return ; }

이걸 실행시켰을때


global 1 : 0x0804A02C
global 2 : 0x0804A030
local  1 : 0xBFA3693C
local  2 : 0xBFA36938
heap   1 : 0x091C4008
heap   2 : 0x091C4018

static 1 : 0x08048818
static 2 : 0x08048831

function1: 0x08048564
function2: 0x08048569
function3: 0x080486CE
mainfunc ; 0x0804856E

이런 결과가 나온다

주소를 가지고 정렬해보면

// 코드 세그멘테이션(Code Segmentation)

함수들
function1: 0x08048564    // void func1(){ return ; }
function2: 0x08048569    // void func2(){ return ; }
mainfunc : 0x0804856E   // int main()
function3: 0x080486CE    // void func3(){ return ; } 메인뒤에 있다!
//데이터 세그멘테이션(Data Segmentation)
정적배열    
static 1 : 0x08048818    // printf("static 1 : 0x%08X\n","Alpha");
static 2 : 0x08048831    // printf("static 2 : 0x%08X\n","Beta");
전역변수
global 1 : 0x0804A02C    // int g1=0;
global 2 : 0x0804A030    // int g2=0;
동적할당 // 순서대로 늘어난다
heap   1 : 0x091C4008     // void * h1 = malloc(10);
heap   2 : 0x091C4018       // void * h2 = malloc(10);
// 주소가 확 늘어난다 !!  (단위가 틀려짐 !!)
//스택 세그멘테이션(Stack Segmentation)
지역변수 // 거꾸로 자람으로 스택방식인것을 확인할수있다.
local  2 : 0xBFA36938    // int l2=0;
local  1 : 0xBFA3693C    // int l1=0;
결론 : 지역변수만 거꾸로 늘어난다(스택)
간단하게 사용자 삽입 이미지 이걸 알아보는 실험? 이었다.