Посл.ответ |
Сообщение |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 01 февраля 2006 17:11 · Поправил: Hellspawn · Личное сообщение · #1
Собственно смотрел одну прогу и на глаза попался такой код
во первых интересно узнать что за функция.. и во вторых
как мне допустим вызвать такую функцию в своей программе
MOV EDI,DWORD PTR DS:[403023]
SHR EDI,0C
PUSH 20060000
PUSH 0
PUSH 1
PUSH EDI
PUSH 1000D
CALL <JMP.&KERNEL32.#5>
----- [nice coder and reverser] | Сообщение посчитали полезным: |
|
Ранг: 303.7 (мудрец), 4thx Активность: 0.19↘0 Статус: Участник tPORt Manager
|
Создано: 01 февраля 2006 17:19 · Личное сообщение · #2
Hellspawn пишет:
что за йункция..
А ты посмтори в kernel32.dll
Hellspawn пишет:
как мне допустим вызвать такую функцию в своей программе
Посмтори в библе имя и импортируй.
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 01 февраля 2006 17:25 · Личное сообщение · #3
Bit-hack пишет:
Посмтори в библе имя и импортируй.
ну нету тама =\ там дофига функций в кернеле, которые без имени...
млин знаю тока 1 извратный способ чтобы вызвать из проги...
но хотелось бы нормальный
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 160.1 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 01 февраля 2006 17:39 · Личное сообщение · #4
Hellspawn пишет:
как мне допустим вызвать такую функцию в своей программе
GetProcAddress((char *)ordinal);
| Сообщение посчитали полезным: |
Ранг: 420.3 (мудрец) Активность: 0.24↘0 Статус: Участник
|
Создано: 01 февраля 2006 18:59 · Личное сообщение · #5
А как реализовать поиск ординала по имени функции (я просто не сталкивался)? Можно примерчик кода?
----- Сколько ни наталкивали на мысль – все равно сумел увернуться | Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 01 февраля 2006 22:14 · Личное сообщение · #6
см. IMAGE_IMPORT_DESCRIPTOR
берёшь FirstThunk (или, в зависимости от ситуации, OriginalFirstThunk) и если присутствует IMAGE_ORDINAL_FLAG32 - значит импорт по ординалу
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 199.6 (ветеран), 12thx Активность: 0.1↘0 Статус: Участник www.uinc.ru
|
Создано: 02 февраля 2006 02:44 · Поправил: DrGolova · Личное сообщение · #7
> как реализовать поиск ординала по имени функции (я просто не сталкивался)? Можно примерчик кода?
static INT GetOrdinalByName(VOID* hModule, CHAR* Name)
{
IMAGE_EXPORT_DIRECTORY* ExpDir;
IMAGE_DOS_HEADER* DOS;
IMAGE_NT_HEADERS* PE;
ULONG ExpTableRVA, I;
USHORT* OrdinalTable;
ULONG* NameTable;
DOS = (IMAGE_DOS_HEADER*)(hModule);
PE = (IMAGE_NT_HEADERS*)((BYTE*)hModule + DOS->e_lfanew);
if ( 0 == (ExpTableRVA = PE->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) )
{
return(-1); /* no export table in image */
}
ExpDir = (IMAGE_EXPORT_DIRECTORY*)((BYTE*)hModule + ExpTableRVA);
OrdinalTable = (USHORT*)((BYTE*)hModule + ExpDir->AddressOfNameOrdinals);
NameTable = (ULONG*)((BYTE*)hModule + ExpDir->AddressOfNames);
for ( I = 0; I < ExpDir->NumberOfNames; I++ )
{
if ( strcmp(Name, (CHAR*)hModule + NameTable[I]) )
continue;
return (INT)(OrdinalTable[I] + ExpDir->Base);
}
return(-1); /* not founded */
}
| Сообщение посчитали полезным: |
Ранг: 420.3 (мудрец) Активность: 0.24↘0 Статус: Участник
|
Создано: 02 февраля 2006 09:11 · Личное сообщение · #8
DrGolova
Спасибо за пример, хотя лучше бы на делфях. Хотя, ничего страшного, разберусь.
----- Сколько ни наталкивали на мысль – все равно сумел увернуться | Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 12:02 · Поправил: Hellspawn · Личное сообщение · #9
CALL <JMP.&KERNEL32.#5>
var
d1:dword;
pp:pointer;
begin
d1:=GetModuleHandle('KERNEL32.dll');
pp:=GetProcAddress(d1,'0005');
edit5.Text:=IntToHex(dword(pp),8);
че я тока не передавал в GetProcAddress в качестве второго параметра...
возвращает всё равно 0 млин... может кто-нить попробует....
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 352.4 (мудрец), 4thx Активность: 0.15↘0 Статус: Участник retired
|
Создано: 02 февраля 2006 12:56 · Личное сообщение · #10
Hellspawn пишет:
pp:=GetProcAddress(d1,'0005');
надо не '0005' а просто 5
см. выше:
GetProcAddress((char *)ordinal);
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 13:03 · Личное сообщение · #11
ssx пишет:
надо не '0005' а просто 5
млин =\
pp:=GetProcAddress(d1,char(5));
pp:=GetProcAddress(d1,'5');
всё равно 0 возвращается... %( да чтож такое...
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 160.1 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 02 февраля 2006 13:12 · Личное сообщение · #12
Hellspawn пишет:
pp:=GetProcAddress(d1,'5');
ты че издеваешься ?
pp:=GetProcAddress(d1, 5);
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 13:17 · Поправил: Hellspawn · Личное сообщение · #13
infern0 пишет:
ты че издеваешься ?
pp:=GetProcAddress(d1,5)
ну если бы всё так просто было +)
--> [Error] Unit1.pas(179): Incompatible types: 'Integer' and 'PAnsiChar'
хм к чему бы это =\ ах ну да:
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC
--> lpProcName: LPCSTR ну теперь всё понятно =\
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 160.1 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 02 февраля 2006 13:44 · Личное сообщение · #14
Hellspawn
бля, ну дык написал же английским по белому GetProcAddress((char *)ordinal);
передаешь число, но надо привести тип к строке. И вообще - читай доки - они рулят !!
lpProcName
[in] Pointer to a null-terminated string that specifies the function or variable name, or the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the high-order word must be zero.
| Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 02 февраля 2006 14:36 · Личное сообщение · #15
на асме всё гораздо проще ;) никаких те приведений типов ;)
DWORD и усё ;)
например:
invoke GetProcAddress,hLib,61
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 160.1 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 02 февраля 2006 15:10 · Личное сообщение · #16
Jupiter
asm - Advanced Sado-Mazo
| Сообщение посчитали полезным: |
Ранг: 352.4 (мудрец), 4thx Активность: 0.15↘0 Статус: Участник retired
|
Создано: 02 февраля 2006 15:52 · Личное сообщение · #17
баян с bash.org.ru/quote.php?num=9929
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 16:36 · Поправил: Hellspawn · Личное сообщение · #18
короче я в шоке... как я тока не делал.. ну 0 и хоть ты тресни =\
d1:=GetModuleHandle('KERNEL32.dll');
asm
PUSH 5h
PUSH d1
call GetProcAddress
mov pp,eax
end;
даже так.. и всё равно 0 %(
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 02 февраля 2006 17:24 · Поправил: Ara · Личное сообщение · #19
procedure TForm1.Button1Click(Sender: TObject);
var
d1:dword;
pp:pointer;
begin
d1:=GetModuleHandle('KERNEL32.dll');
pp:=GetProcAddress(d1,PChar(5));
Edit1.Text:=IntToHex(DWORD(pp),8);
end;
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 17:32 · Поправил: Hellspawn · Личное сообщение · #20
я понял =\ мне не везёт... да пробовал я так =(
может в винде проблема... %( у меня 98...
ну 0 и вот хоть тресни.... кто-нить хоть пробовал??
возвращается что-нить кроме 0 ??
пойду выпью йада...
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 02 февраля 2006 17:35 · Личное сообщение · #21
Hellspawn
выложи сюда, чо те надо - у кого время есть исправит
винда тут ни при чём
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 02 февраля 2006 17:37 · Личное сообщение · #22
Hellspawn пишет:
я понял =\ мне не везёт... да пробовал я так =(
может в винде проблема... %( у меня 98...
ну 0 и вот хоть тресни.... кто-нить хоть пробовал??
возвращается что-нить кроме 0 ??
Я привел код, который возвращает не ноль.
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 17:40 · Поправил: Hellspawn · Личное сообщение · #23
--> Ара не поверишь... 0 ёпт %(
мне нужно вызвать в программе функцию:
CALL <JMP.&KERNEL32.#5>
ну не возвращает GetProcAddress её адресс...
если у функции есть имя.. то всё ок.. а есть передаёшь орд... то 0 возвращает...
и вот хоть ты тресни...
d1:=GetModuleHandle('KERNEL32.dll');
pp:=GetProcAddress(d1,Pchar(5));
edit5.Text:=IntToHex(dword(pp),8);
asm
PUSH 5h
PUSH d1
call GetProcAddress
mov pp,eax
end;
edit4.Text:=IntToHex(dword(pp),8);
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 199.6 (ветеран), 12thx Активность: 0.1↘0 Статус: Участник www.uinc.ru
|
Создано: 02 февраля 2006 18:14 · Поправил: DrGolova · Личное сообщение · #24
Ах это d1 а не dl
Значит в твоем kernel32 нет функции с ординалом #5
| Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 02 февраля 2006 18:26 · Поправил: Jupiter · Личное сообщение · #25
проверь на ф-ции #61 из Shell32.dll - диалог "Запуск программы"
hShell32:=LoadLibrary('Shell32.dll');
pRun:=GetProcAddress(hShell32,Pchar(61));
P.S. используй LoadLibrary!
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 18:34 · Поправил: Hellspawn · Личное сообщение · #26
Jupiter пишет:
проверь на ф-ции #61 из Shell32.dll - диалог "Запуск программы"
hShell32:=LoadLibrary('Shell32.dll');
pRun:=GetProcAddress(hShell32,Pchar(5));
да вернуло значение... 7FC959B0
а вот с кернелом нет =( это же ппц...
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 50.7 (постоянный) Активность: 0.06↘0 Статус: Участник
|
Создано: 02 февраля 2006 18:35 · Личное сообщение · #27
Хм... У меня работают все здесь приведённые примеры на дельфях
Везде выдается вполне приличный адрес 7ххххххх
Jupiter пишет:
pRun:=GetProcAddress(hShell32,Pchar(5));
А говоришь #61 =)
| Сообщение посчитали полезным: |
Ранг: 50.7 (постоянный) Активность: 0.06↘0 Статус: Участник
|
Создано: 02 февраля 2006 18:44 · Личное сообщение · #28
DrGolova пишет:
Значит в твоем kernel32 нет функции с ординалом #5
Но ведь в проге, которую исследовал Hellspawn эта функция вызывается
Hellspawn пишет:
CALL <JMP.&KERNEL32.#5>
И прога наверняка работает =)
Hellspawn, попробуй запустить такой код и скажи, что получится
d1:=GetModuleHandle('KERNEL32.dll');
Edit1.text:=inttostr(d1);
d1:=LoadLibrary('KERNEL32.dll');
Edit2.text:=inttostr(d1);
| Сообщение посчитали полезным: |
Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE
|
Создано: 02 февраля 2006 18:47 · Поправил: Hellspawn · Личное сообщение · #29
и там и там BFF60000 =\
да для других то функции возвращаются адресса...
блин бред какой-то =(
Klajnor пишет:
И прога наверняка работает =)
удивительно но прога работает...
кстати в кернеле есть эта функция... посмотрите экспорт...
а вот как в проге:
0040123F |. 68 00000620 PUSH 20060000
00401244 |. 6A 00 PUSH 0
00401246 |. 6A 01 PUSH 1
00401248 |. 57 PUSH EDI
00401249 |. 68 0D000100 PUSH 1000D
0040124E |. E8 13020000 CALL <JMP.&KERNEL32.#5>
call ведём на jmp а после
846ED1D0 68 D413F6BF PUSH KERNEL32.#8
846ED1D5 - E9 E78A893B JMP KERNEL32.BFF85CC1
хм... у олли то #5 то #8 =\
----- [nice coder and reverser] | Сообщение посчитали полезным: |
Ранг: 50.7 (постоянный) Активность: 0.06↘0 Статус: Участник
|
Создано: 02 февраля 2006 19:15 · Поправил: Klajnor · Личное сообщение · #30
У меня, кернел грузится 7С800000-7С900000
У этой функции даже имя есть AddConsoleAliasW
Тока у меня по адресу 7C870931(это мне выдала моя прога) находится совершенно другой код
7C870931 > 8BFF MOV EDI,EDI ; LOADDLL.00460024
7C870933 /. 55 PUSH EBP
7C870934 |. 8BEC MOV EBP,ESP
7C870936 |. 33C0 XOR EAX,EAX
7C870938 |. 3945 0C CMP [ARG.2],EAX
7C87093B |. 74 0A JE SHORT kernel32.7C870947
7C87093D |. FF75 0C PUSH [ARG.2] ; /String = ""
7C870940 |. E8 F490F9FF CALL kernel32.lstrlenW ; \lstrlenW
7C870945 |. D1E0 SHL EAX,1
7C870947 |> 6A 01 PUSH 1 ; /Arg6 = 00000001
7C870949 |. FF75 10 PUSH [ARG.3] ; |Arg5 = 80874038
7C87094C |. 0FB7C0 MOVZX EAX,AX ; |
7C87094F |. 50 PUSH EAX ; |Arg4 = 00000010
7C870950 |. FF75 0C PUSH [ARG.2] ; |Arg3 = 7FFDF000
7C870953 |. FF75 08 PUSH [ARG.1] ; |/String = FFFFFFFF ???
7C870956 |. E8 DE90F9FF CALL kernel32.lstrlenW ; |\lstrlenW
7C87095B |. D1E0 SHL EAX,1 ; |
7C87095D |. 50 PUSH EAX ; |Arg2 = 00000010
7C87095E |. FF75 08 PUSH [ARG.1] ; |Arg1 = FFFFFFFF
7C870961 |. E8 ABFEFFFF CALL kernel32.7C870811 ; \kernel32.7C870811
7C870966 |. 5D POP EBP ; kernel32.7C816D4F
7C870967 \. C2 0C00 RETN 0C
| Сообщение посчитали полезным: |