Author Topic: GetByte from DWORD (Delphi)  (Read 1063 times)

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
GetByte from DWORD (Delphi)
« on: May 13, 2007, 09:41:07 PM »
Neviete nahodou ako sa da v Delphi spravit funkcia (rychla a kratka) kt vrati z DWORD cisla specificky Byte ?

Priklad:
DWord = 0x00112233
GetByte(0x00112233, 1) = 00
GetByte(0x00112233, 2) = 11
GetByte(0x00112233, 3) = 22
GetByte(0x00112233, 4) = 33

Skusal som to cez pointre ale nefungovalo to :-(, nieco robim zle (to bude tym, ze nie som delphista :-) :

   pB:  ^Byte;
   pB := Pointer(Dword); // ^Dword
   B1 := pb^;
   Inc(pb);
   B2 := pb^;  ...

Nejake napady ? :-)

PS: este by sa to dalo asi riesit aj cez SHL a SHR ...

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
Solution
« Reply #1 on: May 14, 2007, 10:15:54 AM »
Tak uz mam riesenie, pre tych kt to zaujima tak spravne je pouzit Addr () miesto Pointer()  :)

Conflict

  • g0d i5 just a stat1st1c
  • Senior Member
  • ****
  • Posts: 475
Re: GetByte from DWORD (Delphi)
« Reply #2 on: May 14, 2007, 11:57:45 AM »
Z Delphi helpu:
Note:   Addr is equivalent to the @ operator except that it is unaffected by the $T compiler directive.

Conflict

  • g0d i5 just a stat1st1c
  • Senior Member
  • ****
  • Posts: 475
Re: GetByte from DWORD (Delphi)
« Reply #3 on: May 14, 2007, 07:44:37 PM »
kdyz uz sme u tech pointeru, mohl by mi nekdo prevest tenhle kousek kodu do delphi? pMapping je pointer.
Code: [Select]
 mov   edi, pMapping
  add   edi, [edi+3ch]
  cmp   [edi], 00004550h

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: GetByte from DWORD (Delphi)
« Reply #4 on: May 14, 2007, 09:45:08 PM »
Hmm, nejako mi to nedáva význam... dajme tomu, ?e pMapping je ukazovateľ na nejaké pole, napr. na reťazec a ten má adresu, napr. 403000.

edi = 403000
edit = edi + [DWORD hodnota na adrese 403000+3Ch]

Aká je hodnota na 403003h a či je to korektné, to je dobrá otázka.

Skúsil som si to na príklade.
Code: [Select]

00401158   .  BE 48204000   mov esi, 00402048                        ;  ASCII "eraser"
0040115D   .  0376 03       add esi, dword ptr [esi+3]
00401160   .  833E 30       cmp dword ptr [esi], 30


0040204B  73 65 72 00         ser.
[0040204B]  == 00726573    ASCII "ser"
00402048 + 00726573 == 00B285BB, resp. DWORD hodnota na [00B285BB] - hodnotu neviem, to mi DBG ťa?ko uká?e.

Je mi to jasné, no nedáva mi to logiku, jedine v prípade, ?e by sa overovala na danom miesta nejaká checksum suma, či iná kon?tantná hodnota. V tom prípade by niekto musel vedieť počiatočnú adresu pointera. Je to divné...

Pointre v Pascale, resp. Delphi som zabudol... av?ak povedal by som, ?e to mô?e byť takto nejako... @str + [@str + 3]  // neviem ako napísať hodnota na adrese, preto tie zátvorky.

//edit: ?eby takéto niečo... nemám Delphi, musí? to hodiť do DBG...  Ptr(LongWord(@str) + 3)^   a dačo si matne pamätám, ?e sú príkazy PByte, mo?no i PDWord... :)   PDWord(Ptr(LongWord(@str) + 3))^   :confused:

V Cčku by to bolo takto... (DWORD) str + *(DWORD *) (str+3).
« Last Edit: May 14, 2007, 10:09:18 PM by eraser »
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Conflict

  • g0d i5 just a stat1st1c
  • Senior Member
  • ****
  • Posts: 475
Re: GetByte from DWORD (Delphi)
« Reply #5 on: May 15, 2007, 08:18:12 AM »
huh, tak tohle Ptr(LongWord(@str) + 3)^ a PDWord(Ptr(LongWord(@str) + 3))^ je zapis jak prase  :eek: Funkcnost sem nezkousel ale zlatej asm.
Mozna sem spatne popsal problem, tak jeste jednou a jinak. pMapping je pointer. Nebudem resit k cemu ten kousek kodu je (zkuseni poznaj hned). Jak prictu k pMapping to co je ulozeno na adrese pMapping+3Ch? A jak pak zkontroluju jestli na ty adrese je konstanta 4550h?

Bylo by vynikajici reseni na jeden max. dva radky.
Jestli mate spicovej odkaz na stranku kde sou pekelne dobre vysvetleny pointery, figle a vychcavky v delphi muzete ho sem klidne hodit, rad si poctu. (na jazyku temer nezalezi jenom ne asijsky dialekt mangarinskeho madrangorskeho kryptofasistickyho antimihilistickyho anarchismu)

DARKER

  • [SCF]
  • Administrator
  • Senior Member
  • *****
  • Posts: 336
