Komentáře ke článku
| babca | 213.226.251.* | 1.6.2007 20:09 |
| | Tak do tejdne by se tu melo objevit pokracovani, pac uz mam zase kapku casu :). |
|
| q | 82.208.44.* | 21.5.2007 15:05 |
| | teda 256 (0-255) :) |
|
| qaaz | 82.208.44.* | 21.5.2007 14:33 |
| 1) pocet preruseni je 255, krome rezervovanych, muze system pouzit pro syscall kterekoliv volne preruseni (v tom dosu 0x21, linux/bsd 0x80, windows 0x2e, ...)
2a) microsoft myslenku preruseni samozrejme neopustil, linux i windows (a ostatni systemy pro procesory x86 s kernelem bezicim v jine vrstve chraneneho modu) pouzivaji pro syscall int nebo sysenter. jsou i jine zpusoby vyvolani kodu s jinym CPL, ale to je tady OT.
2b) syscally se v shellcode pro windows nepouzivaji, protoze se lisi pro jednotlive verze windows (coz neni az tak drasticke a s trochou znalosti se i ve windows daji pouzivat primo syscally), misto toho se tedy vyhledavaji a pouzivaji funkce, ktere syscall provedou za nas. stejne se to da delat i v linuxu a jinych systemch (komplikace, resitelna, je u staticky linkovanych programu). dalsim duvodem pro pouziti funkci je to, ze nektere operace jsou prilis slozite a tak se pouzivaji funkce, ktere je provedou za nas.
3) v nekterych mistech placnes uplny nesmysl, ktery vzapeti "opravis". bud je to nesikovnym vyjadrovanim, nebo neznalosti.
4) ten kousek o pouziti XOR misto MOV je uplne na nic - zacatecnik nepochopi proc zrovna tahle zamena a instrukci obsahujicich nuly je samozrejme mnohem vic. pritom by stacil jednoduchy odstavecek o principu kodovani opcodu a jejich zamene za null-free verze.
5) jinak ten clanek ujde :)
|
|
| babca | 213.235.188.* | 20.5.2007 14:16 |
| | S tim _T() mas pravdu, toho sem si nevsiml. Hold nikdo nejsme dokonalej. :) |
|
| Jaroslav Šmíd | 88.102.113.* | 19.5.2007 20:15 |
| | 64bit? eax asi nebude 64bitový ... Jak se v něm může vrátit pointer? Další chyba v zápisu fce MessageBoxA, to _T() tam nemá co dělat, to má být JEN u (makra) MessageBox, které je definováno jako MessageBoxW nebo MessageBoxA v závislosti na použití UCS2, podle toho se také rozvine makro _T() na L"řetězec" či "řetězec". Schválně si nastavte UCS2 v kompilátoru a zkuste přeložit MessageBoxA( 0, _T("bla"), _T("bla"), 0 ) ... voala, chybička se vloudila. Naučte se pořádně WinAPI :-) Nejsem si jistý, ale v C snad není nutné volat tu funkci (int)(*func)() ... mělo by stačit func(), nebo alespoň v C++ to tak funguje. |
|
| babca | 80.188.22.* | 14.5.2007 12:16 |
| | sry, nedostatek informaci :) |
|
| ventYl | 88.212.22.* | 11.5.2007 15:20 |
| to, ze Linux dnes este stale pouziva INT na skok z userspace do kernelu instrukciu INT je hovadina ;) na dostatocne novom procesore a s dostatocne novym kernelom sa pouziva instrukcia sysenter, ktora je radovo rychlejsia.
for more info:[link] |
|
| babca | 213.226.251.* | 8.5.2007 16:39 |
| to guguma: S tim textem mas pravdu, dalo by se tamusetrit par bajtu, ale na pochopeni je to takhle lepsi. Pokud umis asm tak si s tim muzes hrat.
Dale, vssecny funkce ve win vraciji sve hodnoty v registru eax, takze tam se tam ten hadle napsal.
Volat primo adresu neni mozne (aspon me to neslo), tak se musela ulozit do registru(je jedno jakej), tak proto tam je to mov ebx, xxxx; call ebx.
s tim navestim mam_zpravu, si ted tak uplne jistej nejsem, ale myslim, ze to mulovani tam je nutny, pac v edx byla uz jina hodnota, tak nevim, jeste se mrknu, jestli tam je tnutny.
To posledni nulovani edx je proto, ze pri volani ExitProcess je potreba dat tzv. exit status (proste jestli program skoncil s chybou nebo ne) 0 = bez chyb, proto sem ten regist nuloval a potom hodil na zasobnik. Jinak v tom prvnim koduje chyba, edx se nemusi nulovat.
Jinak diky za pripominky :) |
|
ask@t | | 200-358-168 | 8.5.2007 9:43 |
| | Uzasny proste za 1. |
|
| guguma | 195.113.79.10/10.0.10.* | 8.5.2007 0:34 |
| V ukázce úplně zbytečný jmp user - kdybys dal rovnou call + db, ušetříš - kolik? Pět bajtů? Po vztažení na ukázkový zdroják by se ušetřilo ještě víc (User32, Fce a Zprava se volají každá jen jednou - takže mínus cca 15 bajtů).
V ukázkovém zdrojáku není jasné, jak se handle dostal do eax - předtím tam byl výsledek předchozí funkce (adresa nalezené knihovny).
mov ebx, číslo: call ebx - fakt je ten obsah v ebx nutný? (se ptám - Windows neznám). Pokud ne, šlo by zkrátit, a vzhledem k tomu, kolikrát se to v textu opakuje, zase by se ušetřilo pár bajtů.
Za návěštím Mam_zpravu: proč nuluješ edx, když už je stoprocentně nulový (nuloval se o instrukci předtím, mov edx nezměnil)?
Před exitem není vysvětleno, proč nuluješ edx - vyžaduje to funkce? |
|
|