今天给winamp设置了打开时候自动变透明,这里简单写一下过程。
献给天下所有菜鸟
1.先用vc自己实现一段让窗口变透明的代码,最好不要牵扯这段代码之外的变量(能搞清
楚这些咚咚的人除外。。),(代码网上很多,也可以见后面附一)
2.然后反汇编这段代码
3.把代码里api调用指针都改成目标程序里的指针(我的目标是winamp,里面常见的api都
用到了,大大的方便了我)
4.把字符串写到一个空闲的位置,也修改一下汇编代码里的便宜量(如果不知道怎么计算
,可以用ollydbg的汇编功能,我就是这么干的)
5.找个程序肯定执行到的位置(注意不要处于某个循环内,否则。。),jmp到我们的代码
6.整理一下这段代码,即前后pushad,popad一下,保护现场,安全第一,然后popad后再
加上jmp覆盖的指令,再之后就jmp回去好了
7.修改,存盘。回头看看,也没啥技术可言,就是拷了一段代码。。
附一:透明代码(省略了空指针检查什么的,所以在win9x里会直接非法操作)
//------------------------------------------------------------------------
HWND pthis;
pthis=::FindWindow(NULL,"窗口名称");// 我要改的是"Winamp 5.0rc666"
SetWindowLong(pthis,GWL_EXSTYLE,GetWindowLong(pthis,GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
fun(pthis,0,128,2);// 128/255=透明度
FreeLibrary(hInst);
附二:添加跳转
//------------------------------------------------------------------------
我们在这里添加跳转(说句实话加在这里是不对的,如果没有plugin目录,是不会执行到这
个位置,懒的改了)
00426890 83C4 04 ADD ESP,4
00426893 5F POP EDI
00426894 5E POP ESI
00426895 5D POP EBP
00426896 5B POP EBX
00426897 81C4 4C020000 ADD ESP,24C
更改以后成为这样
00426890 E9 F09D0200 JMP 00450685
00426895 5D POP EBP
00426896 5B POP EBX
00426897 81C4 4C020000 ADD ESP,24C
附三:整理要添加的代码(vc反汇编结果)
//------------------------------------------------------------------------
注意加号开头的地方,指针或偏移量是要改的,不会计算的话就找ollydbg : )
此处添加 60 pushad
HWND pthis;
pthis=::FindWindow(NULL,"wintrans");
+00401132 68 98244000 push offset string "wintrans" (402498h)
00401137 6A 00 push 0
+00401139 FF15 B4224000 call dword ptr [__imp__FindWindowA@8]
0040113F 8B F0 mov esi,eax
SetWindowLong(pthis,GWL_EXSTYLE,GetWindowLong(pthis,GWL_EXSTYLE)^0x80000);
00401141 6A EC push 0FFFFFFECh
00401143 56 push esi
+00401144 FF15 C0224000 call dword ptr [__imp__GetWindowLongA@8]
0040114A 35 00000800 xor eax,80000h
0040114F 50 push eax
00401150 6A EC push 0FFFFFFECh
00401152 56 push esi
+00401153 FF15 C4224000 call dword ptr [__imp__SetWindowLongA@12]
HINSTANCE hInst = LoadLibrary("User32.DLL");
+00401159 68 8C244000 push offset string "User32.DLL" (40248Ch)
+0040115E FF15 14204000 call dword ptr [__imp__LoadLibraryA@4]
00401164 8B F8 mov edi,eax
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
+00401166 68 70244000 push offset string "SetLayeredWindowAttributes"
0040116B 57 push edi
+0040116C FF15 10204000 call dword ptr [__imp__GetProcAddress@8]
fun(pthis,0,128,2);
00401172 6A 02 push 2
00401174 68 80000000 push 80h
00401179 6A 00 push 0
0040117B 56 push esi
0040117C FF D0 call eax
FreeLibrary(hInst);
0040117E 57 push edi
+0040117F FF15 0C204000 call dword ptr [__imp__FreeLibrary@4]
00401185 5F pop edi
00401186 5E pop esi
此处添加 61 popad
补充我们添加jmp时覆盖的指令
83C4 04 ADD ESP,4
5F POP EDI
5E POP ESI
然后jmp回去
+ E9 AB61FDFF JMP 00426895