ЛЇ®«­Ґ­ЁҐ Є®¤ ў б⥪Ґ

ђ§аҐиҐ­ЁҐ ­ ўлЇ®«­Ґ­ЁҐ Є®¤ ў б⥪Ґ ®Ўкпб­пҐвбп вҐ, зв® ЁбЇ®«­пҐл© б⥪ ­Ґ®Ўе®¤Ё ­®ЈЁ Їа®Ја, ў в® зЁб«Ґ Ё б®© ®ЇҐажЁ®­­®© бЁб⥥ ¤«п ўлЇ®«­Ґ­Ёп ­ҐЄ®в®але бЁб⥭ле дг­ЄжЁ©. Ѓ«Ј®¤ап Ґг гЇа®йҐвбп ЈҐ­ҐажЁп Є®¤ Є®ЇЁ«пв®аЁ Ё Є®ЇЁ«ЁагойЁЁ Ё­вҐаЇаҐвв®аЁ.

Ћ¤­Є® ўҐб⥠б н⨠㢥«ЁзЁўҐвбп Ё Ї®вҐ­жЁ«м­п гЈа®§ вЄЁ – Ґб«Ё ўлЇ®«­Ґ­ЁҐ Є®¤ ў б⥪Ґ а§аҐиҐ­®, Ё ®иЁЎЄЁ ५Ё§жЁЁ ЇаЁ ®ЇаҐ¤Ґ«Ґ­­ле ®Ўбв®п⥫мбвўе ЇаЁў®¤пв Є ЇҐаҐ¤зҐ гЇаў«Ґ­Ёп ­ ¤­­лҐ, ўўҐ¤Ґ­­лҐ Ї®«м§®ўвҐ«Ґ, §«®гли«Ґ­­ЁЄ Ї®«гзҐв ў®§®¦­®бвм ЇҐаҐ¤вм Ё ўлЇ®«­Ёвм ­ 㤫Ґ­­®© иЁ­Ґ бў®© б®Ўб⢥­­л© §«®ўаҐ¤­л© Є®¤. „«п ®ЇҐажЁ®­­ле бЁб⥠Solaris Ё Linux бгйҐбвўгов "§Ї«вЄЁ", гбв­®ўЄ Є®в®але ЇаЁў®¤Ёв Є §ЇаҐвг ЁбЇ®«­Ґ­Ёп Є®¤ ў б⥪Ґ, ­® ®­Ё ­Ґ ЁҐов Ў®«ми®Ј® абЇа®бва­Ґ­Ёп, Ї®бЄ®«мЄг, ¤Ґ«ов ­Ґў®§®¦­®© аЎ®вг ­®¦Ґбвў Їа®Ја, Ё Ў®«миЁ­бвўг Ї®«м§®ўвҐ«Ґ© «ҐЈзҐ бЁаЁвмбп б гЈа®§®© вЄЁ, зҐ ®бввмбп ЎҐ§ ­Ґ®Ўе®¤Ёле ЇаЁ«®¦Ґ­Ё©.

Џ®нв®г, ЁбЇ®«м§®ў­ЁҐ б⥪ ¤«п ўлЇ®«­Ґ­Ёп б®®¤ЁдЁжЁаго饣®бп Є®¤, ўЇ®«­Ґ §Є®­­® Ё бЁб⥭® ­Ґ§ўЁбЁ®, в.Ґ. г­ЁўҐаб«м­®. Џ®Ё® нв®Ј®, вЄ®Ґ аҐиҐ­ЁҐ гбва­пҐв ®Ў ­Ґ¤®бввЄ дг­ЄжЁЁ WriteProcessMemory:

‚®-ЇҐаўле, ўлпў«пвм Ё ®вб«Ґ¤Ёвм Є®­¤л, ®¤ЁдЁжЁагойЁҐ §а­ҐҐ ­ҐЁ§ўҐбв­го п祩Єг ЇпвЁ, з१ўлз©­® ваг¤­® Ё ў§«®йЁЄг ЇаЁ¤Ґвбп Їа®ўҐбвЁ Єа®Ї®в«Ёўл© ­«Ё§ Є®¤ §йЁвл ЎҐ§ ­¤Ґ¦¤л ­ бЄ®ал© гбЇҐе (ЇаЁ гб«®ўЁЁ, зв® б §йЁв­л© Ґе­Ё§ ५Ё§®ў­ ЎҐ§ ЈагЎле ®иЁЎ®Є, ®Ў«ҐЈзойЁе §¤зг еЄҐа).

