• 标 题:diype6 (9千字)
  • 作 者:pll621
  • 时 间:2002-8-30 16:03:02
  • 链 接:http://bbs.pediy.com

diype6-----打造super trw2000
何为super trw2000,就是superbpm+trw2000,说白了就是捆绑superbpm到trw2000内部,使trw2000自带superbpm功能(现在我的diype只讲述关键部分
、基础部分如怎么添加api,寻找消息处理等,前面的文章已经教给大家,我没有必要在罗嗦,自己也可以少打一些字)

一、分析篇:
superbpm有两个文件一个superbpm.vxd、一个superbpm.exe。superbpm.exe是一个外壳程序,真正工作的是superbpm.vxd。
那么superbpm是怎么驱动superbpm.vxd的,答案是使用DeviceIoControl的api
BOOL DeviceIoControl(

    HANDLE hDevice,    // handle to device of interest
    DWORD dwIoControlCode,    // control code of operation to perform
    LPVOID lpInBuffer,    // pointer to buffer to supply input data
    DWORD nInBufferSize,    // size of input buffer
    LPVOID lpOutBuffer,    // pointer to buffer to receive output data
    DWORD nOutBufferSize,    // size of output buffer
    LPDWORD lpBytesReturned,    // pointer to variable to receive output byte count
    LPOVERLAPPED lpOverlapped     // pointer to overlapped structure for asynchronous operation
  );
控制superbpm.vxd
需要两个参数dwIoControlCode和hDevice
  参数dwIoControlCode是控制号:得到方法creatfilea函数成功后返回值
  hDevice是控制句柄:一共有三个值1、2、3。1表示复原、2表示erase、3表示monitor
  其他参数都可以为0
 
知道了就简单了
二、资源构造篇:
1、trw面板上增加两个checkbox
    checkbox1        checkbox2
标题:    Erase            Monitor
Id:      621            622(10进制)
    26d            26e(16进制)
三、程序构造篇:
a.trw的dialog消息处理地方:
0041161A              /$ 817C24 08 1001>CMP [DWORD SS:ESP+8],110==》刘涛涛老大真是惜字节如金,传递参数连ebp都不用,直接使用堆栈比较
怪不得trw比softice小的多(偶像派人物),比较消息是否是初始化dialog消息
00411622              |. 75 2B          JNZ SHORT PLL.0041164F
00411624              |. FF7424 04      PUSH [DWORD SS:ESP+4]
00411628              |. E8 540D0000    CALL PLL.00412381==》在初始化窗口的时候我们需要得到checkbox的handle所以这里的加上自己处理的函数
0041162D              |. 50            PUSH EAX
0041162E              |. 68 589D4100    PUSH PLL.00419D58

