Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
1

Разбор программы

26.03.2013, 14:02. Показов 2230. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вобщим я пытаюсь сделать для игры NOCD ексешник, что бы СД не запрашивало. Дизасемблировал код, где идет проверка на СД привод. Не могу разобрать все до конца. Вот код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:004D1D3C                 push    offset aMaingamewindow ; "MainGameWindow"
.text:004D1D41                 push    offset aTombRaiderChro ; "Tomb Raider Chronicles"
.text:004D1D46                 call    sub_403206
.text:004D1D4B                 add     esp, 48h
.text:004D1D4E                 test    al, al
.text:004D1D50                 jnz     loc_4D2156
.text:004D1D56                 call    sub_402B49 ;переход на процедуру проверки приводов
.text:004D1D5B                 test    al, al
.text:004D1D5D                 jnz     short loc_4D1D84
.text:004D1D5F
.text:004D1D5F loc_4D1D5F:                             ; CODE XREF: _WinMain@16_0+182j
.text:004D1D5F                 push    25h             ; uType
.text:004D1D61                 push    offset Caption  ; "Tomb Raider"
.text:004D1D66                 push    offset aTombRaiderCh_0 ; "Tomb Raider Chronicles CD"
.text:004D1D6B                 push    ebx             ; hWnd
.text:004D1D6C                 call    ds:MessageBoxA ;окно с просьбой вставить СД
.text:004D1D72                 cmp     eax, 2
.text:004D1D75                 jz      loc_4D2156
.text:004D1D7B                 call    sub_402B49
.text:004D1D80                 test    al, al
.text:004D1D82                 jz      short loc_4D1D5F
И сама функция проверки привода:
Assembler
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
.text:00402B49 sub_402B49      proc near               ; CODE XREF: _WinMain@16_0+156p
.text:00402B49                                         ; _WinMain@16_0+17Bp
.text:00402B49                 jmp     sub_4A3BC0
.text:00402B49 sub_402B49      endp
 
 
.text:004A3BC0 sub_4A3BC0      proc near               ; CODE XREF: sub_402B49j
.text:004A3BC0
.text:004A3BC0 RootPathName    = byte ptr -18h
.text:004A3BC0 FileName        = byte ptr -10h
.text:004A3BC0 var_C           = dword ptr -0Ch
.text:004A3BC0 var_8           = dword ptr -8
.text:004A3BC0 var_4           = word ptr -4
.text:004A3BC0
.text:004A3BC0                 sub     esp, 18h
.text:004A3BC3                 mov     eax, dword_5165DC
.text:004A3BC8                 mov     ecx, dword_5165E0
.text:004A3BCE                 mov     edx, dword_5165E4
.text:004A3BD4                 push    ebx
.text:004A3BD5                 mov     dword ptr [esp+1Ch+FileName], eax
.text:004A3BD9                 mov     ax, word_5165E8
.text:004A3BDF                 push    esi
.text:004A3BE0                 push    edi
.text:004A3BE1                 mov     [esp+24h+var_C], ecx
.text:004A3BE5                 mov     [esp+24h+var_8], edx
.text:004A3BE9                 mov     [esp+24h+var_4], ax
.text:004A3BEE                 call    ds:GetLogicalDrives
.text:004A3BF4                 lea     ecx, [esp+24h+RootPathName]
.text:004A3BF8                 push    offset String2  ; lpString2
.text:004A3BFD                 push    ecx             ; lpString1
.text:004A3BFE                 mov     ebx, eax
.text:004A3C00                 mov     byte_874960, 41h
.text:004A3C07                 call    ds:lstrcpyA
.text:004A3C0D                 test    ebx, ebx
.text:004A3C0F                 jz      short loc_4A3C72
.text:004A3C11                 mov     edi, ds:GetDriveTypeA
.text:004A3C17                 mov     esi, ds:CreateFileA
.text:004A3C1D
.text:004A3C1D loc_4A3C1D:                             ; CODE XREF: sub_4A3BC0+B0j
.text:004A3C1D                 test    bl, 1
.text:004A3C20                 jz      short loc_4A3C60
.text:004A3C22                 mov     dl, byte_874960
.text:004A3C28                 lea     eax, [esp+24h+RootPathName]
.text:004A3C2C                 push    eax             ; lpRootPathName
.text:004A3C2D                 mov     [esp+28h+RootPathName], dl
.text:004A3C31                 call    edi ; GetDriveTypeA
.text:004A3C33                 cmp     eax, 5
.text:004A3C36                 jnz     short loc_4A3C60
.text:004A3C38                 mov     cl, byte_874960
.text:004A3C3E                 push    0               ; hTemplateFile
.text:004A3C40                 push    80h             ; dwFlagsAndAttributes
.text:004A3C45                 push    3               ; dwCreationDisposition
.text:004A3C47                 push    0               ; lpSecurityAttributes
.text:004A3C49                 push    0               ; dwShareMode
.text:004A3C4B                 lea     edx, [esp+38h+FileName]
.text:004A3C4F                 push    80000000h       ; dwDesiredAccess
.text:004A3C54                 push    edx             ; lpFileName
.text:004A3C55                 mov     [esp+40h+FileName], cl
.text:004A3C59                 call    esi ; CreateFileA
.text:004A3C5B                 cmp     eax, 0FFFFFFFFh
.text:004A3C5E                 jnz     short loc_4A3C7B
.text:004A3C60
.text:004A3C60 loc_4A3C60:                             ; CODE XREF: sub_4A3BC0+60j
.text:004A3C60                                         ; sub_4A3BC0+76j
.text:004A3C60                 mov     cl, byte_874960
.text:004A3C66                 inc     cl
.text:004A3C68                 shr     ebx, 1
.text:004A3C6A                 mov     byte_874960, cl
.text:004A3C70                 jnz     short loc_4A3C1D
.text:004A3C72
.text:004A3C72 loc_4A3C72:                             ; CODE XREF: sub_4A3BC0+4Fj
.text:004A3C72                 pop     edi
.text:004A3C73                 pop     esi
.text:004A3C74                 xor     al, al
.text:004A3C76                 pop     ebx
.text:004A3C77                 add     esp, 18h
.text:004A3C7A                 retn
Во первых мне не понятно это:

