int main()
{
int a = 1;
int b = 2;
int c = a + b;
return c;
}
Как определить точку входа в программу если дизасемблируешь неизвестный *.exe
Написал на C++ программку в три строчки. Долго щелкал F7 в IDA, но так и не нашел, где же мой c = a + b. Посмотрел в студии там хоть код с ассемблерным сопоставляется.
Ты не забывай, что твоя с++ прога с собой еще и рантайм, для тебя скрытый тянет. Хочеш голую прогу - отрубай рантайм.
а кто сказал, что анализ дизассемблерного кода это легкое дело ? -я вот однажды анализировал код генерации серийника в WinZip, так там сам алгоритм был размазан на столько, что до сих пор не догоняю, как мне терпения хватило на это дело, что уже говорить о полном анализе всей проги
А вы бы лучше не писали как это гиморно, а написали бы возможные пути. Ну, или где почитать про это.
Дебагер то как раз при отладке сам точку входа найдёт и тебе покажет.
А вы бы лучше не писали как это гиморно, а написали бы возможные пути. Ну, или где почитать про это.[/quote]
В IDA есть встроенный отладчик.
[quote=bave]Так ты пользуйся то для этой цели как раз дебагером, а НЕ дизасемблером.
Дебагер то как раз при отладке сам точку входа найдёт и тебе покажет.[/quote]
По ходу аффтар хочет, чтобы дебаггир делал останов на main/WinMain.
Ну, насчет отладчика в IDA я не знал (опыта мало), но дело не в этом. Просто я хочу научиться разбираться в чужом коде, если он, например, написан криво. Одно дело, когда сам напишешь на асме прогу. Тут все понятно. Сразу видно, где начало, где конец. А если прога левая. Где вообще можно прочитать про это? Ну а в общем случае, наверное, да - нужно определить место нахождения main/WinMain.
а насчёт дизассемблирования : ты бы ещё на дельфи программу написал бы и просмотрел бы её, там вообще никаких концов не найдёшь (без DeDe вообще ничего не сделаешь).
Код:
А сие получаем Идой
Точка входа видна сразу, не так ли?
Код:
.text:00401060 public start
.text:00401060 start proc near
.text:00401060
.text:00401060 var_20 = dword ptr -20h
.text:00401060 var_1C = dword ptr -1Ch
.text:00401060 var_18 = dword ptr -18h
.text:00401060 ExceptionInfo = dword ptr -14h
.text:00401060 var_4 = dword ptr -4
.text:00401060
.text:00401060 push ebp
.text:00401061 mov ebp, esp
.text:00401063 push 0FFFFFFFFh
.text:00401065 push offset unk_422020
.text:0040106A push offset sub_4026C0
.text:0040106F mov eax, large fs:0
.text:00401075 push eax
.text:00401076 mov large fs:0, esp
.text:0040107D add esp, 0FFFFFFF0h
.text:00401080 push ebx
.text:00401081 push esi
.text:00401082 push edi
.text:00401083 mov [ebp+var_18], esp
.text:00401086 call ds:GetVersion
.text:0040108C mov dword_427C7C, eax
.text:00401091 mov eax, dword_427C7C
.text:00401096 shr eax, 8
.text:00401099 and eax, 0FFh
.text:0040109E mov dword_427C88, eax
.text:004010A3 mov ecx, dword_427C7C
.text:004010A9 and ecx, 0FFh
.text:004010AF mov dword_427C84, ecx
.text:004010B5 mov edx, dword_427C84
.text:004010BB shl edx, 8
.text:004010BE add edx, dword_427C88
.text:004010C4 mov dword_427C80, edx
.text:004010CA mov eax, dword_427C7C
.text:004010CF shr eax, 10h
.text:004010D2 and eax, 0FFFFh
.text:004010D7 mov dword_427C7C, eax
.text:004010DC push 0
.text:004010DE call sub_402450
.text:004010E3 add esp, 4
.text:004010E6 test eax, eax
.text:004010E8 jnz short loc_4010F4
.text:004010EA push 1Ch
.text:004010EC call sub_4011C0
.text:004010F1 add esp, 4
.text:004010F4
.text:004010F4 loc_4010F4: ; CODE XREF: start+88j
.text:004010F4 mov [ebp+var_4], 0
.text:004010FB call sub_401E50
.text:00401100 call ds:GetCommandLineA
.text:00401106 mov dword_429620, eax
.text:0040110B call sub_401C30
.text:00401110 mov dword_427C64, eax
.text:00401115 call sub_401720
.text:0040111A call sub_4015D0
.text:0040111F call sub_4011F0
.text:00401124 mov ecx, dword_427C98
.text:0040112A mov dword_427C9C, ecx
.text:00401130 mov edx, dword_427C98
.text:00401136 push edx
.text:00401137 mov eax, dword_427C90
.text:0040113C push eax
.text:0040113D mov ecx, dword_427C8C
.text:00401143 push ecx
[COLOR="Red"].text:00401144 call sub_401005[/COLOR]
.text:00401149 add esp, 0Ch
.text:0040114C mov [ebp+var_1C], eax
.text:0040114F mov edx, [ebp+var_1C]
.text:00401152 push edx
.text:00401153 call sub_401230
.text:00401158
.text:00401158 loc_401158: ; DATA XREF: .rdata:00422024o
.text:00401158 mov eax, [ebp+ExceptionInfo]
.text:0040115B mov ecx, [eax]
.text:0040115D mov edx, [ecx]
.text:0040115F mov [ebp+var_20], edx
.text:00401162 mov eax, [ebp+ExceptionInfo]
.text:00401165 push eax ; ExceptionInfo
.text:00401166 mov ecx, [ebp+var_20]
.text:00401169 push ecx ; int
.text:0040116A call sub_4013C0
.text:0040116F add esp, 8
.text:00401172 retn
.text:00401172 start endp ; sp = -34h
.text:00401060 start proc near
.text:00401060
.text:00401060 var_20 = dword ptr -20h
.text:00401060 var_1C = dword ptr -1Ch
.text:00401060 var_18 = dword ptr -18h
.text:00401060 ExceptionInfo = dword ptr -14h
.text:00401060 var_4 = dword ptr -4
.text:00401060
.text:00401060 push ebp
.text:00401061 mov ebp, esp
.text:00401063 push 0FFFFFFFFh
.text:00401065 push offset unk_422020
.text:0040106A push offset sub_4026C0
.text:0040106F mov eax, large fs:0
.text:00401075 push eax
.text:00401076 mov large fs:0, esp
.text:0040107D add esp, 0FFFFFFF0h
.text:00401080 push ebx
.text:00401081 push esi
.text:00401082 push edi
.text:00401083 mov [ebp+var_18], esp
.text:00401086 call ds:GetVersion
.text:0040108C mov dword_427C7C, eax
.text:00401091 mov eax, dword_427C7C
.text:00401096 shr eax, 8
.text:00401099 and eax, 0FFh
.text:0040109E mov dword_427C88, eax
.text:004010A3 mov ecx, dword_427C7C
.text:004010A9 and ecx, 0FFh
.text:004010AF mov dword_427C84, ecx
.text:004010B5 mov edx, dword_427C84
.text:004010BB shl edx, 8
.text:004010BE add edx, dword_427C88
.text:004010C4 mov dword_427C80, edx
.text:004010CA mov eax, dword_427C7C
.text:004010CF shr eax, 10h
.text:004010D2 and eax, 0FFFFh
.text:004010D7 mov dword_427C7C, eax
.text:004010DC push 0
.text:004010DE call sub_402450
.text:004010E3 add esp, 4
.text:004010E6 test eax, eax
.text:004010E8 jnz short loc_4010F4
.text:004010EA push 1Ch
.text:004010EC call sub_4011C0
.text:004010F1 add esp, 4
.text:004010F4
.text:004010F4 loc_4010F4: ; CODE XREF: start+88j
.text:004010F4 mov [ebp+var_4], 0
.text:004010FB call sub_401E50
.text:00401100 call ds:GetCommandLineA
.text:00401106 mov dword_429620, eax
.text:0040110B call sub_401C30
.text:00401110 mov dword_427C64, eax
.text:00401115 call sub_401720
.text:0040111A call sub_4015D0
.text:0040111F call sub_4011F0
.text:00401124 mov ecx, dword_427C98
.text:0040112A mov dword_427C9C, ecx
.text:00401130 mov edx, dword_427C98
.text:00401136 push edx
.text:00401137 mov eax, dword_427C90
.text:0040113C push eax
.text:0040113D mov ecx, dword_427C8C
.text:00401143 push ecx
[COLOR="Red"].text:00401144 call sub_401005[/COLOR]
.text:00401149 add esp, 0Ch
.text:0040114C mov [ebp+var_1C], eax
.text:0040114F mov edx, [ebp+var_1C]
.text:00401152 push edx
.text:00401153 call sub_401230
.text:00401158
.text:00401158 loc_401158: ; DATA XREF: .rdata:00422024o
.text:00401158 mov eax, [ebp+ExceptionInfo]
.text:0040115B mov ecx, [eax]
.text:0040115D mov edx, [ecx]
.text:0040115F mov [ebp+var_20], edx
.text:00401162 mov eax, [ebp+ExceptionInfo]
.text:00401165 push eax ; ExceptionInfo
.text:00401166 mov ecx, [ebp+var_20]
.text:00401169 push ecx ; int
.text:0040116A call sub_4013C0
.text:0040116F add esp, 8
.text:00401172 retn
.text:00401172 start endp ; sp = -34h
Смотрим на то, что вызывается из этой функции, все что выше sub_401005, явно носит служебный характер и даже не напоминает то, что мы написали. А вот sub_401005 заслуживает внимания, ибо ей пердается список аргументов коммандной строки. Значит это наш клиент(функция "main"), далее после вызова sub_401005 идет обработка исключений.
Смотрим саму sub_401005:
Код:
sub_401005 proc near ; CODE XREF: start+E4p
.text:00401005
.text:00401005 var_4C = dword ptr -4Ch
.text:00401005 var_C = dword ptr -0Ch
.text:00401005 var_8 = dword ptr -8
.text:00401005 var_4 = dword ptr -4
.text:00401005
.text:00401005 jmp loc_401010
.text:00401005 ; ---------------------------------------------------------------------------
.text:0040100A align 10h
.text:00401010
.text:00401010 loc_401010: ; CODE XREF: sub_401005j
.text:00401010 push ebp
.text:00401011 mov ebp, esp
.text:00401013 sub esp, 4Ch
.text:00401016 push ebx
.text:00401017 push esi
.text:00401018 push edi
.text:00401019 lea edi, [ebp+var_4C]
.text:0040101C mov ecx, 13h
.text:00401021 mov eax, 0CCCCCCCCh
.text:00401026 rep stosd
[COLOR="#ff0000"].text:00401028 mov [ebp+var_4], 1
.text:0040102F mov [ebp+var_8], 2
.text:00401036 mov eax, [ebp+var_4]
.text:00401039 add eax, [ebp+var_8]
.text:0040103C mov [ebp+var_C], eax
.text:0040103F mov eax, [ebp+var_C][/COLOR]
.text:00401042 pop edi
.text:00401043 pop esi
.text:00401044 pop ebx
.text:00401045 mov esp, ebp
.text:00401047 pop ebp
.text:00401048 retn
.text:00401048 sub_401005 endp ; sp = 4
.text:00401005
.text:00401005 var_4C = dword ptr -4Ch
.text:00401005 var_C = dword ptr -0Ch
.text:00401005 var_8 = dword ptr -8
.text:00401005 var_4 = dword ptr -4
.text:00401005
.text:00401005 jmp loc_401010
.text:00401005 ; ---------------------------------------------------------------------------
.text:0040100A align 10h
.text:00401010
.text:00401010 loc_401010: ; CODE XREF: sub_401005j
.text:00401010 push ebp
.text:00401011 mov ebp, esp
.text:00401013 sub esp, 4Ch
.text:00401016 push ebx
.text:00401017 push esi
.text:00401018 push edi
.text:00401019 lea edi, [ebp+var_4C]
.text:0040101C mov ecx, 13h
.text:00401021 mov eax, 0CCCCCCCCh
.text:00401026 rep stosd
[COLOR="#ff0000"].text:00401028 mov [ebp+var_4], 1
.text:0040102F mov [ebp+var_8], 2
.text:00401036 mov eax, [ebp+var_4]
.text:00401039 add eax, [ebp+var_8]
.text:0040103C mov [ebp+var_C], eax
.text:0040103F mov eax, [ebp+var_C][/COLOR]
.text:00401042 pop edi
.text:00401043 pop esi
.text:00401044 pop ebx
.text:00401045 mov esp, ebp
.text:00401047 pop ebp
.text:00401048 retn
.text:00401048 sub_401005 endp ; sp = 4
И видим всем знакомые константы в локальных переменных и возвращаемое значение.
Хорошо ты все расписал. Теперь все очевидно. Но все – таки, как отличить служебную информацию от необходимой? Исходников ведь может и не быть. Короче говоря, как найти то, что нужно и отбросить то, что не нужно?
PS: Все упирается в логику, умение анализировать и ,конечно же, опыт.