找了半天竟然在code段没有找到足够可用的空间,都给涛涛老大用完了(对涛涛的佩服,尤如滔滔江水连绵不绝,好比黄河之水泛滥,一发......)
没有空间,自己加个结吧,我增加了一个结名为pll621大小10000字节(够大,想补什么就补什么)。看雪说的好,这样也便于代码维护,不要像补w32asm那样搞得我自己也快看不懂了:(
附:增加字节的地址
offset         rva            va            大小
24800        2b000        imagebase+2b000        10000

我的规划如下
data1    24800-253b8    大小3000byte    用于存放提示符号        类似table db "good day",0
data2    253b8-25b88    大小2000byte    用于变量            类似title dd    0
code    25b88-26f10    大小5000byte    用于code            类似start:
                                    push eax
b.分析需要的api
需要的api如下:
1.DeviceIoControl    :call dword ptr [0042E01F]
2.Enablewindow        :call dword ptr [004193E4]
3.CreateFileA        :call dword ptr [00419228]
4.GetDlgItem        :call dword ptr [0041936C]
5.MessageBoxA        :call dword ptr [0041942C]

观看原程序已有2/3/4这三个api,只有DeviceIoControl没有,打开peedit构造(我真是越来越懒了,连一个api都不想手动构造)
增加完以后,api调用地址如上
c.增加代码
更改原来消息处理为:
0041161A: 817C240810010000            cmp        d,[esp][08],000000110 ;"
00411622: 0F85D8AD0100                jne        .00042C400  ----- 不等跳到自己地方比较是否为111
00411628: E9E6AD0100                  jmp        .00042C413  -----跳到自己程序,目的是在窗口初始话的时候得到我们增加的两个checkbox的handle
0041162D: 50                          push        eax
0041162E: 68589D4100                  push        000419D58  ----- (3)
00411633: E84D370000                  call      .000414D85  ----- (4)
00411638: 59                          pop        ecx
00411639: 85C0                        test        eax,eax
0041163B: 59                          pop        ecx
0041163C: 740C                        je        .00041164A  ----- (5)


变量规划如下:
42b010        db "\\.\SuperBPM.VXD",0
42b030        db "Can`t open superbpm.vxd so you can`t use those function",0
42b070        db "Sorry",0
42bbb8        dd 0    :也就是253b8        *creatfilea得到的句柄
42bbbc        dd 0    :也就是253bc        *erase和monitor切换使用的标志,如果点击erase就禁止monitor,点击monitor禁止erase
42bbc0        dd 0    :也就是253c0        *erase hadle
42bbc4        dd 0                *Monitor hadle
42bbc8        db 0 dup(100)             *pointer to variable to receive output byte count



代码如下:
0042C400  817C24 08 11010000  CMP [DWORD SS:ESP+8],111
0042C408  -0F85 4152FEFF        JNZ PLL3.0041164F
0042C40E  E9 9D000000          JMP PLL3.0042C4B0
0042C413  6A 00                PUSH 0
0042C415  68 00000004          PUSH 4000000
0042C41A  6A 03                PUSH 3
0042C41C  6A 00                PUSH 0
0042C41E  6A 03                PUSH 3
0042C420  68 000000C0          PUSH C0000000
0042C425  68 10B04200          PUSH PLL3.0042B010                      ; ASCII "\\.\SuperBPM.VXD"
0042C42A  FF15 28924100        CALL [DWORD DS:<&KERNEL32.CreateFileA>]
0042C430  A3 B8BB4200          MOV [DWORD DS:42BBB8],EAX
0042C435  68 6D020000          PUSH 26D
0042C43A  FF7424 08            PUSH [DWORD SS:ESP+8]
0042C43E  FF15 6C934100        CALL [DWORD DS:<&USER32.GetDlgItem>]
0042C444  A3 C0BB4200          MOV [DWORD DS:42BBC0],EAX
0042C449  68 6E020000          PUSH 26E
0042C44E  FF7424 08            PUSH [DWORD SS:ESP+8]
0042C452  FF15 6C934100        CALL [DWORD DS:<&USER32.GetDlgItem>]
0042C458  A3 C4BB4200          MOV [DWORD DS:42BBC4],EAX
0042C45D  A1 B8BB4200          MOV EAX,[DWORD DS:42BBB8]
0042C462  83F8 FF              CMP EAX,-1
0042C465  75 34                JNZ SHORT PLL3.0042C49B
0042C467  90                  NOP
0042C468  90                  NOP
0042C469  90                  NOP
0042C46A  90                  NOP
0042C46B  6A 30                PUSH 30
0042C46D  68 70B04200          PUSH PLL3.0042B070                      ; ASCII "sorry"
0042C472  68 30B04200          PUSH PLL3.0042B030                      ; ASCII "Can`t open superbpm.vxd so you can`t use those function"
0042C477  6A 00                PUSH 0
0042C479  FF15 2C944100        CALL [DWORD DS:<&USER32.MessageBoxA>]    
0042C47F  6A 00                PUSH 0
0042C481  FF35 C0BB4200        PUSH [DWORD DS:42BBC0]
0042C487  FF15 E4934100        CALL [DWORD DS:<&USER32.EnableWindow>]
0042C48D  6A 00                PUSH 0
0042C48F  FF35 C4BB4200        PUSH [DWORD DS:42BBC4]
0042C495  FF15 E4934100        CALL [DWORD DS:<&USER32.EnableWindow>]        ;如果装载失败就diseanble两个按钮
0042C49B  FF7424 04            PUSH [DWORD SS:ESP+4]
0042C49F  E8 DD5EFEFF          CALL PLL3.00412381
0042C4A4  -E9 8451FEFF          JMP PLL3.0041162D
0042C4A9  90                  NOP
0042C4AA  90                  NOP
0042C4AB  90                  NOP
0042C4AC  90                  NOP
0042C4AD  90                  NOP
0042C4AE  90                  NOP
0042C4AF  90                  NOP
0042C4B0  817C24 0C 6D020000  CMP [DWORD SS:ESP+C],26D
0042C4B8  75 2D                JNZ SHORT PLL3.0042C4E7
0042C4BA  90                  NOP
0042C4BB  90                  NOP
0042C4BC  90                  NOP
0042C4BD  90                  NOP
0042C4BE  FF35 BCBB4200        PUSH [DWORD DS:42BBBC]
0042C4C4  FF35 C4BB4200        PUSH [DWORD DS:42BBC4]
0042C4CA  FF15 E4934100        CALL [DWORD DS:<&USER32.EnableWindow>]
0042C4D0  8335 BCBB4200 01    XOR [DWORD DS:42BBBC],1        ;这个变量是用来保证两个按钮一次只能点击到一个
0042C4D7  74 45                JE SHORT PLL3.0042C51E
0042C4D9  90                  NOP
0042C4DA  90                  NOP
0042C4DB  90                  NOP
0042C4DC  90                  NOP
0042C4DD  B8 02000000          MOV EAX,2
0042C4E2  E9 3C000000          JMP PLL3.0042C523
0042C4E7  817C24 0C 6E020000  CMP [DWORD SS:ESP+C],26E
0042C4EF  -0F85 5A51FEFF        JNZ PLL3.0041164F
0042C4F5  FF35 BCBB4200        PUSH [DWORD DS:42BBBC]
0042C4FB  FF35 C0BB4200        PUSH [DWORD DS:42BBC0]
0042C501  FF15 E4934100        CALL [DWORD DS:<&USER32.EnableWindow>]
0042C507  8335 BCBB4200 01    XOR [DWORD DS:42BBBC],1
0042C50E  74 0E                JE SHORT PLL3.0042C51E
0042C510  90                  NOP
0042C511  90                  NOP
0042C512  90                  NOP
0042C513  90                  NOP
0042C514  B8 03000000          MOV EAX,3
0042C519  E9 05000000          JMP PLL3.0042C523
0042C51E  B8 01000000          MOV EAX,1
0042C523  6A 00                PUSH 0
0042C525  68 C8BB4200          PUSH PLL3.0042BBC8
0042C52A  6A 00                PUSH 0
0042C52C  6A 00                PUSH 0
0042C52E  6A 00                PUSH 0
0042C530  6A 00                PUSH 0
0042C532  50                  PUSH EAX
0042C533  FF35 B8BB4200        PUSH [DWORD DS:42BBB8]
0042C539  FF15 1FE04200        CALL [DWORD DS:<&kernel32.DeviceIoContro>
0042C53F  -E9 0B51FEFF          JMP PLL3.0041164F

代码很简单,我就不说明了,看过我前面文章的朋友稍微动点脑子的就能看懂


                                        pll621
                                        
                                        
个人题外话:
我修改的这个trw是在娃娃[CCG]修改版(从年龄上来讲,他的确是娃娃)基础上修改的,毕竟trw是工作在ring0级,我增加的代码从ring3级上来讲怎么都不可能出问题,但是在ring0级我也不敢保证一定能正常工作,我只是给出了一个方案,大家知道应该去怎么改造一个pe而已,如果在各位的机器上不能运行我也爱莫能助,在我的机器上调试是没有什么问题,到现在为止,我给大家重新打造了98下的两把利剑trw和w32asm.希望大家能用好它,技术蒸蒸日上,希望不要是我一个人写这种技术文章,我都六六大顺了。多些人写,交流的才广泛,我一个人的知识是有限的.谢谢大家捧场