• 标 题:pediy之"画猫"篇:)第一次写,大家批批
  • 作 者:雅枫
  • 时 间:2003年12月10日 06:50
  • 链 接:http://bbs.pediy.com

pediy之"画猫"篇

    pediy是高深的东东,要进化成pll621老大类的"超级牛人",没几年的努力+天赋是不行地,8过似我等超级菜鸟,玩玩几个api为软件"加点料"还是可以地,这不,偶对着教程(虎),欺负了一下radasm(画成了猫,所以就叫"画猫"篇了^_^.这篇文章没啥新意,希望对还没有入门的菜鸟们一点帮助吧.
    大家知道radasm在9x下不能输入俺们的方块字(会死得很惨),我又没能力修正其编辑器(看雪上的修正版虽然能输入但不能编辑),所以偶就想给他增加个功能.调用外部编辑器打开它编辑了.偶用到的东东有trw2000,ollydbg,lordpe,exescope,hedit(任意编辑器),我还用到了w32dasm,8过不用也可以.
    初探:研究可行性,在radasm的工程窗口有个右键菜单,最适合加上打开的功能了(8错8错,用exescope加上个"用其他编辑器打开"呵呵,但现在他啥也干不了,别急,我们还没加功能呢),用trw载如radasm,下断点bpx createfilea(这个api用于打开文件,文件操作少不了他)先bd*然后g,就出来了主界面,打开一个工程,用ctrl+m调出主界面,be*,然后双击一个文件,不出所料,中断了下来我发现压入的地址是:440F3E,D 440F3E,果然出来了文件地址,然后G,又打开个别的文件,发现压入的还是440F3E(兴奋呀,这个太简单了,文件名地址是不变的)加上我们的代码,调用外部编辑器打开就可以了,有三个函数供我们使用:WINEXEC,ShellExecute,CreateProcess,最后一个参数太多,偶头疼,第一个简单,不过太呆板,我就选择了第二个,其参数如下

HINSTANCE ShellExecute(

    HWND hwnd,  // handle to parent window
    LPCTSTR lpOperation,  // pointer to string that specifies operation to perform
    LPCTSTR lpFile,  // pointer to filename or folder name string
    LPCTSTR lpParameters,  // pointer to string that specifies executable-file parameters 
    LPCTSTR lpDirectory,  // pointer to string that specifies default directory
    INT nShowCmd   // whether file is shown when opened
   );

所以我们可以改成

PUSH 5 //SW_SHOW
PUSH 0
PUSH 0
PUSH 440F3E  //文件地址
PUSH XXXXXX //"OPEN" 的地址
PUSH O
CALL ShellExecuteA
就可以了.
代码放到哪儿呢?,这么短的代码放在文件头0X300处就8错了.先别急着写,我们先找菜单调用的地方:
:bpx sendmessage(注意不是sendmessagea我就在这儿栽了个跟头)
:BD*
:G
出来了主界面,打开一个工程CTRL+M调出TRW,
:BE*
:G
点击一个菜单(HELP:)项断了下来,
:PMODLE
帮助对话框出来了,点击确定,回到了TRW我看了看没有CMP,JNZ等语句,按F12->F8
回到了上一个调用处,呵呵,终于找到地方了:
:0042EF62 55                      push ebp
:0042EF63 8BEC                    mov ebpesp
:0042EF65 81C400FFFFFF            add esp, FFFFFF00

* Possible Ref to Menu: MenuID_03E6, Item: "苞?(N)   Alt+Ctrl+N"
                                  |
:0042EF6B 3D419C0000              cmp eax, 00009C41 //是否是40001*****改成CALL 400300
:0042EF70 750D                    jne 0042EF7F      //不是就转到下边一段
:0042EF72 FF7508                  push [ebp+08]
:0042EF75 E88FAAFFFF              call 00429A09
:0042EF7A E932040000              jmp 0042F3B1      //转到返回

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042EF70(C)
|

* Possible Ref to Menu: MenuID_03E6, Item: "S"
                                  |
:0042EF7F 3D429C0000              cmp eax, 00009C42 //从上边一段跳过来的
:0042EF84 750C                    jne 0042EF92
:0042EF86 6A00                    push 00000000
:0042EF88 E838ECFEFF              call 0041DBC5
:0042EF8D E91F040000              jmp 0042F3B1

所以我们在400300处应该写上

:CMP EAX,9C77  //我定义的菜单ID是40055,16进制就是9C77
:JNE 0040032A  //
;PUSH 5 //SW_SHOW
;PUSH 0
;PUSH 0
;PUSH 440F3E  //文件地址
;PUSH 400390 //"OPEN" 的地址
;PUSH O
;CALL ShellExecuteA
:JMP 0042F3B1
0040032A:CMP EAX,9C41
:RET

把上边的那句3D419C0000  cmp eax, 00009C41
改成:CALL 00400300
然后吧400390改成"OPEN"
一切OK,
打开RADASM然后打开一工程(事先把ASM与INC文件的默认打开方式为EDITPLUS)
先双击一个文件(只有双击后地址才会出现),然后右键"用外部编辑器打开"
果然调用EDITPLUS就打开了