‚®-ўв®але, ЇаЁ«®¦Ґ­ЁҐ ў «оЎ®© ®Ґ­в ®¦Ґв ўл¤Ґ«Ёвм бв®«мЄ® б⥪®ў®© ЇпвЁ, бЄ®«мЄ® Ґг §Ў«Ј®аббг¤Ёвбп, §вҐ, ЇаЁ Ёб祧­®ўҐ­ЁЁ Ї®вॡ­®бвЁ – ҐҐ ®бў®Ў®¤Ёвм. Џ® г®«з­Ёо бЁб⥠१ҐаўЁагҐв ®¤Ё­ ҐЈЎ©в б⥪®ў®Ј® Їа®бва­бвў, , Ґб«Ё нв®Ј® ¤«п аҐиҐ­Ёп Ї®бвў«Ґ­­®© §¤зЁ ­Ґ ¤®бвв®з­®, ­г¦­®Ґ Є®«ЁзҐбвў® ®¦­® гЄ§вм ЇаЁ Є®Ї®­®ўЄҐ Їа®Јал.

‡Ґз⥫쭮, зв® ¤«п Їа®Ја, ўлЇ®«­пойЁебп ў б⥪Ґ, бЇаўҐ¤«Ёў ЇаЁ­жЁЇ ”®­ ЌҐ©­ – ў ®¤Ё­ ®Ґ­в ўаҐҐ­Ё ⥪бв Їа®Јал ®¦Ґв аббваЁўвмбп ЄЄ ¤­­лҐ, ў ¤агЈ®© – ЄЄ ЁбЇ®«­пҐл© Є®¤. €Ґ­­® нв® ­Ґ®Ўе®¤Ё® ¤«п ­®а«м­®© аЎ®вл ўбҐе абЇЄ®ўйЁЄ®ў Ё абиЁда®ўйЁЄ®ў ЁбЇ®«­пҐ®Ј® Є®¤.

Ћ¤­Є®, Їа®ЈаЁа®ў­ЁҐ Є®¤, ўлЇ®«­по饣®бп ў б⥪Ґ, ЁҐҐв ап¤ бЇҐжЁдЁзҐбЄЁе ®б®ЎҐ­­®б⥩, ® Є®в®але Ё Ўг¤Ґв аббЄ§­® ­Ё¦Ґ.

"Џ®¤ў®¤­лҐ Є­Ё" ЇҐаҐҐйҐ®Ј® Є®¤

ЏаЁ а§аЎ®вЄҐ Є®¤, ўлЇ®«­по饣®бп ў б⥪Ґ, б«Ґ¤гҐв гзЁвлўвм, зв® ў ®ЇҐажЁ®­­ле бЁбвҐе Windows 9x, Windows NT Ё Windows 2000 Ґбв®Ї®«®¦Ґ­ЁҐ б⥪ ৫Ёз­®, Ё, зв®Ўл б®еа­Ёвм аЎ®в®бЇ®б®Ў­®бвм ЇаЁ ЇҐаҐе®¤Ґ ®в ®¤­®© бЁбвҐл Є ¤агЈ®©, Є®¤ ¤®«¦Ґ­ Ўлвм ЎҐ§а§«ЁзҐ­ Є ¤аҐбг, Ї® Є®в®а®г ®­ Ўг¤Ґв §Ја㦥­. ’Є®© Є®¤ ­§лўов ЇҐаҐҐйҐл, Ё ў ҐЈ® ᮧ¤­ЁЁ ­Ґв ­ЁзҐЈ® б«®¦­®Ј®, ¤®бвв®з­® б«Ґ¤®ўвм ­ҐбЄ®«мЄЁ Їа®бвл б®Ј«иҐ­Ёп – ў®в Ё ўбҐ.

‡Ґз⥫쭮, зв® г ЁЄа®Їа®жҐбб®а®ў бҐаЁЁ Intel 80x86 ўбҐ Є®а®вЄЁҐ ЇҐаҐе®¤л (short jump) Ё Ў«Ё§ЄЁҐ ўл§®ўл (near call) ®в­®бЁвҐ«м­л, в.Ґ. ᮤҐа¦в ­Ґ «Ё­Ґ©­л© 楫Ґў®© ¤аҐб, а§­Ёжг 楫Ґў®Ј® ¤аҐб Ё ¤аҐб б«Ґ¤го饩 ўлЇ®«­пҐ®© Ё­бвагЄжЁЁ. ќв® §­зЁвҐ«м­® гЇа®йҐв ᮧ¤­ЁҐ ЇҐаҐҐйҐ®Ј® Є®¤, ­® ўҐб⥠б нвЁ ­Є«¤лўҐв ­ ­ҐЈ® ­ҐЄ®в®алҐ ®Ја­ЁзҐ­Ёп.