Assembler
1
2
3
.text:004A3BC3                 mov     eax, dword_5165DC
.text:004A3BC8                 mov     ecx, dword_5165E0
.text:004A3BCE                 mov     edx, dword_5165E4
Согласно данным:

Assembler
1
2
3
.data:005165DC dword_5165DC    dd 735C3A63h            ; DATA XREF: sub_4A3BC0+3r
.data:005165E0 dword_5165E0    dd 70697263h            ; DATA XREF: sub_4A3BC0+8r
.data:005165E4 dword_5165E4    dd 61642E74h            ; DATA XREF: sub_4A3BC0+Er
И эти данные должны быть строками мне каежться. Как перевести эти числа шестнадцатеричные в строку?

Функция:

Assembler
1
.text:004A3C11                 mov     edi, ds:GetDriveTypeA
должна принимать строку- имя буквы дисковода, который нужно проверить СД он или нет. Где эта буква прячется, что бы ее увидеть? Тут есть какие то строки:

Assembler
1
2
3
.text:004A3BF4                 lea     ecx, [esp+24h+RootPathName]
.text:004A3BF8                 push    offset String2  ; lpString2
.text:004A3BFD                 push    ecx             ; lpString1
где:

Assembler
1
2
.data:005165D8 String2         dd offset unk_5C3A41    ; DATA XREF: sub_4A3BC0+38o
.data:005C3A41 unk_5C3A41      db    ? ;               ; DATA XREF: .data:String2o
То есть тут как раз и копируеться буква дисковода, что бы проверить он СД или нет. Где же эта буква дисковода?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2013, 14:02
Ответы с готовыми решениями:

Разбор программы
Всем доброго времени суток. Сестра просит объяснить что и как делает программа хотябы в общих...

Разбор программы считающей сумму чисел в массиве
Здравствуйте! Вот у меня есть программа которая считает сумму чисел массива. Но я её не совсем...

Разбор программы "Архиватор"
Всем доброго времени суток, ребят мне нужна помощь в программе, точнее прога есть, но не понимаю в...

Разбор программы
После недели освоения cuda и разбора программ,наткнулся на урок по куда,прилагается программа...

