邪恶八进制信息安全团队技术讨论组's Archiver

ring04h 2006-3-30 19:21

[转载]逆向初步 增加XP记事本功能 使用背景色 文字颜色 下划线 删除线

<P>信息来源:Pediy</P>
<P>文章作者:andy00</P>
<P><FONT face=宋体><FONT color=#008000>;===============================================修改说明===============================================<BR><BR></FONT>【软件名称】XP记事本(Notepad)<BR>【下载地址】附件(附本文)<BR>【应用平台】Win9x/NT/2000/XP<BR>【软件大小】70K<BR>【软件限制】未修改时,不能使用背景色,文字色,下划线,删除线。<BR>【保护方式】--------<BR>【修改者】andy00<BR>【修改难度】1/10<BR>【修改说明】只是为了熟悉逆向工程,所以使用静态分析。<BR>【分析工具】Olldbg,计算器<BR>【参考资料】MSDN<BR>【软件简介】--------<BR><BR><BR><BR><FONT color=#008000>;===============================================增加的功能分析=========================================</FONT><BR><BR>功能1使字体对话框显示颜色,下划线,删除线的选项<BR>功能2在<FONT color=#ff00ff>"查看"</FONT>菜单下添加<FONT color=#ff00ff>"背景色"</FONT>菜单,点击能够选择颜色<BR>功能3让编辑框使用文字颜色,文字下划线,文字删除线,背景颜色功能<BR><BR><BR><BR><FONT color=#008000>;==========================================步骤1增加数据与代码区段===================================</FONT><BR><BR>用OLLDBG查看数据段,估计数据段的空闲字节数能够保存修改后生成的所有数据,此处选择从AE00到结束的空间来保存要用到的变量.添加代码需要比较大的空间,因此添加一个可执行区段(既然为了熟悉PE结构就手工添加),添加后在LordPE中验证添加成功:<BR><BR>SecNameVOffsetVSizeROffsetRSizeFlags<BR>andy00130001000104001000E0000020<BR><BR>因此新加代码放到:13000-10400(RVA)<BR>新加变量放到:0AE00-0AFFC(RVA)<BR><BR><BR><BR><FONT color=#008000>;=========================================步骤2需增加的变量与代码分析==================================</FONT><BR><BR><BR><FONT color=#008000>;功能1使字体对话框显示颜色,下划线,删除线的选项</FONT><BR><BR>记事本使用API函数ChooseFont打开字体对话框,此函数只有一个参数,指向CHOOSEFONT结构体的指针,CHOOSEFONT结构体定义如下<BR><BR>typedefstruct{<BR><FONT color=#ff0000>DWORD</FONT>lStructSize<FONT color=#008000>;</FONT><BR>HWNDhwndOwner<FONT color=#008000>;</FONT><BR>HDChDC<FONT color=#008000>;</FONT><BR>LPLOGFONTlpLogFont<FONT color=#008000>;</FONT><BR><FONT color=#0000ff>INT</FONT>iPointSize<FONT color=#008000>;</FONT><BR><FONT color=#ff0000>DWORD</FONT>Flags<FONT color=#008000>;</FONT><BR>COLORREFrgbColors<FONT color=#008000>;</FONT><BR>LPARAMlCustData<FONT color=#008000>;</FONT><BR>LPCFHOOKPROClpfnHook<FONT color=#008000>;</FONT><BR>LPCTSTRlpTemplateName<FONT color=#008000>;</FONT><BR>HINSTANCEhInstance<FONT color=#008000>;</FONT><BR>LPTSTRlpszStyle<FONT color=#008000>;</FONT><BR><FONT color=#ff0000>WORD</FONT>nFontType<FONT color=#008000>;</FONT><BR><FONT color=#0000ff>INT</FONT>nSizeMin<FONT color=#008000>;</FONT><BR><FONT color=#0000ff>INT</FONT>nSizeMax<FONT color=#008000>;</FONT><BR>}CHOOSEFONT,*LPCHOOSEFONT<FONT color=#008000>;</FONT><BR><BR>成员说明:<BR><BR>rgbColors用来保存用户选择的文字颜色<BR>Flags用来初始化字体对话框的各选项<BR><BR>因此:<BR><BR>1将用户选择的颜色rgbColors保存起来,放到AF94设为<FONT color=#ff0000>DWORD</FONT>(COLOREF)crText<BR>2记事本打开字体对话框时默认没有颜色的,下划线,删除线选项.要增加这些选项.只需要将Flags|CF_EFFECT,其中CF_EFFECT==0x100<BR><BR><BR><BR><BR><FONT color=#008000>;功能2在"查看"菜单下添加"背景色"菜单,点击能够选择颜色</FONT><BR><BR>直接用ResHack在<FONT color=#ff00ff>"查看"</FONT>菜单下添加一个菜单项<FONT color=#ff00ff>"背景色(&B)"</FONT>,ID为1C<BR><BR>点击菜单打开对话框,需要处理WM_COMMAND消息,并在消息在调用API函数ChooseColor().WM_COMMAND消息定义如下<BR><BR>WM_COMMAND(==111)<BR><BR>WPARAMwParam<BR>LPARAMlParam<FONT color=#008000>;</FONT><BR><BR>参数说明:<BR><BR>wParam对于菜单,低字代表菜单ID,高字为0<BR>lParam对于菜单,为0<BR><BR>API函数ChooseColor打开颜色选择对话框,此函数只有一个参数,指向CHOOSECOLOR结构的指针其中CHOOSECOLOR结构定义如下<BR><BR>typedefstruct{<BR><FONT color=#ff0000>DWORD</FONT>lStructSize<FONT color=#008000>;//+0</FONT><BR>HWNDhwndOwner<FONT color=#008000>;//+4</FONT><BR>HWNDhInstance<FONT color=#008000>;//+8</FONT><BR>COLORREFrgbResult<FONT color=#008000>;//+C</FONT><BR>COLORREF*lpCustColors<FONT color=#008000>;//+10</FONT><BR><FONT color=#ff0000>DWORD</FONT>Flags<FONT color=#008000>;//+14</FONT><BR>LPARAMlCustData<FONT color=#008000>;//+18</FONT><BR>LPCCHOOKPROClpfnHook<FONT color=#008000>;//+1C</FONT><BR>LPCTSTRlpTemplateName<FONT color=#008000>;//+20</FONT><BR>}CHOOSECOLOR,*LPCHOOSECOLOR<FONT color=#008000>;</FONT><BR><BR>1结构体长度为24,选用空间AFA0-AFC0存放此结构,设为CHOOSECOLORcc<BR>2此结构的一个成员lpCustColors指向一个COLORREF数组,此处用AE00开始的空间保存,设为COLORREFcrCustomColor[10]<BR>3还需要一个变量用来保存用户选择的颜色,此处用AF98保存,设为COLORREFcrBkgnd<FONT color=#008000>;</FONT><BR><BR><BR><BR><BR><FONT color=#008000>;功能3将选择的字体颜色和背景颜色应用到编辑框上面</FONT><BR><BR>设置文字颜色和背景颜色需要处理编辑框的WM_CTLCOLOREDIT消息,消息定义如下:<BR><BR>WM_CTLCOLOREDIT(==133)<BR><BR>WPARAMwParam<BR>LPARAMlParam<FONT color=#008000>;</FONT><BR><BR>参数说明<BR><BR>wParam编辑框的设备内容句柄.<BR>lParam编辑框的窗口句柄<BR><BR>每个非Disable和非ReadOnly的编辑框都可以发送这个消息,但是因为这里只有一个编辑框,所以不需要判断.直接在消息中调用<BR><BR>SetTextColor(wParam,crText)<FONT color=#008000>;设置文字颜色</FONT><BR>SetBkColor(wParam,crBkgnd)<FONT color=#008000>;设置背景颜色</FONT><BR><BR>此处需要一个画刷,颜色与背景色相同,返回给父窗口用来刷背景.将此画刷在AF9C,设为HBRUSHhBrBkgnd<BR><BR><BR><BR><BR><FONT color=#008000>;=========================================步骤3功能实现伪代码====================================</FONT><BR><BR>HWNDhEdit<FONT color=#008000>;;编辑框句柄,原程序中肯定已保存,因此暂不分配空间</FONT><BR>COLORREFcrCustomColor[10]<FONT color=#008000>;;AE00</FONT><BR>COLORREFcrText<FONT color=#008000>;;AF94</FONT><BR>CHOOSECOLORcc<FONT color=#008000>;;AFA0-AFC0</FONT><BR>COLORREFcrBkgnd<FONT color=#008000>;;AF98</FONT><BR>HBRUSHhBrBkgnd<FONT color=#008000>;;AF9C</FONT><BR><BR>LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)<BR>{<BR>switch(message)<BR>{<BR><BR>caseWM_COMMAND://WM_COMMAND=111<BR><BR>switch(LOWORD(wParam))<BR>{<BR>caseIDM_EDIT_CHOOSEFONT://<FONT color=#ff00ff>"字体"</FONT>菜单<BR><BR>......<BR>CHOOSEFONT.Flags|=CF_EFFECT<FONT color=#008000>;//增加颜色,下划线,删除线选项</FONT><BR>//..ChooseFont()<BR>crText=CHOOSEFONT.rgbColor<FONT color=#008000>;//保存选择的颜色</FONT><BR><BR>break<FONT color=#008000>;</FONT><BR><BR>caseIDM_VIEW_CHOOSECOLOR://IDM_VIEW_CHOOSECOLOR==1C<FONT color=#ff00ff>"背景色"</FONT>菜单<BR><BR>cc.lStructSize=sizeof(cc)<FONT color=#008000>;//+0</FONT><BR>cc.hwndOwner=hEdit<FONT color=#008000>;//+4</FONT><BR>cc.hInstance=0<FONT color=#008000>;//+8</FONT><BR>cc.rgbResult=0x00ff00<FONT color=#008000>;//+C</FONT><BR>cc.lpCustColors=crCustom<FONT color=#008000>;//+10</FONT><BR>cc.Flags=CF_RGBINIT<FONT color=#008000>;//+14</FONT><BR>cc.lCustData=0<FONT color=#008000>;//+18</FONT><BR>cc.lpfnHook=0<FONT color=#008000>;//+1C</FONT><BR>cc.lpTemplateName=0<FONT color=#008000>;//+20</FONT><BR><BR>if(ChooseColor(&cc)==<FONT color=#0000ff>TRUE</FONT>)<BR>{<BR>DeleteObject(hBrBkgnd)<FONT color=#008000>;//删除以前创建的,以免内存泄露</FONT><BR>clBkgnd=cc.rgbResult<FONT color=#008000>;//保存背景色</FONT><BR>hBrBkgnd=CreateSolidBrush(clBkgnd)<FONT color=#008000>;//根据选择的颜色创建画刷</FONT><BR><BR>InvalidateRect(hEdit,NULL,<FONT color=#0000ff>TRUE</FONT>)<FONT color=#008000>;//强制更新</FONT><BR>}<BR><BR>break<FONT color=#008000>;</FONT><BR><BR>default:<BR>returnDefWindowProc(hWnd,message,wParam,lParam)<FONT color=#008000>;</FONT><BR>}<BR>break<FONT color=#008000>;</FONT><BR><BR>caseWM_CTLCOLOREDIT:<BR><BR>SetTextColor((HDC)wParam,clText)<FONT color=#008000>;//设置文字色</FONT><BR>SetBkColor((HDC)wParam,clBkgnd)<FONT color=#008000>;//设置背景色</FONT><BR><BR>return(LRESULT)hBrBkgnd<FONT color=#008000>;//返回画刷</FONT><BR><BR>caseWM_DESTROY:<BR><BR>DeleteObject(hBrBkgnd)<FONT color=#008000>;//删除GDI对象,避免内存泄露</FONT><BR>//....<BR><BR>PostQuitMessage(0)<FONT color=#008000>;//原有代码,退出程序</FONT><BR><BR>break<FONT color=#008000>;</FONT><BR><BR>//case.......<BR>//case.......<BR><BR>default:<BR>returnDefWindowProc(hWnd,message,wParam,lParam)<FONT color=#008000>;</FONT><BR>}<BR>return0<FONT color=#008000>;</FONT><BR>}<BR><BR><BR><BR><FONT color=#008000>;=========================================步骤4增加输入函数======================================</FONT><BR><BR>从步骤2,3分析可知,需要用到的API函数<BR><BR>ChooseColorW<BR>CreateSolidBrush<BR>SetTextColor<BR>SetBkColor<BR>DeleteObject<BR>InvalidateRect<BR><BR>用LordPE查看记事本的输入表,已输入的函数:<BR><BR>DllNameFunName(函数名)ThunkRVA(调用偏移)<BR>gdi32.dllDeleteObject1224<BR>gdi32.dllInvalidateRect1068<BR><BR>输入其余函数(本来用手动输入,但是调用的时候总有问题,因此用LordPE输入)<BR><BR>DllNameFunName(函数名)ThunkRVA(调用偏移)<BR>comdlg32.dllChooseColorW1401C<BR>gdi32.dllCreateSolidBrush1405D<BR>gdi32.dllSetTextColor14061<BR>gdi32.dllSetBkColor14065<BR><BR><BR><BR><FONT color=#008000>;=========================================步骤5修改记事本代码======================================</FONT><BR><BR><FONT color=#008000>;====================增加对话框的颜色,下划线,删除线选项.====================</FONT><BR><BR>用OD打开记事本,查找调用ChooseFont,来到以下代码.<BR><BR>0100308A|.C785B4FDFFFF410><FONT color=#0000ff>MOV</FONT>[LOCAL.147],01000041<FONT color=#008000>;cf.Flags;</FONT><BR>01003094|.89B5B8FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.146],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.rgbColors</FONT><BR>0100309A|.89B5BCFDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.145],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.lCustData</FONT><BR>010030A0|.89B5C0FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.144],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.lpfnHook</FONT><BR>010030A6|.89B5C4FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.143],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.lpTemplateName</FONT><BR>010030AC|.89B5C8FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.142],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.hInstance</FONT><BR>010030B2|.89B5CCFDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.141],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.lpszStyle</FONT><BR>010030B8|.66:C785D0FDFFFF><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>WORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-230],2000<FONT color=#008000>;|cf.nFontType</FONT><BR>010030C1|.89B5D4FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.139],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.nSizeMin</FONT><BR>010030C7|.89B5D8FDFFFF<FONT color=#0000ff>MOV</FONT>[LOCAL.138],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|cf.nSizeMax</FONT><BR>010030CD|.FF1590110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.ReleaseDC>]<FONT color=#008000>;</FONT><BR>010030D3|.8D85A0FDFFFF<FONT color=#0000ff>LEA</FONT><FONT color=#808000>EAX</FONT>,[LOCAL.152]<FONT color=#008000>;</FONT><BR>010030D9|.50<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;&cf参数入栈</FONT><BR>010030DA|.FF15D0120001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&comdlg32.ChooseFontW>]<FONT color=#008000>;\ChooseFont(&cf)</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR>将pCHOOSEFONT的各成员分析出来,可知,Flags成员在<FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-24C],因此这里只需要将0100308A改为<BR><BR><FONT color=#008000>;更改后的0100308A</FONT><BR><BR>0100308AC785B4FDFFFF410><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-24C],01000141<FONT color=#008000>;0100041|100</FONT><BR><BR><FONT color=#008000>;变成0100141</FONT><BR>保存更改到文件,运行更改后的文件,此时出现了颜色等效果选项,但是现在还不能起作用.如图<BR><BR><IMG alt="" src="http://bbs.pediy.com/upload/2006/4/image/choosefontdlgsmall.jpg" border=0><BR><BR><BR><FONT color=#008000>;====================保存选择的颜色到clText(RVA==AF94)========================</FONT><BR><BR>010030E0|.85C0<FONT color=#0000ff>TEST</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EAX</FONT><BR>010030E2|.0F847F020000<FONT color=#0000ff>JE</FONT>01003367<BR>0101301FFF3584AB0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AB84]<FONT color=#008000>;更新这一句跳到自己的保存代码</FONT><BR><BR><BR><BR><FONT color=#008000>;0101301F更改为010030E8,多余字节用NOP填充</FONT><BR>010030E8-E932FF0000<FONT color=#0000ff>JMP</FONT>01013000<FONT color=#008000>;上一句更改后的代码</FONT><BR>010030ED90<FONT color=#0000ff>NOP</FONT><FONT color=#008000>;多余字节用NOP填充</FONT><BR><BR>010030EE|.8B1D8C110001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EBX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.SetCursor>]<FONT color=#008000>;自己的代码最后必须跳回此处.</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;010030E8跳到此处,自己的代码</FONT><BR><BR>01013000FF3584AB0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AB84]<FONT color=#008000>;还原0101301F被修改后的代码</FONT><BR>01013006A3FCAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFFC],<FONT color=#808000>EAX</FONT><FONT color=#008000>;保存EAX现场</FONT><BR>0101300B8B442428<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>ESP</FONT>+28]<FONT color=#008000>;EAX=pCHOOSEFONT.rgbColor</FONT><BR><FONT color=#008000>;保存选择的颜色到EAX</FONT><BR>0101300FA394AF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF94],<FONT color=#808000>EAX</FONT><FONT color=#008000>;保存到crText(RVA==AF94)</FONT><BR>01013014A1FCAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFFC]<FONT color=#008000>;还原EAX</FONT><BR>01013019-E9D000FFFF<FONT color=#0000ff>JMP</FONT>010030EE<FONT color=#008000>;跳回原程序处</FONT><BR><BR><BR><BR><BR><FONT color=#008000>;====================在中处理"背景色"菜单(==1C)的WM_COMMAND(==111)消息======================</FONT><BR><BR><FONT color=#008000>;首先用RegisterClass(Ex)函数定位WndProc(主窗口的消息处理函数)</FONT><BR><BR>RegisterClassEx只有一个参数WNDCLASSEX,此结构体定义如下<BR><BR>typedefstruct{<BR>UINTcbSize<FONT color=#008000>;</FONT><BR>UINTstyle<FONT color=#008000>;</FONT><BR>WNDPROClpfnWndProc<FONT color=#008000>;</FONT><BR><FONT color=#0000ff>int</FONT>cbClsExtra<FONT color=#008000>;</FONT><BR><FONT color=#0000ff>int</FONT>cbWndExtra<FONT color=#008000>;</FONT><BR>HINSTANCEhInstance<FONT color=#008000>;</FONT><BR>HICONhIcon<FONT color=#008000>;</FONT><BR>HCURSORhCursor<FONT color=#008000>;</FONT><BR>HBRUSHhbrBackground<FONT color=#008000>;</FONT><BR>LPCTSTRlpszMenuName<FONT color=#008000>;</FONT><BR>LPCTSTRlpszClassName<FONT color=#008000>;</FONT><BR>HICONhIconSm<FONT color=#008000>;</FONT><BR>}WNDCLASSEX,*PWNDCLASSEX<BR><BR><BR>一共12个成员,其中第3个成员就是窗口的消息处理函数.在堆栈中它们的顺序是反的,应该倒着数,也就是第10个成员<BR>在OD中用RegisterClassEx函数找到以下初始化WNDCLASSEX结构体的代码<BR><BR><BR><BR><FONT color=#008000>;RegisterClassEx注册窗口类</FONT><BR><BR>010044E2|.C745D030000000<FONT color=#0000ff>MOV</FONT>[LOCAL.12],30<FONT color=#008000>;|成员cbSize=30</FONT><BR>010044E9|.FF151C120001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.GetSystemMetrics><FONT color=#008000>;\GetSystemMetrics</FONT><BR>010044EF|.F7D8<FONT color=#0000ff>NEG</FONT><FONT color=#808000>EAX</FONT><BR>010044F1|.1BC0<FONT color=#0000ff>SBB</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EAX</FONT><BR>010044F3|.05017F0000<FONT color=#0000ff>ADD</FONT><FONT color=#808000>EAX</FONT>,7F01<BR>010044F8|.50<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;/RsrcName=EAX</FONT><BR>010044F9|.33FF<FONT color=#0000ff>XOR</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#808000>EDI</FONT><FONT color=#008000>;|</FONT><BR>010044FB|.57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;|hInst=NULL</FONT><BR>010044FC|.FF15D8110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.LoadCursorW>]<FONT color=#008000>;\EAX=LoadCursorW(NULL,RsrcName);</FONT><BR>01004502|.6A02<FONT color=#0000ff>PUSH</FONT>2<FONT color=#008000>;/RsrcName=2.</FONT><BR>01004504|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;|hInst</FONT><BR>01004505|.8945EC<FONT color=#0000ff>MOV</FONT>[LOCAL.5],<FONT color=#808000>EAX</FONT><FONT color=#008000>;|hCursor=EAX;</FONT><BR>01004508|.FF15EC110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.LoadIconW>]<FONT color=#008000>;\EAX=LoadIconW(hInst,RsrcName);</FONT><BR>0100450E|.57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;/Options=>LR_DEFAULTCOLOR</FONT><BR>0100450F|.6A10<FONT color=#0000ff>PUSH</FONT>10<FONT color=#008000>;|Height=10(16.)</FONT><BR>01004511|.6A10<FONT color=#0000ff>PUSH</FONT>10<FONT color=#008000>;|Width=10(16.)</FONT><BR>01004513|.6A01<FONT color=#0000ff>PUSH</FONT>1<FONT color=#008000>;|Type=IMAGE_ICON</FONT><BR>01004515|.6A02<FONT color=#0000ff>PUSH</FONT>2<FONT color=#008000>;|ResourceName=2</FONT><BR>01004517|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;|hInst</FONT><BR>01004518|.8945E8<FONT color=#0000ff>MOV</FONT>[LOCAL.6],<FONT color=#808000>EAX</FONT><FONT color=#008000>;|成员hIcon(大图标)</FONT><BR>0100451B|.FF15D4110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.LoadImageW>]<FONT color=#008000>;\LoadImageW</FONT><BR>01004521|.8945FC<FONT color=#0000ff>MOV</FONT>[LOCAL.1],<FONT color=#808000>EAX</FONT><FONT color=#008000>;成员hIconSm(小图标)</FONT><BR>01004524|.8D45D0<FONT color=#0000ff>LEA</FONT><FONT color=#808000>EAX</FONT>,[LOCAL.12]<BR>01004527|.50<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;/参数pWndClassEx入栈</FONT><BR>01004528|.C745F401000000<FONT color=#0000ff>MOV</FONT>[LOCAL.3],1<FONT color=#008000>;成员lpszMenuName;</FONT><BR>0100452F|.8975E4<FONT color=#0000ff>MOV</FONT>[LOCAL.7],<FONT color=#808000>ESI</FONT><FONT color=#008000>;|hInstance=hInst;</FONT><BR>01004532|.C745F820900001<FONT color=#0000ff>MOV</FONT>[LOCAL.2],01009020<FONT color=#008000>;成员lpszClassName="Notepad"</FONT><BR>01004539|.C745D829340001<FONT color=#0000ff>MOV</FONT>[LOCAL.10],01003429<FONT color=#008000>;|lpfnWndProc=01003429</FONT><BR><FONT color=#008000>;窗口处理函数01003429</FONT><BR>01004540|.C745F006000000<FONT color=#0000ff>MOV</FONT>[LOCAL.4],6<FONT color=#008000>;成员hbrBackground</FONT><BR>01004547|.897DD4<FONT color=#0000ff>MOV</FONT>[LOCAL.11],<FONT color=#808000>EDI</FONT><FONT color=#008000>;成员style</FONT><BR>0100454A|.897DDC<FONT color=#0000ff>MOV</FONT>[LOCAL.9],<FONT color=#808000>EDI</FONT><FONT color=#008000>;成员cbClsExtra;</FONT><BR>0100454D|.897DE0<FONT color=#0000ff>MOV</FONT>[LOCAL.8],<FONT color=#808000>EDI</FONT><FONT color=#008000>;|成员cbWndExtra;</FONT><BR>01004550|.FF15D0110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.RegisterClassExW><FONT color=#008000>;\RegisterClassExW</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR>由以上代码分析可知WNDPROC=01003429,来到函数WNDPROC<BR><BR><FONT color=#008000>;WNDPROC</FONT><BR><BR>010034298BFF<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#808000>EDI</FONT><FONT color=#008000>;</FONT><BR>0100342B/.55<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EBP</FONT><FONT color=#008000>;ESP-4</FONT><BR>0100342C|.8BEC<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EBP</FONT>,<FONT color=#808000>ESP</FONT><FONT color=#008000>;EBP=ESP</FONT><BR>0100342E|.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><FONT color=#008000>;ESP-4</FONT><BR>0100342F|.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><FONT color=#008000>;ESP-4</FONT><BR>01003430|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;ESP-4</FONT><BR>01003431|.8B750C<FONT color=#0000ff>MOV</FONT><FONT color=#808000>ESI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+C]<FONT color=#008000>;ESI=message</FONT><BR>01003434|.83FE1C<FONT color=#0000ff>CMP</FONT><FONT color=#808000>ESI</FONT>,1C<BR>01003437|.57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;ESP-4</FONT><BR>01003438|.6A08<FONT color=#0000ff>PUSH</FONT>8<BR>0100343A|.5A<FONT color=#0000ff>POP</FONT><FONT color=#808000>EDX</FONT><FONT color=#008000>;EDX=8;</FONT><BR>0100343B|.0F8741020000<FONT color=#0000ff>JA</FONT>01003682<FONT color=#008000>;if(message>1C)goto01003682</FONT><BR><FONT color=#008000>;................;WM_COMAND==111>1C所以到01003682</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR>理一下堆栈,[<FONT color=#808000>EBP</FONT>]=原<FONT color=#808000>EBP</FONT>,[<FONT color=#808000>EBP</FONT>+4]=返回地址,[<FONT color=#808000>EBP</FONT>+8]=hWnd,[<FONT color=#808000>EBP</FONT>+C]=message,[<FONT color=#808000>EBP</FONT>+10]=wParam,[<FONT color=#808000>EBP</FONT>+14]=lParam<BR><BR><BR><BR><FONT color=#008000>;0100343B跳到此处</FONT><BR><BR>01003682|>\8B7D14<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+14]<FONT color=#008000>;EDI=lParam</FONT><BR>01003685|.8BC6<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>ESI</FONT><FONT color=#008000>;EAX=message</FONT><BR>01003687|.2D11010000<FONT color=#0000ff>SUB</FONT><FONT color=#808000>EAX</FONT>,111<FONT color=#008000>;EAX-=111(=WM_COMMAND)</FONT><BR>0100368C|.0F8435020000<FONT color=#0000ff>JE</FONT>010038C7<FONT color=#008000>;if(eax==WM_COMMAND)goto010038C7</FONT><BR><FONT color=#008000>;................;到WM_COMMAND的处理过程</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;0100368C跳到此处</FONT><BR><BR>010038C7|>\3B3D38980001<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]<FONT color=#008000>;</FONT><BR>010038CD|.754C<FONT color=#0000ff>JNZ</FONT><FONT color=#ff0000>SHORT</FONT>0100391B<FONT color=#008000>;</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR>这里遇到一个条件转移,但是我们并不清楚,1009838里放着什么,如果点击了<FONT color=#ff00ff>"背景色"</FONT>菜单,这里是跳不是不跳呢?不清楚,所以我们必须弄清楚,这里<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838],但是因为<FONT color=#808000>EDI</FONT>=lParam,在WM_COMMAND中,对于菜单,lParam==0,对于控件,lParam=控件窗口句柄.因此<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]最有可能是一个句柄,在记事本程序中,要在代码中使用句柄的也许只有编辑框和主窗口了.而且,在主窗口的消息处理函数中,很少用lParm与hWnd比较的(几乎没有).所以这里假设它为编辑框的句柄.<BR><BR>为了确定,用CreateWindowEX函数找到创建编辑框的代码,有两个,其中一个包含了对地址<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]的访问如下<BR><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR>01004771|.FF15E0110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.CreateWindowExW>><FONT color=#008000>;\CreateWindowExW</FONT><BR>01004777|.3BC3<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EBX</FONT><BR>01004779A338980001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838],<FONT color=#808000>EAX</FONT><FONT color=#008000>;1009838=hEdit</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR>很容易看出来,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]保存的就是编辑框句柄hEdit(也可用查找的方法找到<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838])的保存的什么.<BR>回到010038C7继续分析,由于对于菜单,lParam为0,即<FONT color=#808000>EDI</FONT>=0,所以<FONT color=#808000>EDI</FONT>!=hEdit,程序将跳到0100391B继续执行.<BR><BR>010038C7|>\3B3D38980001<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]<FONT color=#008000>;lParam!=hEdit</FONT><BR>010038CD|.754C<FONT color=#0000ff>JNZ</FONT><FONT color=#ff0000>SHORT</FONT>0100391B<FONT color=#008000>;点击"背景色"菜单,此处必跳</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;010038CD跳到此处</FONT><BR><BR>0100391B|>\57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;/Arg3=lParam</FONT><BR>0100391C|.FF7510<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+10]<FONT color=#008000>;|Arg2=wParam</FONT><BR>0100391F|.FF7508<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+8]<FONT color=#008000>;|Arg1=hWnd</FONT><BR>01003922|.E860F2FFFF<FONT color=#0000ff>CALL</FONT>01002B87<FONT color=#008000>;\非编辑框的WM_COMMAND消息的处理函数</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;01003922处调用此处,非编辑框的WM_COMMAND消息的处理函数01002B87(hWnd,wParam,lParam)</FONT><BR><BR>01002B87/$8BFF<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#808000>EDI</FONT><BR>01002B89|.55<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EBP</FONT><FONT color=#008000>;ESP-4</FONT><BR>01002B8A|.8BEC<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EBP</FONT>,<FONT color=#808000>ESP</FONT><FONT color=#008000>;EBP=ESP</FONT><BR><FONT color=#008000>;[EBP+4]=返回地址,[EBP+8]=hWnd</FONT><BR><FONT color=#008000>;[EBP+C]=wParam,[EBP+10]=lParam</FONT><BR>01002B8C|.81EC60020000<FONT color=#0000ff>SUB</FONT><FONT color=#808000>ESP</FONT>,260<FONT color=#008000>;ESP-260;</FONT><BR>01002B92|.A104960001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009604]<FONT color=#008000>;</FONT><BR>01002B97|.8B5508<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+8]<FONT color=#008000>;EDX=hWnd</FONT><BR>01002B9A|.53<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EBX</FONT><FONT color=#008000>;ESP-4</FONT><BR>01002B9B|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;ESP-4</FONT><BR>01002B9C|.57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;ESP-4</FONT><BR>01002B9D|.8945FC<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-4],<FONT color=#808000>EAX</FONT><FONT color=#008000>;localVar1=EAX</FONT><BR>01002BA0|.33F6<FONT color=#0000ff>XOR</FONT><FONT color=#808000>ESI</FONT>,<FONT color=#808000>ESI</FONT><BR>01002BA2|.33C0<FONT color=#0000ff>XOR</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EAX</FONT><FONT color=#008000>;EAX=ESI=0;</FONT><BR>01002BA4|.66:89B5F4FDFFFF<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>WORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-20C],<FONT color=#808000>SI</FONT><FONT color=#008000>;localVar83=0</FONT><BR>01002BAB|.B981000000<FONT color=#0000ff>MOV</FONT><FONT color=#808000>ECX</FONT>,81<FONT color=#008000>;ECX=81;</FONT><BR>01002BB0|.8DBDF6FDFFFF<FONT color=#0000ff>LEA</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-20A]<FONT color=#008000>;EDI=&localVar82</FONT><BR>01002BB6|.F3:AB<FONT color=#0000ff>REP</FONT><FONT color=#0000ff>STOSD</FONT><BR>01002BB8|.66:AB<FONT color=#0000ff>STOSW</FONT><BR><BR>01002BBA|.0FB77D0C<FONT color=#0000ff>MOVZX</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#ff0000>WORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+C]<FONT color=#008000>;EDI=wParam取得控件/菜单ID到EDI</FONT><BR><BR>01002BBE|.83FF40<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EDI</FONT>,40<FONT color=#008000>;这里开始比较控件/菜单ID了,</FONT><BR>01002BC1|.8995F0FDFFFF<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-210],<FONT color=#808000>EDX</FONT><FONT color=#008000>;所以更改此处跳到自己的代码</FONT><BR>01002BC7|.0F8FF9060000<FONT color=#0000ff>JG</FONT>010032C6<FONT color=#008000>;自己的代码最后必须跳回此处</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;01002BBE与01002BC1改为,多余字节以NOP填充</FONT><BR><BR>01002BBE.-E95B040100<FONT color=#0000ff>JMP</FONT>0101301E<FONT color=#008000>;跳到自己的代码处</FONT><BR>01002BC390<FONT color=#0000ff>NOP</FONT><BR>01002BC490<FONT color=#0000ff>NOP</FONT><BR>01002BC590<FONT color=#0000ff>NOP</FONT><BR>01002BC690<FONT color=#0000ff>NOP</FONT><FONT color=#008000>;多余字节以NOP填充</FONT><BR><BR><BR><BR><FONT color=#008000>;01002BBE跳到此处,自己的代码,用于响应"背景色"菜单,弹出颜色对话框,保存颜色,创建画刷</FONT><BR><BR>0101301E83FF1C<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EDI</FONT>,1C<FONT color=#008000>;比较控件ID</FONT><BR>010130210F85A3000000<FONT color=#0000ff>JNZ</FONT>010130CA<FONT color=#008000>;如果wParam!=1C(不是"背景色"菜单)</FONT><BR>0101302790<FONT color=#0000ff>NOP</FONT><FONT color=#008000>;则跳到010130CA,让给程序处理</FONT><BR>01013028A138980001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]<FONT color=#008000>;EAX=hEdit</FONT><BR><FONT color=#008000>;以下几行初始化CHOOSECOLOR各成员</FONT><BR>0101302DA3A4AF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFA4],<FONT color=#808000>EAX</FONT><FONT color=#008000>;/cc.hwndOwner=hEdit</FONT><BR>01013032C705A0AF000124000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFA0],24<FONT color=#008000>;|cc.lStructSize=24</FONT><BR>0101303CC705A8AF000100000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFA8],0<FONT color=#008000>;|cc.hInstance=NULL</FONT><BR>01013046C705ACAF00010000F><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFAC],0FF0000<FONT color=#008000>;|cc.rgbResult=蓝色</FONT><BR>01013050C705B0AF000100AE0><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFB0],0100AE00<FONT color=#008000>;|cc.lpCustColors=0100AE00</FONT><BR>0101305AC705B4AF000101000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFB4],1<FONT color=#008000>;|cc.Flags=CC_RGBINIT</FONT><BR>01013064C705B8AF000100000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFB8],0<FONT color=#008000>;|cc.lCustData=0</FONT><BR>0101306EC705BCAF000100000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFBC],0<FONT color=#008000>;|cc.lpfnHook=0</FONT><BR>01013078C705C0AF000100000><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFC0],0<FONT color=#008000>;|cc.lpTemplateName=NULL</FONT><BR>0101308250<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;|保存EAX现场</FONT><BR>0101308368A0AF0001<FONT color=#0000ff>PUSH</FONT>0100AFA0<FONT color=#008000>;|参数&cc入栈</FONT><BR>01013088FF151C400101<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&comdlg32.ChooseColorW>]<FONT color=#008000>;\ChooseColorW(&cc)</FONT><BR>0101308E09C0<FONT color=#0000ff>OR</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EAX</FONT><BR>010130907437<FONT color=#0000ff>JE</FONT><FONT color=#ff0000>SHORT</FONT>010130C9<FONT color=#008000>;if(EAX==0)说明用户取消或出错</FONT><BR><FONT color=#008000>;则不保存选择的颜色,交给程序处理</FONT><BR>01013092A1ACAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AFAC]<BR>01013097A398AF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF98],<FONT color=#808000>EAX</FONT><FONT color=#008000>;crBkgnd(RVA=AF98)=cc.rgbResult</FONT><BR><FONT color=#008000>;保存颜色到crBkgnd</FONT><BR>0101309CFF359CAF0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF9C]<FONT color=#008000>;/参数hBrBkgnd(RVA==AF9C)画刷句柄入栈</FONT><BR>010130A2FF1568100001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&GDI32.DeleteObject>]<FONT color=#008000>;\DeleteObject(hBrBkgnd)</FONT><BR><FONT color=#008000>;删除原画刷防止内存泄漏</FONT><BR>010130A8FF3598AF0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF98]<FONT color=#008000>;/参数crBkgnd入栈</FONT><BR>010130AEFF155D400101<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[101405D]<FONT color=#008000>;\EAX=CreateSolidBrush(crBkgnd)</FONT><BR><FONT color=#008000>;根据选择的颜色创建画刷</FONT><BR>010130B4A39CAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF9C],<FONT color=#808000>EAX</FONT><FONT color=#008000>;画刷句柄保存到hBrBkgnd(RVA==AF9C)</FONT><BR>010130B96A01<FONT color=#0000ff>PUSH</FONT>1<FONT color=#008000>;/</FONT><BR>010130BB6A00<FONT color=#0000ff>PUSH</FONT>0<FONT color=#008000>;|</FONT><BR>010130BDFF3538980001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]<FONT color=#008000>;|参数hEdit入栈</FONT><BR>010130C3FF1524120001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.InvalidateRect>]<FONT color=#008000>;\InvalidateRect(hEdit,NULL,TRUE)</FONT><BR><FONT color=#008000>;强制更新编辑框使画刷与背景色生效</FONT><BR>010130C958<FONT color=#0000ff>POP</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;还原EAX</FONT><BR>010130CA83FF40<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EDI</FONT>,40<FONT color=#008000>;原来的代码</FONT><BR>010130CD8995F0FDFFFF<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>-210],<FONT color=#808000>EDX</FONT><FONT color=#008000>;原来的代码</FONT><BR>010130D3-E9EBFAFEFF<FONT color=#0000ff>JMP</FONT>01002BC3<FONT color=#008000>;跳回01002BC7继续执行.</FONT><BR><BR><BR><BR><BR><FONT color=#008000>;====================处理WM_DESTORY(==2)删除画刷对象以免内存泄漏======================</FONT><BR><BR><FONT color=#008000>;WNDPROC</FONT><BR><BR>010034298BFF<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#808000>EDI</FONT><BR>0100342B.55<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EBP</FONT><BR>0100342C.8BEC<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EBP</FONT>,<FONT color=#808000>ESP</FONT><BR>0100342E.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><BR>0100342F.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><BR>01003430.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><BR>01003431.8B750C<FONT color=#0000ff>MOV</FONT><FONT color=#808000>ESI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+C]<FONT color=#008000>;ESI=message;</FONT><BR>01003434.-E9A7FC0000<FONT color=#0000ff>JMP</FONT>010130E0<BR>0100343990<FONT color=#0000ff>NOP</FONT><BR>0100343A.5A<FONT color=#0000ff>POP</FONT><FONT color=#808000>EDX</FONT><BR>0100343B.0F8741020000<FONT color=#0000ff>JA</FONT>01003682<BR>01003441.0F84B7010000<FONT color=#0000ff>JE</FONT>010035FE<BR>01003447.3BF2<FONT color=#0000ff>CMP</FONT><FONT color=#808000>ESI</FONT>,<FONT color=#808000>EDX</FONT><BR>01003449.0F87ED000000<FONT color=#0000ff>JA</FONT>0100353C<BR>0100344F.0F84DB000000<FONT color=#0000ff>JE</FONT>01003530<BR>01003455.8BC6<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>ESI</FONT><FONT color=#008000>;EAX=message;</FONT><BR>01003457.48<FONT color=#0000ff>DEC</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;message--;</FONT><BR>01003458.48<FONT color=#0000ff>DEC</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;message--;</FONT><BR>01003459.0F84C7000000<FONT color=#0000ff>JE</FONT>01003526<FONT color=#008000>;if(message==WM_DESTORY)goto1003526</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR>01003526>\6A00<FONT color=#0000ff>PUSH</FONT>0<FONT color=#008000>;修改此句跳到自己的代码</FONT><BR>01003528.FF15F4110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[010011F4]<FONT color=#008000>;此句被修改</FONT><BR>0100352E.^EB8D<FONT color=#0000ff>JMP</FONT><FONT color=#ff0000>SHORT</FONT>010034BD<FONT color=#008000>;此句被修改</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;修改后的代码01003526-01003528-0100352E,多余字节用NOP填充</FONT><BR><BR>01003526>-\E925FC0000<FONT color=#0000ff>JMP</FONT>01013150<FONT color=#008000>;Case2ofswitch01003457</FONT><BR>0100352B90<FONT color=#0000ff>NOP</FONT><BR>0100352C90<FONT color=#0000ff>NOP</FONT><BR>0100352D90<FONT color=#0000ff>NOP</FONT><BR>0100352E90<FONT color=#0000ff>NOP</FONT><BR>0100352F90<FONT color=#0000ff>NOP</FONT><BR>01003530>FF7514<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+14]<BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;自己的代码,删除画刷句柄hBrBkgdn(RVA==AF9C)</FONT><BR><BR>01013150FF359CAF0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF9C]<FONT color=#008000>;hBrBkgnd(RVA==AF9C)入栈</FONT><BR>01013156FF1568100001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&GDI32.DeleteObject>]<FONT color=#008000>;DeleteObject(hBrBkgnd)删除画刷</FONT><BR><FONT color=#008000>;释放内存,防止泄漏</FONT><BR>0101315C6A00<FONT color=#0000ff>PUSH</FONT>0<FONT color=#008000>;原来的代码</FONT><BR>0101315EFF15F4110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.PostQuitMessage>><FONT color=#008000>;USER32.PostQuitMessage</FONT><BR>01013164-E95403FFFF<FONT color=#0000ff>JMP</FONT>010034BD<FONT color=#008000>;原来的代码</FONT><BR><BR><BR>保存更改到文件,然后运行修改过的程序,点击<FONT color=#ff00ff>"背景色"</FONT>菜单,就能弹出颜色对话框了,但是现在选择的颜色还不能起作用,因为要给编辑框设背景色或者文字色,必须处理WM_CTLCOLOREDIT消息.如图<BR><BR><IMG alt="" src="http://bbs.pediy.com/upload/2006/4/image/choosecolordlgsmall.jpg" border=0><BR><BR><BR><FONT color=#008000>;====================处理WM_CTLCOLOREDIT(==133)消息设置颜色画刷======================</FONT><BR><BR>因为程序原来是不处理WM_CTLCOLOREDIT的消息的,所以处理WM_CTLCOLOREDIT消息的过程与WM_COMMND及WM_DESTORY稍有不同,必须自己添加判断代码,再次来到WNDPROC:<BR><BR><FONT color=#008000>;WNDPROC</FONT><BR><BR>010034298BFF<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EDI</FONT>,<FONT color=#808000>EDI</FONT><FONT color=#008000>;</FONT><BR>0100342B/.55<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EBP</FONT><FONT color=#008000>;ESP-4</FONT><BR>0100342C|.8BEC<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EBP</FONT>,<FONT color=#808000>ESP</FONT><FONT color=#008000>;EBP=ESP</FONT><BR>0100342E|.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><FONT color=#008000>;ESP-4</FONT><BR>0100342F|.51<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ECX</FONT><FONT color=#008000>;ESP-4</FONT><BR>01003430|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;ESP-4</FONT><BR>01003431|.8B750C<FONT color=#0000ff>MOV</FONT><FONT color=#808000>ESI</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+C]<FONT color=#008000>;ESI=message</FONT><BR><BR>01003434|.83FE1C<FONT color=#0000ff>CMP</FONT><FONT color=#808000>ESI</FONT>,1C<FONT color=#008000>;=====修改这里跳到自己的代码====</FONT><BR>01003437|.57<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;=======此句被修改ESP-4=========</FONT><BR>01003438|.6A08<FONT color=#0000ff>PUSH</FONT>8<FONT color=#008000>;=======此句被修改==============</FONT><BR><BR>0100343A|.5A<FONT color=#0000ff>POP</FONT><FONT color=#808000>EDX</FONT><FONT color=#008000>;EDX=8;;如果不是WM_CTLCOLOREDIT消息</FONT><BR><FONT color=#008000>;................;则最后必须跳回到此处</FONT><BR><FONT color=#008000>;................;如果是WM_CTLCOLOREDIT消息则最后</FONT><BR><FONT color=#008000>;必须返回函数值,结束WNDPROC,</FONT><BR><FONT color=#008000>;而不再顺到这里,原因请见伪代码</FONT><BR><BR><FONT color=#008000>;修改后的01003434-01003437-01003438,多余字节以NOP填充</FONT><BR><BR>01003434.-E9A7FC0000<FONT color=#0000ff>JMP</FONT>010130E0<BR>0100343990<FONT color=#0000ff>NOP</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><BR><FONT color=#008000>;01003434跳到此处,自己的代码,判断及处理WM_CTLCOLOREDIT消息</FONT><BR><BR>010130E081FE33010000<FONT color=#0000ff>CMP</FONT><FONT color=#808000>ESI</FONT>,133<BR>010130E6752B<FONT color=#0000ff>JNZ</FONT><FONT color=#ff0000>SHORT</FONT>01013113<FONT color=#008000>;假如不是WM_CTLCOLOREDIT消息则</FONT><BR><FONT color=#008000>;自己不处理,跳回原处,交给程序处理</FONT><BR>010130E850<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;保存EAX现场</FONT><BR>010130E9FF3594AF0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF94]<FONT color=#008000>;/参数crText(RVA==AF94)入栈</FONT><BR>010130EFFF7510<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+10]<FONT color=#008000>;|参数wParam入栈</FONT><BR>010130F2FF1561400101<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1014061]<FONT color=#008000>;\SetTextColor(wParam,crText)</FONT><BR>010130F8FF3598AF0001<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF98]<FONT color=#008000>;/参数crBkgnd(RVA==AF98)入栈</FONT><BR>010130FEFF7510<FONT color=#0000ff>PUSH</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>SS</FONT>:[<FONT color=#808000>EBP</FONT>+10]<FONT color=#008000>;|参数wParam入栈</FONT><BR>01013101FF1565400101<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1014065]<FONT color=#008000>;\SetBkColor(wParam,crBkgnd)</FONT><BR>0101310758<FONT color=#0000ff>POP</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;恢复EAX</FONT><BR>01013108A19CAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF9C]<FONT color=#008000>;EAX=hBrBkgnd(RVA==AF9C)准备返回画刷</FONT><BR><BR>0101310D5F<FONT color=#0000ff>POP</FONT><FONT color=#808000>EDI</FONT><BR>0101310E5E<FONT color=#0000ff>POP</FONT><FONT color=#808000>ESI</FONT><BR>0101310FC9<FONT color=#0000ff>LEAVE</FONT><BR>01013110C21000<FONT color=#0000ff>RET</FONT>10<FONT color=#008000>;平衡堆栈并返回画刷(eax),结束WNDPROC</FONT><BR><BR>0101311383FE1C<FONT color=#0000ff>CMP</FONT><FONT color=#808000>ESI</FONT>,1C<FONT color=#008000>;原来的代码</FONT><BR>0101311657<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EDI</FONT><FONT color=#008000>;原来的代码</FONT><BR>010131176A08<FONT color=#0000ff>PUSH</FONT>8<FONT color=#008000>;原来的代码</FONT><BR>01013119-E91C03FFFF<FONT color=#0000ff>JMP</FONT>0100343A<FONT color=#008000>;0100343A</FONT><BR><BR><BR>保存修改到文件,运行修改过的文件,现在可以设置文字色,背景色了,并且设置可以反应到编辑框了,但是程序刚启动的时候,默认的背景色和文字色都是黑色的,并且在有文字行才有背景色,显示不正常,并且看不到文字<BR><BR>默认背景色是黑色是因为,程序启动的时候开始WM_CTLCOLOREDIT消息中的SetBkColor和SetTextColor都在起作用了,但是这时候,crText(RVA==AF94)和crBkgnd(RVA==AF98)在内存中的值都是00000000,改变它们就能改变默认背景色和文字色.<BR>在有文字的行才有背景色是因为,此时的hBrBkgnd(RVA==AF9C)是个无效的画刷句柄,程序不能用此画刷画背景,导致显示不正常.<BR>所以也需要初始化hBrBkgnd.<BR><BR>初始化他们的最好地方是编辑框刚被创建还没有显示的时候.再次来到创建编辑框的地方<BR><BR><BR><BR><FONT color=#008000>;创建编辑框:</FONT><BR><BR>01004765|.50<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>EAX</FONT><FONT color=#008000>;|Style</FONT><BR>01004766|.56<FONT color=#0000ff>PUSH</FONT><FONT color=#808000>ESI</FONT><FONT color=#008000>;|WindowName</FONT><BR>01004767|.6894170001<FONT color=#0000ff>PUSH</FONT>01001794<FONT color=#008000>;|Class="Edit"</FONT><BR>0100476C|.6800020000<FONT color=#0000ff>PUSH</FONT>200<FONT color=#008000>;|ExtStyle=WS_EX_CLIENTEDGE</FONT><BR>01004771|.FF15E0110001<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[<&USER32.CreateWindowExW>]<FONT color=#008000>;\CreateWindowExW</FONT><BR>01004777|.3BC3<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EBX</FONT><FONT color=#008000>;修改此然跳到自己的代码</FONT><BR>01004779|.A338980001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838],<FONT color=#808000>EAX</FONT><FONT color=#008000>;改这一句跳到0101311E</FONT><BR>0100477E|.0F842A020000<FONT color=#0000ff>JE</FONT>010049AE<FONT color=#008000>;最后必须返回到这里</FONT><BR><FONT color=#008000>;................</FONT><BR><FONT color=#008000>;................</FONT><BR><BR><BR><BR><FONT color=#008000>;修改后的代码01004777-01004779修改为</FONT><BR><BR>01004777.90<FONT color=#0000ff>NOP</FONT><BR>01004778.90<FONT color=#0000ff>NOP</FONT><BR>01004779-E9A1E90000<FONT color=#0000ff>JMP</FONT>0101311E<FONT color=#008000>;跳到自己的代码0101311E</FONT><BR><BR><BR><BR><FONT color=#008000>;自己的代码初始化crText,crBkgnd,hBrBkgnd</FONT><BR><BR>0101311EA338980001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838],<FONT color=#808000>EAX</FONT><FONT color=#008000>;原来的代码</FONT><BR>0101312368FFFFFF00<FONT color=#0000ff>PUSH</FONT>0FFFFFF<FONT color=#008000>;RGB(FF,FF,FF)白色入栈</FONT><BR>01013128FF155D400101<FONT color=#0000ff>CALL</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[101405D]<FONT color=#008000>;CreateSolidBrush创建白色画刷</FONT><BR>0101312EA39CAF0001<FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF9C],<FONT color=#808000>EAX</FONT><FONT color=#008000>;画刷句柄保存到hBrBkgnd(RVA==AF9C)</FONT><BR>01013133C70598AF0001FFFFF><FONT color=#0000ff>MOV</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[100AF98],0FFFFFF<FONT color=#008000>;crBkgnd(RVA==AF98)=白色</FONT><BR>0101313DA138980001<FONT color=#0000ff>MOV</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#ff0000>DWORD</FONT><FONT color=#ff0000>PTR</FONT><FONT color=#808000>DS</FONT>:[1009838]<FONT color=#008000>;原来的代码</FONT><BR>010131423BC3<FONT color=#0000ff>CMP</FONT><FONT color=#808000>EAX</FONT>,<FONT color=#808000>EBX</FONT><FONT color=#008000>;原来的代码</FONT><BR>01013144-E93516FFFF<FONT color=#0000ff>JMP</FONT>0100477E<FONT color=#008000>;跳回原处交给程序处理</FONT><BR><BR><BR>最后的效果:<BR><BR><IMG alt="" src="http://bbs.pediy.com/upload/2006/4/image/colornotepadsmall..jpg" border=0><BR><BR>=======THE<FONT color=#0000ff>END</FONT>!=========<BR><BR><FONT color=#008000>;===============================================QQ:41086722=========================================</FONT><BR><BR>欢迎交流<BR><BR>有两个问题<BR>196.6K的BMP图片无法上传....<BR>2新增加的代码区段和原来的代码段都修改了代码如何一次性保存所有更改到可执行文件???</FONT><BR></P>

icexiaoye 2006-8-10 23:14

[s:80] 逆向才是破解的最后啊~

东方 2006-12-30 17:08

学习了,正需要这方面的资料。

页: [1]
© 1999-2008 EvilOctal Security Team