« Last Edit: May 15, 2007, 09:22:46 AM by Conflict »

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: GetByte from DWORD (Delphi)
« Reply #7 on: May 15, 2007, 12:02:27 PM »
Som sa zamyslel nad tým názvom toho pointera a u? mi je jasné, s čím sa hrá?... v tom prípade by ti mohli helfnúť tieto dva linky, resp. zdrojáky.

http://www.dsdt.info/tipps/?id=487
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21876985.html

Hlavne ten dlh?í je coolový, je tam preklad Cčkového zápisu do Delphi, tak?e by si niečo mohol nájsť i podľa toho môjho príkladu v C. Mne sa hľadať nechce, resp. nechápem, ako som mohol 5 rokov robiť s Delphi. Huh, ten zápis pointerov je údesný...  :confused:

Sakri?, majú to nejaké divné... raz sa mi to uká?e (solution), inokedy nie... choď preto na tento link, ci?e cez google cache a scrolluj dole.

http://209.85.129.104/search?q=cache:FzzwC3iOKtYJ:www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21876985.html
« Last Edit: May 15, 2007, 12:21:46 PM by eraser »
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Conflict

  • g0d i5 just a stat1st1c
  • Senior Member
  • ****
  • Posts: 475
Re: GetByte from DWORD (Delphi)
« Reply #8 on: May 15, 2007, 02:56:42 PM »
diky D+e
2eraser: spica linky, ten druhej znam. daleko vic me zaujal prvni, hned na prvni pohled solution
Code: [Select]
pEXE := pEXE + PIMAGE_DOS_HEADER(pEXE)^.e_lfanew;
result := PDWORD(pEXE)^ = IMAGE_NT_SIGNATURE;

zapis jak mega moc velky prasatko, uplne novy obzory v programovani v delphi, cumim jak tele na spoceny vrata. aspon mam vecer co rozebirat. rozbor bude trvat nekolik hodin, protoze tyhle dva radky znamenaji vazne hodne.
Aspon kazdej vidi jak je asm nadherne jednoduchej.
Code: [Select]
mov   edi, pMapping
add   edi, [edi].TImageDosHeader._lfanew
cmp   [edi], IMAGE_NT_SIGNATURE

Porad (uz nekolik let), si nemuzu zvyknout na tenhle druh zapisu
Code: [Select]
PIMAGE_DOS_HEADER(pEXE)^.e_lfanew;
co je to za kravinu psat pointer do zavorek se striskou :confused:  :confused:
A k tomu vsemu ten kretenskej ceckovskej zapis vsechno velkyma pismenama. Kdo se pak v tom ma vyznat? Napr: PDWORD, PIMAGE_DOS_HEADER. Prece nas jako maly kluky ucili psat typ promeny, objektu... malymi pismeny, napr: btnClose, aArray, iInteger, tak proc pisou pointer s velkym "P"??? Copak existuje naky anglicky slovo PIMAGE nebo PDWORD? Existuje jedine pImage a pDword. No at ze me nedelej vola. Kdyz uz chtej mit pointer velkym, tak maj psat Pdword. Meli by si v tom udelat poradek. Uz je mi jasny proc sou programatori takovy hovada. Jak u nas na skole, prijde prednasejici neco povidat o programovani v propoceny lupy popraseny teplakovy souprave  :D Ja kdyz ho videl, tak sem se zhluboka a hlasite zasmal a sel dom. Jedina mozek idiota je schopen chapat takovej zapis.

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: GetByte from DWORD (Delphi)
« Reply #9 on: May 15, 2007, 05:59:25 PM »
Huh, tak ten prvý kód je celkom krátky, ale narovinu ti poviem, ?e tie zátvorky, strie?ky a bodky ma pekne mätú. Ja som pochopil prácu s pointerami, a? keď som presedlal na C a upevnil som si ju, a? so záujmom o ASM.

Čo sa týka tých DWORD, PDWORD a iných haluzí, to je dielo MS a tým, ?e je C case sensitive, tak sa to občas dobre pí?e, resp. rozli?uje, preto?e uppercase znamená nejaký typ, či  u? je to define, typedef alebo ?truktúra a malým zase ?pecifická premenná, napr. HWND a hwnd. Ja skorej nepochopím ich politiku v rôznych typedef typoch, napr. HWND je vlastne DWORD, či?e unsigned long. Proste ka?dý parameter je v 32 bitovom systéme 4 bajtová premenná. A toto som si uvedomil a? pri ASM.

Jo a inak to pretypovanie je vo vy??ích jazykoch len kvôli tomu, aby ti to zo?ral kompilátor, preto?e on tým, ?e sleduje typy, tak sa určitým spôsobom stará o stupeň bezpečnej?ieho programovania. To isté platí i o počte parametrov pre funkciu, atď.
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Conflict

  • g0d i5 just a stat1st1c
  • Senior Member
  • ****
  • Posts: 475
Re: GetByte from DWORD (Delphi)
« Reply #10 on: May 16, 2007, 01:30:02 PM »
Takze, rozborem kodu na http://www.dsdt.info/tipps/?id=487 sem dosel k zaveru, ze pricist k typu Pointer (^Integer, ^Dword, ...) se da bud v asm a nebo funkci INC(). A nebo viz. web adresa se to da obejit pres typ pChar, ktery se pouziva pro praci se stringy. K tomuto typu pro lepsi praci se stringy de pricitat (odecitat) pomoci "+" ("-"). Takze to vidim na cim dal castejsi psani kodu bez pouziti asm. Uz bylo na case, zacinalo me to votravovat.