—в® Їа®Ё§®©¤Ґв, Ґб«Ё б«Ґ¤гойго дг­ЄжЁо "void Demo() { printf("Demo\n");}" бЄ®ЇЁа®ўвм ў б⥪ Ё ЇҐаҐ¤вм Ґ© гЇаў«Ґ­ЁҐ? Џ®бЄ®«мЄг, Ё­бвагЄжЁп call, ўл§лўойп дг­ЄжЁо pritnf, "ЇҐаҐҐе«" ­ ­®ў®Ґ Ґбв®, а§­Ёж ¤аҐб®ў ўл§лўҐ®© дг­ЄжЁЁ Ё б«Ґ¤го饩 § call Ё­бвагЄжЁЁ бв­Ґв ᮢᥠЁ­®©, Ё гЇаў«Ґ­ЁҐ Ї®«гзЁв ®в­о¤м ­Ґ printf, ­Ґ ЁҐойЁ© Є ­Ґ© ­ЁЄЄ®Ј® ®в­®иҐ­Ёп Є®¤! ‚Ґа®пв­ҐҐ ўбҐЈ® Ё ®Є¦Ґвбп "гб®а", Ї®а®¦¤ойЁ© ЁбЄ«о祭ЁҐ б Ї®б«Ґ¤гойЁ ўаЁ©­л §ЄалвЁҐ ЇаЁ«®¦Ґ­Ёп.

Џа®ЈаЁагп ­ бᥡ«ҐаҐ, вЄ®Ґ ®Ја­ЁзҐ­ЁҐ ®¦­® «ҐЈЄ® ®Ў®©вЁ, ЁбЇ®«м§гп ॣЁбва®ўго ¤аҐбжЁо. ЏҐаҐҐйҐл© ўл§®ў дг­ЄжЁЁ printf гЇа®йҐ­­® ®¦Ґв ўлЈ«п¤Ґвм, ­ЇаЁҐа, вЄ:"lea eax, printf\ncall eax." ‚ ॣЁбва eax (Ё«Ё «оЎ®© ¤агЈ®© ॣЁбва ®ЎйҐЈ® ­§­зҐ­Ёп) §­®бЁвбп Ўб®«ов­л© «Ё­Ґ©­л©, ­Ґ ®в­®бЁвҐ«м­л© ¤аҐб Ё, ­Ґ§ўЁбЁ® ®в Ї®«®¦Ґ­Ёп Ё­бвагЄжЁЁ call, гЇаў«Ґ­ЁҐ Ўг¤Ґв ЇҐаҐ¤­® дг­ЄжЁЁ printf, ­Ґ зҐг-в® ҐйҐ.

Ћ¤­Є® вЄ®© Ї®¤е®¤ вॡгҐв §­зҐ­Ёп бᥡ«Ґа, Ї®¤¤Ґа¦ЄЁ Є®ЇЁ«пв®а® бᥡ«Ґа­ле ўбвў®Є, Ё ­Ґ ®зҐ­м-в® ­аўЁвбп ЇаЁЄ«¤­л Їа®ЈаЁбв, ­Ґ Ё­вҐаҐбгойЁебп Є®­¤Ё Ё гбва®©бвў® ЁЄа®Їа®жҐбб®а.

„«п аҐиҐ­Ёп ¤­­®© §¤зЁ ЁбЄ«озЁвҐ«м­® б।бвўЁ п§лЄ ўлб®Є®Ј® га®ў­п, - ­Ґ®Ўе®¤Ё® ЇҐаҐ¤вм б⥪®ў®© дг­ЄжЁЁ 㪧⥫Ё ­ ўл§лўҐлҐ ҐҐ дг­ЄжЁЁ ЄЄ аЈгҐ­вл. ќв® ­ҐбЄ®«мЄ® ­Ґг¤®Ў­®, ­® Ў®«ҐҐ Є®а®вЄ®Ј® ЇгвЁ, Ї®-ўЁ¤Ё®г, ­Ґ бгйҐбвўгҐв. Џа®б⥩ип Їа®Ја, Ё««обваЁагойп Є®ЇЁа®ў­ЁҐ Ё ўлЇ®«­Ґ­ЁҐ дг­ЄжЁ© ў б⥪Ґ, ЇаЁўҐ¤Ґ­ ў «ЁбвЁ­ЈҐ 2.

void Demo(int (*_printf) (const char *,...) )

{

_printf("Hello, Word!\n");

return;

}

int main(int argc, char* argv[])

{

char buff[1000];

int (*_printf) (const char *,...);

int (*_main) (int, char **);

void (*_Demo) (int (*) (const char *,...));

_printf=printf;

int func_len = (unsigned int) _main - (unsigned int) _Demo;

for (int a=0;a

buff[a]= ((char *) _Demo)[a];

_Demo = (void (*) (int (*) (const char *,...))) &buff[0];

_Demo(_printf);

return 0;

}

‹ЁбвЁ­Ј 228 Џа®Ја, Ё««обваЁагойп Є®ЇЁа®ў­ЁҐ Ё ўлЇ®«­Ґ­ЁҐ дг­ЄжЁЁ ў б⥪Ґ


0874052134958413.html
0874126355376905.html

0874052134958413.html
0874126355376905.html
    PR.RU™