12
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
26.03.2013, 14:20 2
Цитата Сообщение от kurlyak Посмотреть сообщение
Как перевести эти числа шестнадцатеричные в строку?
c:\script.da - Ваша строка.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
26.03.2013, 16:15 3
Assembler
1
2
3
.text:004A3BC0 inc al
.text:004A3BC2 mov     byte_874960, al
retn
IMHO, чохом решит проблему, вообще без разруливания потрохов.
0
Ab
76 / 76 / 2
Регистрация: 03.05.2012
Сообщений: 161
27.03.2013, 06:05 4
Цитата Сообщение от Charles Kludge Посмотреть сообщение
IMHO, чохом решит проблему, вообще без разруливания потрохов.
Это вряд ли. В byte_874960 должна быть буква диска, а не 0x01. И эта буква, скорее всего, не просто так в глобальную переменную пишется, а чтобы по ходу программы повторно к диску обращаться. Проверить 1 раз наличие файла script.dat в корневом каталоге было бы слишком просто.
0
Ушел с форума
Автор FAQ
16339 / 7659 / 1076
Регистрация: 11.11.2010
Сообщений: 13,702
27.03.2013, 08:31 5
Цитата Сообщение от kurlyak Посмотреть сообщение
пытаюсь сделать для игры NOCD ексешник, что бы СД не запрашивало. Дизасемблировал код, где идет проверка на СД привод. Не могу разобрать все до конца. Вот код:
kurlyak,
проверку идет загрузка с CD или нет осуществляет функция GetDriveTypeA
Assembler
1
2
3
4
.text:004A3C31                 call    edi ; GetDriveTypeA
.text:004A3C33                 cmp     eax, 5
.text:004A3C36                 jnz     short loc_4A3C60
.text:004A3C38                 mov     cl, byte_874960
вот ее трактование из MSDN
Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive. To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty and specify the SPDRP_REMOVAL_POLICY property.
Syntax
C++ (Qt)
1
2
3
UINT WINAPI GetDriveType(
  _In_opt_  LPCTSTR lpRootPathName
);
Parameters
lpRootPathName [in, optional]
The root directory for the drive.
A trailing backslash is required. If this parameter is NULL, the function uses the root of the current directory.
Return value
The return value specifies the type of drive, which can be one of the following values.
Return code value Description
DRIVE_UNKNOWN0The drive type cannot be determined.
DRIVE_NO_ROOT_DIR1The root path is invalid; for example, there is no volume mounted at the specified path.
DRIVE_REMOVABLE2The drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.
DRIVE_FIXED3The drive has fixed media; for example, a hard disk drive or flash drive.
DRIVE_REMOTE4The drive is a remote (network) drive.
DRIVE_CDROM5The drive is a CD-ROM drive.
DRIVE_RAMDISK 6The drive is a RAM disk.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
27.03.2013, 08:44 6
Цитата Сообщение от Ab Посмотреть сообщение
Это вряд ли.
Угу. Вы мне это как-нибудь потом расскажете. Первый взлом HASP'a под Netware (1995) состоял примерно из такой же борзости и обошёлся заказчику в $300. 6 байтов.
Ломать - не строить, тут думать надо.
0
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
28.03.2013, 11:16  [ТС] 7
Спасибо за ответы.

Во первых Vadimych как вы определили что именно эта строка - моя строка, как перекодировали, или что? Самое главное что есть такой файл script.dat.

Во вторых пробовал в коде поменять 5 (СД РОМ) на 3 (ХДД):

Assembler
1
2
3
4
.text:004A3C31                 call    edi ; GetDriveTypeA
.text:004A3C33                 cmp     eax, 3
.text:004A3C36                 jnz     short loc_4A3C60
.text:004A3C38                 mov     cl, byte_874960
Ниче не вышло.
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
28.03.2013, 11:28 8
Цитата Сообщение от kurlyak Посмотреть сообщение
как вы определили что именно эта строка - моя строка
Написал программку и посмотрел.

Assembler
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
.model tiny
.code
.486
org 100h
start:
 
mov edi,offset string
mov esi,edi
mov dx,di
 
mov cx,3
@@:
lodsd
bswap eax 
stosd
loop @b
 
mov ah,9
int 21h
 
