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.希望大家能用好它,技术蒸蒸日上,希望不要是我一个人写这种技术文章,我都六六大顺了。多些人写,交流的才广泛,我一个人的知识是有限的.谢谢大家捧场
- 标 题:diype6 (9千字)
- 作 者:pll621
- 时 间:2002-8-30 16:03:02
- 链 接:http://bbs.pediy.com