Сейчас на форуме: kris_sexy, Wenzel, r0lka (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Вызов функции по ординалу
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.190
Статус: Участник
tPORt Manager

Создано: 01 февраля 2006 17:19
· Личное сообщение · #2

Hellspawn пишет:
что за йункция..

А ты посмтори в kernel32.dll

Hellspawn пишет:
как мне допустим вызвать такую функцию в своей программе

Посмтори в библе имя и импортируй.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 01 февраля 2006 17:25
· Личное сообщение · #3

Bit-hack пишет:
Посмтори в библе имя и импортируй.

ну нету тама =\ там дофига функций в кернеле, которые без имени...
млин знаю тока 1 извратный способ чтобы вызвать из проги...
но хотелось бы нормальный

-----
[nice coder and reverser]




Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 01 февраля 2006 17:39
· Личное сообщение · #4

Hellspawn пишет:
как мне допустим вызвать такую функцию в своей программе

GetProcAddress((char *)ordinal);




Ранг: 420.3 (мудрец)
Активность: 0.240
Статус: Участник

Создано: 01 февраля 2006 18:59
· Личное сообщение · #5

А как реализовать поиск ординала по имени функции (я просто не сталкивался)? Можно примерчик кода?

-----
Сколько ни наталкивали на мысль – все равно сумел увернуться





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 01 февраля 2006 22:14
· Личное сообщение · #6

см. IMAGE_IMPORT_DESCRIPTOR
берёшь FirstThunk (или, в зависимости от ситуации, OriginalFirstThunk) и если присутствует IMAGE_ORDINAL_FLAG32 - значит импорт по ординалу

-----
EnJoy!





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
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.240
Статус: Участник

Создано: 02 февраля 2006 09:11
· Личное сообщение · #8

DrGolova
Спасибо за пример, хотя лучше бы на делфях. Хотя, ничего страшного, разберусь.

-----
Сколько ни наталкивали на мысль – все равно сумел увернуться





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.150
Статус: Участник
retired

Создано: 02 февраля 2006 12:56
· Личное сообщение · #10

Hellspawn пишет:
pp:=GetProcAddress(d1,'0005');

надо не '0005' а просто 5

см. выше:
GetProcAddress((char *)ordinal);




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.070
Статус: Участник

Создано: 02 февраля 2006 13:12
· Личное сообщение · #12

Hellspawn пишет:
pp:=GetProcAddress(d1,'5');


ты че издеваешься ?
pp:=GetProcAddress(d1,5);




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.070
Статус: Участник

Создано: 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.470.25
Статус: Модератор
Research & Development

Создано: 02 февраля 2006 14:36
· Личное сообщение · #15

на асме всё гораздо проще ;) никаких те приведений типов ;)
DWORD и усё ;)
например:
invoke GetProcAddress,hLib,61

-----
EnJoy!




Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 02 февраля 2006 15:10
· Личное сообщение · #16

Jupiter
asm - Advanced Sado-Mazo



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 02 февраля 2006 15:52
· Личное сообщение · #17

баян с bash.org.ru/quote.php?num=9929




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.290
Статус: Участник

Создано: 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.680
Статус: Модератор
Author of DiE

Создано: 02 февраля 2006 17:32 · Поправил: Hellspawn
· Личное сообщение · #20

я понял =\ мне не везёт... да пробовал я так =(
может в винде проблема... %( у меня 98...
ну 0 и вот хоть тресни.... кто-нить хоть пробовал??
возвращается что-нить кроме 0 ??

пойду выпью йада...

-----
[nice coder and reverser]





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 02 февраля 2006 17:35
· Личное сообщение · #21

Hellspawn
выложи сюда, чо те надо - у кого время есть исправит
винда тут ни при чём

-----
EnJoy!





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 02 февраля 2006 17:37
· Личное сообщение · #22

Hellspawn пишет:
я понял =\ мне не везёт... да пробовал я так =(
может в винде проблема... %( у меня 98...
ну 0 и вот хоть тресни.... кто-нить хоть пробовал??
возвращается что-нить кроме 0 ??

Я привел код, который возвращает не ноль.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.10
Статус: Участник
www.uinc.ru

Создано: 02 февраля 2006 18:14 · Поправил: DrGolova
· Личное сообщение · #24

Ах это d1 а не dl
Значит в твоем kernel32 нет функции с ординалом #5




Ранг: 605.2 (!), 341thx
Активность: 0.470.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.680
Статус: Модератор
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.060
Статус: Участник

Создано: 02 февраля 2006 18:35
· Личное сообщение · #27

Хм... У меня работают все здесь приведённые примеры на дельфях
Везде выдается вполне приличный адрес 7ххххххх

Jupiter пишет:
pRun:=GetProcAddress(hShell32,Pchar(5));

А говоришь #61 =)



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 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.680
Статус: Модератор
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.060
Статус: Участник

Создано: 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


. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Вызов функции по ординалу
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати