| 如何让crackcode变得具有粘贴功能 |
| 责任编辑:admin 更新日期:2005-8-6 |
|
|
前言:
整个过程当成一个project(项目),真的可以过把瘾哦!:)
1、如何让crackcode变得具有粘贴功能的经过
当初豆豆虾修改成突破25位后,无意中看到一个贴,说到crackcode不具有粘贴功能,使用起来特不方便的。豆豆虾想,嘿!还真的是挺实用的一个功能。开始琢磨如何修改代码。这其中的过程,从琢磨、修改、调试自至成功。
2、编写具有粘贴功能的程序
需要加入粘贴功能,必须得知道如何编写具有粘贴功能的程序,以及实现的原理。
豆豆虾说“简单,在internet上,随时随地都能找到你需要的东西”,于是找到了如下的程序:
how to place text on the clipboard
cstring source;
//put your text in source
if(openclipboard())
{
hglobal clipbuffer;
char * buffer;
emptyclipboard();
clipbuffer = globalalloc(gmem_ddeshare, source.getlength()+1);
buffer = (char*)globallock(clipbuffer);
strcpy(buffer, lpcstr(source));
globalunlock(clipbuffer);
setclipboarddata(cf_text,clipbuffer);
closeclipboard();
}
how to get text off of the clipboard
this is easy really but here it is for completeness
char * buffer;
if(openclipboard())
{
buffer = (char*)getclipboarddata(cf_text);
//do something with buffer here
//before it goes out of scope
}
closeclipboard();
对以上的代码作了小小的调整。如何使用这段代码?在vc中自动生成一个基于于对话框程序,双击ok按钮,把以下程序粘贴过去,这样大功告成。运行程序,点击ok键,这样在剪贴板中的内容就是“test for clipbroad!!”
void CClipbroadDlg::OnOK()
{
// TODO: Add extra validation here
CString source("test for clipbroad!!!"); //初始化source
//put your text in source
if(OpenClipboard()) //打开剪贴板
{
HGLOBAL clipbuffer;
char * buffer;
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
//分配一段dde内存
EmptyClipboard(); //清空剪贴板
buffer = (char*)GlobalLock(clipbuffer); //锁定申请到的内存
strcpy(buffer, LPCSTR(source)); //复制字符串到内存
GlobalUnlock(clipbuffer); //解锁内存
SetClipboardData(CF_TEXT,clipbuffer); //设定剪贴板的内容
CloseClipboard(); } //关闭剪贴板
}
3、转换vc程序为汇编程序。
为什么要这样呢??原因有两点:
一、对于CF_TEXT之类的宏,不知道到底是代表什么值
二、汇编程序反编译可以非常简单的照搬到程序中。
我把iczelion的第一个masm的ok演示程序修改成如下:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
MsgCaption db "Iczelion's tutorial no.2",0
MsgBoxText db "Win32 Assembly is Great!",0
.data?
hMemory HANDLE ?
pMemory DWORD ?
.code
start:
invoke OpenClipboard,NULL ;打开剪贴板
test eax,eax
je endpro
mov edi,offset MsgCaption ; 取得标题,把它当成剪贴板中的内容
or ecx,0FFFFFFFFh
xor eax,eax
repnz scasb
not ecx ;得到标题长度
sub edi,ecx
push ecx
push edi ;这两个push也许不需要。没有时间去尝试
inc ecx
invoke GlobalAlloc,GMEM_DDESHARE,ecx ;锁定申请到的内存
mov hMemory,eax
invoke EmptyClipboard ;/清空剪贴板
invoke GlobalLock,hMemory ;锁定申请到的内存
mov pMemory,eax
pop esi
pop ecx
mov edi,eax
rep movs byte ptr [edi],byte ptr [esi] ;/复制字符串到内存
invoke GlobalUnlock,pMemory ;解锁内存
invoke SetClipboardData,CF_TEXT,pMemory; ;设定剪贴板的内容
invoke CloseClipboard ;关闭剪贴板
endpro:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
4、再看看反编译的结果:(其中一个目的是想得到需要宏的数值,其实也有简单
的方法,就是查询windows.h)
//******************** Program Entry Point ********
:00401000 6A00 push 00000000
* Reference To: USER32.OpenClipboard, Ord:01D0h
|
:00401002 E88B000000 Call 00401092
:00401007 85C0 test eax, eax
:00401009 745B je 00401066
* Possible StringData Ref from Data Obj ->"Iczelion's tutorial no.2"
|
:0040100B BF00304000 mov edi, 00403000
:00401010 83C9FF or ecx, FFFFFFFF
:00401013 33C0 xor eax, eax
:00401015 F2 repnz
:00401016 AE scasb
:00401017 F7D1 not ecx
:00401019 2BF9 sub edi, ecx
:0040101B 51 push ecx
:0040101C 57 push edi
:0040101D 41 inc ecx
:0040101E 51 push ecx
:0040101F 6800200000 push 00002000 //,GMEM_DDESHARE
* Reference To: KERNEL32.GlobalAlloc, Ord:0168h
|
:00401024 E87B000000 Call 004010A4
:00401029 A334304000 mov dword ptr [00403034], eax
* Reference To: USER32.EmptyClipboard, Ord:00B3h
|
:0040102E E853000000 Call 00401086
:00401033 FF3534304000 push dword ptr [00403034]
* Reference To: KERNEL32.GlobalLock, Ord:0173h
|
:00401039 E86C000000 Call 004010AA
:0040103E A338304000 mov dword ptr [00403038], eax
:00401043 5E pop esi
:00401044 59 pop ecx
:00401045 8BF8 mov edi, eax
:00[1] [2] [3] [4] 下一页 |
|
| 上一篇文章: 象棋桥2.1 |
| 下一篇文章: 如何突破crackcode的25位限制 |
|
|
|
|