Ö¸Á³ÌÐòÓɸõã¼ÌÐøÔËÐС£
¶Ñ£ºÒ»°ãÊÇÔڶѵÄÍ·²¿ÓÃÒ»¸ö×Ö½Ú´æ·Å¶ÑµÄ´óС¡£¶ÑÖеľßÌåÄÚÈÝÓгÌÐòÔ±°²ÅÅ¡£
2.6´æÈ¡Ð§ÂʵıȽÏ
char s1[] = \char *s2 = \aaaaaaaaaaaÊÇÔÚÔËÐÐʱ¿Ì¸³ÖµµÄ£» ¶øbbbbbbbbbbbÊÇÔÚ±àÒëʱ¾ÍÈ·¶¨µÄ£»
µ«ÊÇ£¬ÔÚÒÔºóµÄ´æÈ¡ÖУ¬ÔÚÕ»ÉϵÄÊý×é±ÈÖ¸ÕëËùÖ¸ÏòµÄ×Ö·û´®(ÀýÈç¶Ñ)¿ì¡£ ±ÈÈ磺 #include void main() {
char a = 1;
char c[] = \char *p =\a = c[1]; a = p[1]; return; }
¶ÔÓ¦µÄ»ã±à´úÂë 10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al
µÚÒ»ÖÖÔÚ¶Áȡʱֱ½Ó¾Í°Ñ×Ö·û´®ÖеÄÔªËØ¶Áµ½¼Ä´æÆ÷clÖУ¬¶øµÚ¶þÖÖÔòÒªÏȰÑÖ¸ÕëÖµ¶Áµ½edxÖУ¬ÔÚ¸ù¾Ýedx¶ÁÈ¡×Ö·û£¬ÏÔÈ»ÂýÁË¡£
2.7С½á£º
¶ÑºÍÕ»µÄÇø±ð¿ÉÒÔÓÃÈçϵıÈÓ÷À´¿´³ö£º
ʹÓÃÕ»¾ÍÏóÎÒÃÇÈ¥·¹¹ÝÀï³Ô·¹£¬Ö»¹Üµã²Ë£¨·¢³öÉêÇ룩¡¢¸¶Ç®¡¢ºÍ³Ô£¨Ê¹Óã©£¬³Ô±¥Á˾Í×ߣ¬²»±ØÀí»áÇвˡ¢Ï´²ËµÈ×¼±¸¹¤×÷ºÍÏ´Í롢ˢ¹øµÈɨβ¹¤×÷£¬ËûµÄºÃ´¦ÊÇ¿ì½Ý£¬µ«ÊÇ×ÔÓɶÈС¡£
ʹÓöѾÍÏóÊÇ×Ô¼º¶¯ÊÖ×öϲ»¶³ÔµÄ²ËëÈ£¬±È½ÏÂé·³£¬µ«ÊDZȽϷûºÏ×Ô¼ºµÄ¿Ú棬¶øÇÒ×ÔÓɶȴó¡£
http://www.uyuan.net/list.asp?unid=13478
windows½ø³ÌÖеÄÄÚ´æ½á¹¹
ÔÚÔĶÁ±¾ÎÄ֮ǰ£¬Èç¹ûÄãÁ¬¶ÑÕ»ÊÇʲô¶à²»ÖªµÀµÄ»°£¬ÇëÏÈÔĶÁÎÄÕºóÃæµÄ»ù´¡ÖªÊ¶¡£
½Ó´¥¹ý±à³ÌµÄÈ˶¼ÖªµÀ£¬¸ß¼¶ÓïÑÔ¶¼ÄÜͨ¹ý±äÁ¿ÃûÀ´·ÃÎÊÄÚ´æÖеÄÊý¾Ý¡£ÄÇôÕâЩ±äÁ¿ÔÚÄÚ´æÖÐÊÇÈçºÎ´æ·ÅµÄÄØ£¿³ÌÐòÓÖÊÇÈçºÎʹÓÃÕâЩ±äÁ¿µÄÄØ£¿ÏÂÃæ¾Í»á¶Ô´Ë½øÐÐÉîÈëµÄÌÖÂÛ¡£ÏÂÎÄÖеÄCÓïÑÔ´úÂëÈçûÓÐÌØ±ðÉùÃ÷£¬Ä¬È϶¼Ê¹ÓÃVC±àÒëµÄrelease°æ¡£
Ê×ÏÈ£¬À´Á˽âһϠC ÓïÑԵıäÁ¿ÊÇÈçºÎÔÚÄÚ´æ·Ö²¿µÄ¡£C ÓïÑÔÓÐÈ«¾Ö±äÁ¿(Global)¡¢±¾µØ±äÁ¿(Local)£¬¾²Ì¬±äÁ¿(Static)¡¢¼Ä´æÆ÷±äÁ¿(Regeister)¡£Ã¿ÖÖ±äÁ¿¶¼Óв»Í¬µÄ·ÖÅ䷽ʽ¡£ÏÈÀ´¿´ÏÂÃæÕâ¶Î´úÂ룺
#include
int g1=0, g2=0, g3=0;
int main() {
static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0;
//´òÓ¡³ö¸÷¸ö±äÁ¿µÄÄÚ´æµØÖ·
printf(\´òÓ¡¸÷±¾µØ±äÁ¿µÄÄÚ´æµØÖ· printf(\printf(\
printf(\´òÓ¡¸÷È«¾Ö±äÁ¿µÄÄÚ´æµØÖ· printf(\printf(\
printf(\´òÓ¡¸÷¾²Ì¬±äÁ¿µÄÄÚ´æµØÖ· printf(\printf(\return 0; }
±àÒëºóµÄÖ´Ðнá¹ûÊÇ£º
0x0012ff78 0x0012ff7c 0x0012ff80
0x004068d0 0x004068d4 0x004068d8
0x004068dc 0x004068e0 0x004068e4
Êä³öµÄ½á¹û¾ÍÊDZäÁ¿µÄÄÚ´æµØÖ·¡£ÆäÖÐv1,v2,v3ÊDZ¾µØ±äÁ¿£¬g1,g2,g3ÊÇÈ«¾Ö±äÁ¿£¬s1,s2,s3ÊǾ²Ì¬±äÁ¿¡£Äã¿ÉÒÔ¿´µ½ÕâЩ±äÁ¿ÔÚÄÚ´æÊÇÁ¬Ðø·Ö²¼µÄ£¬µ«ÊDZ¾µØ±äÁ¿ºÍÈ«¾Ö±äÁ¿·ÖÅäµÄÄÚ´æµØÖ·²îÁËÊ®Íò°ËǧÀ¶øÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿·ÖÅäµÄÄÚ´æÊÇÁ¬ÐøµÄ¡£ÕâÊÇÒòΪ±¾µØ±äÁ¿ºÍÈ«¾Ö/¾²Ì¬±äÁ¿ÊÇ·ÖÅäÔÚ²»Í¬ÀàÐ͵ÄÄÚ´æÇøÓòÖеĽá¹û¡£¶ÔÓÚÒ»¸ö½ø³ÌµÄÄÚ´æ¿Õ¼ä¶øÑÔ£¬¿ÉÒÔÔÚÂß¼ÉÏ·Ö³É3¸ö²¿·Ý£º´úÂëÇø£¬¾²Ì¬Êý¾ÝÇøºÍ¶¯Ì¬Êý¾ÝÇø¡£¶¯Ì¬Êý¾ÝÇøÒ»°ã¾ÍÊǨD¶ÑÕ»¡¬¡£¨DÕ»(stack)¡¬ºÍ¨D¶Ñ(heap)¡¬ÊÇÁ½ÖÖ²»Í¬µÄ¶¯Ì¬Êý¾ÝÇø£¬Õ»ÊÇÒ»ÖÖÏßÐԽṹ£¬¶ÑÊÇÒ»ÖÖÁ´Ê½½á¹¹¡£½ø³ÌµÄÿ¸öÏ̶߳¼ÓÐ˽ÓеĨDÕ»¡¬£¬ËùÒÔÿ¸öÏß³ÌËäÈ»´úÂëÒ»Ñù£¬µ«±¾µØ±äÁ¿µÄÊý¾Ý¶¼ÊÇ»¥²»¸ÉÈÅ¡£Ò»¸ö¶ÑÕ»¿ÉÒÔͨ¹ý¨D»ùµØÖ·¡¬ºÍ¨DÕ»¶¥¡¬µØÖ·À´ÃèÊö¡£È«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿·ÖÅäÔÚ¾²Ì¬Êý¾ÝÇø£¬±¾µØ±äÁ¿·ÖÅäÔÚ¶¯Ì¬Êý¾ÝÇø£¬¼´¶ÑÕ»ÖС£³ÌÐòͨ¹ý¶ÑÕ»µÄ»ùµØÖ·ºÍÆ«ÒÆÁ¿À´·ÃÎʱ¾µØ±äÁ¿¡£
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©ÈµÍ¶ËÄÚ´æÇøÓò ©¦ ¡¡ ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ ¶¯Ì¬Êý¾ÝÇø ©¦ ©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ ¡¡ ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ ´úÂëÇø ©¦ ©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ ¾²Ì¬Êý¾ÝÇø ©¦ ©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ ¡¡ ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È¸ß¶ËÄÚ´æÇøÓò
¶ÑÕ»ÊÇÒ»¸öÏȽøºó³öµÄÊý¾Ý½á¹¹£¬Õ»¶¥µØÖ·×ÜÊÇСÓÚµÈÓÚÕ»µÄ»ùµØÖ·¡£ÎÒÃÇ¿ÉÒÔÏÈÁ˽âһϺ¯Êýµ÷ÓõĹý³Ì£¬ÒÔ±ã¶Ô¶ÑÕ»ÔÚ³ÌÐòÖеÄ×÷ÓÃÓиüÉîÈëµÄÁ˽⡣²»Í¬µÄÓïÑÔÓв»Í¬µÄº¯Êýµ÷Óù涨£¬ÕâЩÒòËØÓвÎÊýµÄѹÈë¹æÔòºÍ¶ÑÕ»µÄƽºâ¡£windows APIµÄµ÷ÓùæÔòºÍANSI CµÄº¯Êýµ÷ÓùæÔòÊDz»Ò»ÑùµÄ£¬Ç°ÕßÓɱ»µ÷º¯Êýµ÷Õû¶ÑÕ»£¬ºóÕßÓɵ÷ÓÃÕßµ÷Õû¶ÑÕ»¡£Á½Õßͨ¹ý¨D__stdcall¡¬ºÍ¨D__cdecl¡¬Ç°×ºÇø·Ö¡£ÏÈ¿´ÏÂÃæÕâ¶Î´úÂ룺
#include
void __stdcall func(int param1,int param2,int param3) {
int var1=param1; int var2=param2; int var3=param3;
printf(\m1); //´òÓ¡³ö¸÷¸ö±äÁ¿µÄÄÚ´æµØÖ· printf(\m2); printf(\m3); printf(\printf(\printf(\return; }
int main() {
func(1,2,3); return 0; }
±àÒëºóµÄÖ´Ðнá¹ûÊÇ£º
0x0012ff78 0x0012ff7c 0x0012ff80
0x0012ff68 0x0012ff6c 0x0012ff70
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È<¡ªº¯ÊýÖ´ÐÐʱµÄÕ»¶¥£¨ESP£©¡¢µÍ¶ËÄÚ´æÇøÓò ©¦ ¡¡ ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ var 1 ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ var 2 ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ var 3 ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ RET ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È<¡ª¨D__cdecl¡¬º¯Êý·µ»ØºóµÄÕ»¶¥£¨ESP£© ©¦ parameter 1 ©¦ ©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ parameter 2 ©¦ ©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È ©¦ parameter 3 ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È<¡ª¨D__stdcall¡¬º¯Êý·µ»ØºóµÄÕ»¶¥£¨ESP£© ©¦ ¡¡ ©¦
©À¡ª¡ª¡ª¡ª¡ª¡ª¡ª©È<¡ªÕ»µ×£¨»ùµØÖ· EBP£©¡¢¸ß¶ËÄÚ´æÇøÓò
ÉÏͼ¾ÍÊǺ¯Êýµ÷Óùý³ÌÖжÑÕ»µÄÑù×ÓÁË¡£Ê×ÏÈ£¬Èý¸ö²ÎÊýÒÔ´ÓÓÖµ½×óµÄ´ÎÐòѹÈë¶ÑÕ»£¬ÏÈѹ¨Dparam3¡¬£¬ÔÙѹ¨Dparam2¡¬£¬×îºóѹÈë¨Dparam1¡¬£»È»ºóѹÈ뺯ÊýµÄ·µ»ØµØÖ·(RET)£¬½Ó×ÅÌø×ªµ½º¯ÊýµØÖ·½Ó×ÅÖ´ÐУ¨ÕâÀïÒª²¹³äÒ»µã£¬½éÉÜUNIXÏµĻº³åÒç³öÔÀíµÄÎÄÕÂÖж¼Ìáµ½ÔÚѹÈëRETºó£¬¼ÌÐøÑ¹È뵱ǰEBP£¬È»ºóÓõ±Ç°ESP´úÌæEBP¡£È»¶ø£¬ÓÐһƪ½éÉÜwindowsϺ¯Êýµ÷ÓõÄÎÄÕÂÖÐ˵£¬ÔÚwindowsϵĺ¯Êýµ÷ÓÃÒ²ÓÐÕâÒ»²½Ö裬µ«¸ù¾ÝÎÒµÄʵ¼Êµ÷ÊÔ£¬²¢Î´·¢ÏÖÕâÒ»²½£¬Õ⻹¿ÉÒÔ´Óparam3ºÍvar1Ö®¼äÖ»ÓÐ4×ֽڵļä϶Õâµã¿´³öÀ´£©£»µÚÈý²½£¬½«Õ»¶¥(ESP)¼õÈ¥Ò»¸öÊý£¬Îª±¾µØ±äÁ¿·ÖÅäÄÚ´æ¿Õ¼ä£¬ÉÏÀýÖÐÊǼõÈ¥12×Ö½Ú(ESP=ESP-3*4£¬Ã¿¸öint±äÁ¿Õ¼ÓÃ4¸ö×Ö½Ú)£»½Óמͳõʼ»¯±¾µØ±äÁ¿µÄÄÚ´æ¿Õ¼ä¡£ÓÉÓÚ¨D__stdcall¡¬µ÷ÓÃÓɱ»µ÷º¯Êýµ÷Õû¶ÑÕ»£¬ËùÒÔÔÚº¯Êý·µ»ØÇ°Òª»Ö¸´¶ÑÕ»£¬ÏÈ»ØÊÕ±¾µØ±äÁ¿Õ¼ÓõÄÄÚ´æ(ESP=ESP+3*4)£¬
È»ºóÈ¡³ö·µ»ØµØÖ·£¬ÌîÈëEIP¼Ä´æÆ÷£¬»ØÊÕÏÈǰѹÈë²ÎÊýÕ¼ÓõÄÄÚ´æ(ESP=ESP+3*4)£¬¼ÌÐøÖ´Ðе÷ÓÃÕߵĴúÂë¡£²Î¼ûÏÂÁлã±à´úÂ룺
;--------------func º¯ÊýµÄ»ã±à´úÂë-------------------
:00401000 83EC0C sub esp, 0000000C //´´½¨±¾µØ±äÁ¿µÄÄÚ´æ¿Õ¼ä :00401003 8B442410 mov eax, dword ptr [esp+10] :00401007 8B4C2414 mov ecx, dword ptr [esp+14] :0040100B 8B542418 mov edx, dword ptr [esp+18] :0040100F 89442400 mov dword ptr [esp], eax :00401013 8D442410 lea eax, dword ptr [esp+10] :00401017 894C2404 mov dword ptr [esp+04], ecx
¡¡¡¡¡¡¡¡£¨Ê¡ÂÔÈô¸É´úÂ룩
:00401075 83C43C add esp, 0000003C ;»Ö¸´¶ÑÕ»£¬»ØÊÕ±¾µØ±äÁ¿µÄÄÚ´æ¿Õ¼ä :00401078 C3 ret 000C ;º¯Êý·µ»Ø£¬»Ö¸´²ÎÊýÕ¼ÓõÄÄÚ´æ¿Õ¼ä ;Èç¹ûÊǨD__cdecl¡¬µÄ»°£¬ÕâÀïÊǨDret¡¬£¬¶ÑÕ»½«Óɵ÷ÓÃÕ߻ָ´
;-------------------º¯Êý½áÊø-------------------------
;--------------Ö÷³ÌÐòµ÷ÓÃfuncº¯ÊýµÄ´úÂë--------------
:00401080 6A03 push 00000003 //ѹÈë²ÎÊýparam3 :00401082 6A02 push 00000002 //ѹÈë²ÎÊýparam2 :00401084 6A01 push 00000001 //ѹÈë²ÎÊýparam1 :00401086 E875FFFFFF call 00401000 //µ÷ÓÃfuncº¯Êý
;Èç¹ûÊǨD__cdecl¡¬µÄ»°£¬½«ÔÚÕâÀï»Ö¸´¶ÑÕ»£¬¨Dadd esp, 0000000C¡¬
´ÏÃ÷µÄ¶ÁÕß¿´µ½ÕâÀ²î²»¶à¾ÍÃ÷°×»º³åÒç³öµÄÔÀíÁË¡£ÏÈÀ´¿´ÏÂÃæµÄ´úÂ룺
#include
void __stdcall func() {
char lpBuff[8]=\
strcat(lpBuff,\return; }
int main() { func();