xor ax,ax
int 16h
ret
string db 73h,5Ch,3Ah,63h,70h,69h,72h,63h,61h,64h,2Eh,74h,'$'
end start
0
Ушел с форума
Автор FAQ
16339 / 7659 / 1076
Регистрация: 11.11.2010
Сообщений: 13,702
28.03.2013, 11:30 9
kurlyak, а может быть проще нопами забить строку
Assembler
1
.text:004A3C36                 jnz     short loc_4A3C60
всего-то два байта
0
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
28.03.2013, 12:34  [ТС] 10
Mikl___ пробовал забить двумя нопами- ниче не вышло, требует СД. Мне кажеться что в переменную byte_874960 заносяться 0 или 1 соответственно буквам дисковода. Например есть А,(Б нету),С,Д значит byte_874960 будет равен 1011. Это мне так думаеться. Но в эту переменную byte_874960 в начале процедуры проверки заноситься:

Assembler
1
004A3C00                 mov     byte_874960, 41h
41h значит 1000001 в двоичном, что меня сбивает с толку- типа значит А есть остальных нету, но 1 посленяя вобще не пойму.

Далее я написал небольшую программку на Си++ для перевода симоволов, но у меня получаеться бред на выводе:
C++ (Qt)
1
2
3
char szBuff[256];
sprintf_s(szBuff,256,"%c %c %c %c %c\n%c %c %c %c %c\n%c %c %c %c %c", 0x73, 0x5C, 0x3A, 0x63, 0x70, 0x69, 0x72, 0x63, 0x61, 0x64, 0x2E, 0x74);
MessageBox(NULL, szBuff, "Information", MB_OK);
Я так понимаю что моя программка на Си++ использует кодировку Виндовс, а ваша программа на АСМ использует какую то другую кодировку. Как мне на Си++ использовать вашу кодировку? Просто я больше 6- ти лет шарю на Си++ мне этот язык ближе. Но в АСМ тоже малехо разбираюсь, писал для себя небольшие демки давно очень на АСМ.

И дальше еще вопрос. Почему одна строка эта что надо перевести- почему она разбиваеться на 3 части, и заноситься в 3 разных регистра процессора? Как она собираеться в одно целое? Я так думаю может в этом коде:

Assembler
1
.text:004A3C07                 call    ds:lstrcpyA
А потом вызываеться функция:

Assembler
1
.text:004A3C17                 mov     esi, ds:CreateFileA
которая создает поток ввода- вывода и тем самым проверяеться есть ли этот файлик script.dat на данном носителе который мы получили перед этим функциями GetLogicalDrives и GetDriveTypeA. Если есть файлик на носителе- значит это наш СД РОМ с игрой. Если нету- значит идет поиск дальше.

Я немного запутался.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
28.03.2013, 12:44 11
Цитата Сообщение от kurlyak Посмотреть сообщение
Как перевести эти числа шестнадцатеричные в строку?
Нажмите Alt+A или просто A если тип строк уже настроен.
0
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919
28.03.2013, 17:25  [ТС] 12
Спасибо, я уже взламал игруху, идет без СД. Кстати, насчет этих строк- то в ассемблере они храняться наоборот чем в С++. Поэтому я вывернул строки наоборот- и прочитал строку. Вобще то взял просто сделал так, что игра не заходит в функцию проверки наличия СД- на месте функции проверки СД я отредактировал бинарник и возвращаю true- типа проверка пройдена успешно, и все. Дальше игруха сама находит текущий каталог.

Все спасибо, братва.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
29.03.2013, 16:04 13
Цитата Сообщение от kurlyak Посмотреть сообщение
и возвращаю true- типа проверка пройдена успешно, и все.
Дык, что и имелось в виду. Я рад за вас.
0
29.03.2013, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2013, 16:04
Помогаю со студенческими работами здесь

Разбор программы
Помогите пожалуйста, что делает оператор unuse:= и create(1,unuse,combinate) Сама программа...

Разбор программы
Начал изучать WPF и столкнулся с проблемой. Не могу до конца разобрать программой. То что не...

разбор программы
Друг написал прогу, но комментарии к ней не сделал, поэтому не понятно. Помогите разобраться с...

разбор программы
друзья хотел бы попросить помощи с одной программой, в программировании не разбираюсь по єтому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru