| Посл.ответ | 
Сообщение | 
  Ранг: 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
   | Сообщение посчитали полезным:  |