반응형

x32/x64 디버거에서 심볼파일(pdb)을 불러오자.

 

디버깅할 프로세스를 불러온다.

 

심볼파일을 불러온다.

symload module_name, path

 

심볼파일이 존재하면 완료 메세지가 뜬다.

 

심볼 윈도우에서 모듈을 선택하고 심볼을 확인한다.

만약 프로그램 파일이 존재하는 디렉토리에 심볼파일이 같이 존재하면 자동으로 로드된다.

 

※ 참고

symload/loadsym

symunload/unloadsym

 

반응형
Posted by J-sean
:
반응형

기드라에서 디스어셈블되지 않고 Opcode로 표시된 명령을 디스어셈블하고 함수로 등록해 보자.

 

리스트창을 보면 디스어셈블되지 않고 Opcode로만 표시된 부분이 있을 수 있다.

 

디스어셈블 하고 싶은 부분의 첫 명령어에서 우클릭 - Disassemble을 클릭한다.

Disassemble(Restricted), Disassemble(Static)은 한 줄(혹은 블럭으로 지정된 부분)만 디스어셈블한다.

 

Opcode로만 표시되던 명령어가 디스어셈블되었다.

 

함수 전체가 디스어셈블 되지 않고 Opcode로만 표시되었다.

 

 

첫 코드에서 우클릭 - Disassemble을 클릭한다.

 

디스어셈블 되었으면 다시 우클릭 - Create Function을 클릭한다.

 

디스어셈블된 부분이 함수로 등록되었다.

 

반응형
Posted by J-sean
:
반응형

Ghidra로 패치한 파일을 저장해 보자.

 

패치할 프로그램을 임포트한다.

 

WindowsPE x86 Propagate External Parame... 옵션을 선택하고 분석한다.

 

패치가 필요한 코드에서 우클릭 - Patch Instruction을 선택한다.

 

어셈블리 명령을 수정한다.

 

 

수정이 완료되었다.

 

File - Export Program...을 선택한다.

 

Format은 PE로 바꾸고 Output File을 적당히 지정하고 OK를 클릭한다.

 

Export 결과가 표시된다.

 

 

패치된 파일을 실행해본다.

 

반응형
Posted by J-sean
:
반응형

네이버 클라우드 플랫폼의 리버스 지오코딩을 사용해 보자.

 

2022.02.05 - [Android] - Naver Geocoding For Android 안드로이드 네이버 지오코딩

위 링크를 참고해 인터넷 권한과 network_security_config 옵션을 설정한다.

 

리니어 레이아웃에 텍스트뷰와 버튼을 적당히 배치한다.

 

JSON 타입의 주소 정보를 처리하기 위해 관련 클래스를 작성한다.

주소 정보 관련 클래스는 아래 파일을 사용하자.

myapplication.zip
0.00MB

 

JSON 데이터를 처리하기 위해 gson을 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.example.myapplication;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
import com.google.gson.Gson;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class MainActivity extends AppCompatActivity {
 
    TextView textView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.textView);
 
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        requestGeocode();
                    }
                }).start();
            }
        });
    }
 
    public void requestGeocode() {
        try {
            BufferedReader bufferedReader;
            StringBuilder stringBuilder = new StringBuilder();
            String coord = "127.1234308,37.3850143";
            String query = "https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?request=coordsToaddr&coords="
                    + coord + "&sourcecrs=epsg:4326&output=json&orders=roadaddr&output=xml";
            URL url = new URL(query);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            if (conn != null) {
                conn.setConnectTimeout(5000);
                conn.setReadTimeout(5000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("X-NCP-APIGW-API-KEY-ID""Client ID");
                conn.setRequestProperty("X-NCP-APIGW-API-KEY""Client Secret");
                conn.setDoInput(true);
 
                int responseCode = conn.getResponseCode();
 
                if (responseCode == 200) {
                    bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                } else {
                    bufferedReader = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
                }
 
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line + "\n");
                }
                //textView.setText(stringBuilder);
 
                Gson gson = new Gson();
                Address address = gson.fromJson(String.valueOf(stringBuilder), Address.class);
 
                String finalAddress = null;
                finalAddress = address.results[0].region.area1.name;
                finalAddress += address.results[0].region.area2.name;
                finalAddress += address.results[0].region.area3.name;
                finalAddress += address.results[0].region.area4.name;
                finalAddress += address.results[0].land.addition0.value;
 
                textView.setText(finalAddress);
 
                bufferedReader.close();
                conn.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 

 

소스를 입력하고 빌드한다. 주소로 변환할 GPS 좌표는 (127.1234308, 37.3850143) 이다.

 

 

앱을 실행하고 버튼을 터치하면 GPS 좌표가 주소로 변환되어 표시된다.

아래와 같은 양식의 curl 명령으로도 같은 JSON 데이터를 얻을 수 있다.

curl "https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?request=coordsToaddr&coords=127.1234308,37.3850143&sourcecrs=epsg:4326&output=json&orders=roadaddr&output=xml" -H "X-NCP-APIGW-API-KEY-ID: Client ID" -H "X-NCP-APIGW-API-KEY: Client Secret" -v

-v, --verbose
Makes curl verbose during the operation. Useful for debugging and seeing what's going on "under the hood". A line starting with '>' means "header data" sent by curl, '<' means "header data" received by curl that is hidden in normal cases, and a line starting with '*' means additional info provided by curl.

If you only want HTTP headers in the output, --include might be the option you are looking for.
If you think this option still does not give you enough details, consider using --trace or --trace-ascii instead.
This option is global and does not need to be specified for each use of -:, --next.
Use --silent to make curl really quiet.
Example:
 curl --verbose https://example.com

 

반응형
Posted by J-sean
:
반응형

x64dbg에서 패치한 파일은 아래와 같이 ollydbg와는 다른 방식으로 저장한다.

 

필요한 부분을 패치 한다. 아래 예에서는 4바이트를 패치 했다.

 

File - Patch file... 을 클릭 한다.

 

패치된 4바이트가 표시 된다. Patch File 버튼을 클릭 한다.

 

원하는 이름을 입력하고 저장 버튼을 클릭 한다.

 

 

패치가 적용되었다는 메세지 박스가 나타난다.

 

지정된 폴더에 패치된 파일이 생성되어 있다.

 

 

 

 

반응형
Posted by J-sean
:

Back to user mode

Reverse Engineering 2019. 2. 10. 22:21 |
반응형

프로세서가 kernel mode에서 user mode로 변경되는 시점을 간단히 찾을 수 있다. (User mode and kernel mode)

 

 

 

예를 들어 Message box가 종료되는 지점을 찾아 보자. ollydbg에서 분석할 프로그램을 열어 준다.

 

RegisterMe.zip
0.00MB

(password: lena)

 

 

F9를 눌러 실행 한다.

 

아래와 같은 Message box가 나타난다.

 

F12를 눌러 정시 시킨다.

 

 

아래와 같은 곳으로 이동 된다.

 

Alt + F9를 눌러 back to user mode를 실행 한다.

 

오른쪽 아래에 Till user가 표시 된다.

 

'Register Me' 메세지 박스에서 '확인'을 클릭하면 아래와 같이 MessageBoxA CALL 이 종료되는 시점에서 정지 된다.

 

 

이번엔 scanf 가 종료되는 지점을 찾아 보자. 아래와 같은 소스로 실행 파일을 만들어 준다. (

FindMe.zip
다운로드

)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int i;
 
    printf("Enter a number: ");
    scanf_s("%d"&i);
    printf("Number: %d", i);
 
    return 0;
}
cs

 

ollydbg(v.2.01)로 열어 준다.

 

F9를 눌러 실행 한다.

 

아래와 같이 숫자를 입력하는 콘솔창이 뜬다.

 

 

다시 ollydbg로 돌아와 F12를 눌러 정지 시킨다. 하지만 여기서는 Paused 상태가 되지 않고 Pausing 상태가 된다.

 

콘솔창에서 숫자를 입력 한다.

 

숫자를 입력하면 아래와 같은 주소로 이동하고 정지 상태가 된다.

 

F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.

 

 

같은 파일을 x32dbg로 열어 보자.

 

F9를 눌러 진행 한다.

 

한번 더 F9를 눌러 진행하면 아래와 같이 Running 상태가 된다.

 

숫자를 입력하라는 콘솔창이 뜬다.

 

 

x32dbg로 돌아가 Threads 창을 열어 준다.

 

Title Bar에는 Main Thread가 선택되어 있는 것 처럼 표시 되지만 Main Thread가 아닌 2번 thread가 활성화 되어 있다. 이 상태에서는 break point가 제대로 작동하지 않는다. Main Thread를 활성화 해 준다.

 

아래와 같은 주소로 이동 된다. F12를 눌러 Pause 한 후(F12를 한 번 누르면 화면에는 아무것 도 표시되지 않는다. 두 번 누르면 Error setting breakpoint at XXXXXXXX! (SetBPX) 가 표시 되지만 무시하자) 콘솔창에서 숫자를 입력한다.

 

숫자를 입력하고 나면 아래와 같이 Paused 상태가 된다.

 

 

F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.

 

스크롤을 조금 올려 보면 프로그램의 전체적인 내용을 파악 할 수 있다. pdb파일이 같이 있기 때문에 소스 라인까지 표시 된다.

 

 

반응형

'Reverse Engineering' 카테고리의 다른 글

x64dbg Color Scheme 바꾸기  (0) 2019.02.19
Cheat Engine으로 Pointer 찾기  (2) 2019.02.13
Windows 10에서 *.hlp 파일 열기  (10) 2019.02.05
IDA Pro Skin 바꾸기  (1) 2019.02.04
ollydbg Jump 위치 표시  (2) 2019.02.02
Posted by J-sean
: