BitBlt这个位置有人英语函数有人用过么

用API函数BitBlt实现百叶窗特效--《电脑学习》2011年01期
用API函数BitBlt实现百叶窗特效
【摘要】:本文介绍了在Visual Basic中如何调用API函数,以及用API函数中的BitBlt函数实现图片以百叶窗出现效果的过程。
【作者单位】:
【关键词】:
【分类号】:TP311.11【正文快照】:
1 API函数概述及API的调用1.1 API函数概述API(Application Programming Interface)是应用程序编程接口的简称,是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数集合,这些函数经过严格测试,供开发人员编程时
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【参考文献】
中国期刊全文数据库
韩丽苹;杨晶;;[J];包头职业技术学院学报;2009年01期
杜玲玲;[J];计算机与现代化;2005年02期
刘瑞玲;徐瑾;苟浩锋;;[J];内江科技;2008年05期
赵文东,王素珍,赵杰;[J];现代电子技术;2002年04期
袁亚丽;;[J];河北北方学院学报(自然科学版);2007年05期
【共引文献】
中国期刊全文数据库
赵文东;;[J];电脑学习;2009年06期
马骏驰;;[J];电子科技;2009年04期
刘胜达;舒杰;;[J];哈尔滨理工大学学报;2009年05期
陈源;;[J];计算机与现代化;2008年04期
朱克武;;[J];计算机与现代化;2011年04期
倾明;;[J];兰州石化职业技术学院学报;2007年02期
岳彬彬;李向阳;;[J];计算机工程与科学;2012年05期
蹇小平;吴意琴;张卫钢;;[J];现代电子技术;2009年19期
胡世锋;汪志敏;;[J];河北北方学院学报(自然科学版);2008年06期
叶喜民;余超;;[J];河北北方学院学报(自然科学版);2010年04期
中国硕士学位论文全文数据库
张美芸;[D];江西理工大学;2007年
王碧涛;[D];武汉理工大学;2008年
彭宏道;[D];中南大学;2010年
黄姝;[D];云南大学;2010年
陈诗伟;[D];西南交通大学;2011年
童惠康;[D];华东理工大学;2012年
【相似文献】
中国期刊全文数据库
宋新康;庞军平;;[J];信息与电脑(理论版);2011年06期
张辉;王志;鲍曼雨;闫洪峰;陈文科;;[J];机床与液压;2011年14期
宋晓波;;[J];微型电脑应用;2011年05期
李国贞;于会智;;[J];软件导刊;2011年06期
;[J];;年期
;[J];;年期
;[J];;年期
;[J];;年期
;[J];;年期
;[J];;年期
中国重要会议论文全文数据库
胡敏;查珍;;[A];全国第十四届计算机科学及其在仪器仪表中的应用学术交流会论文集[C];2001年
王丽纳;陈皓;赵力;邹采荣;;[A];江苏省通信学会2004年学术年会论文集[C];2004年
郑书河;郑书富;何聪惠;;[A];福建省科协第五届学术年会数字化制造及其它先进制造技术专题学术年会论文集[C];2005年
龚乃弘;;[A];江西省气象部门第二届高级工程师技术述职报告会论文集[C];2005年
毛宏宇;黎琼炜;王文良;杨光;;[A];第八届全国设备与维修工程学术会议、第十三届全国设备监测与诊断学术会议论文集[C];2008年
陶建峰;朱野;王旭永;;[A];中国航空学会控制与应用第十二届学术年会论文集[C];2006年
姜德胜;成叶红;孙秀霞;;[A];第六届全国计算机应用联合学术会议论文集[C];2002年
张红健;周春临;;[A];《制造业自动化与网络化制造》学术交流会论文集[C];2004年
周旭艳;萧斌;;[A];第七届工业仪表与自动化学术会议论文集[C];2006年
黄汛;高启孝;周山;;[A];2004年船舶仪器仪表学术年会论文集[C];2004年
中国重要报纸全文数据库
梁海锋;[N];中国电脑教育报;2001年
天兰兴;[N];电脑报;2001年
林志航;[N];电脑报;2001年
陈跃氢;[N];电脑报;2001年
;[N];电脑报;2004年
;[N];电脑报;2004年
王鑫;[N];电脑报;2003年
刘学农;[N];电脑报;2001年
王萍霞;[N];电脑报;2002年
周鸣扬;[N];中国电脑教育报;2001年
中国硕士学位论文全文数据库
李婧;[D];南京师范大学;2005年
卢立殊;[D];武汉理工大学;2003年
胡大辉;[D];电子科技大学;2006年
黄树;[D];苏州大学;2007年
胡静;[D];华东师范大学;2008年
史艳华;[D];东华大学;2005年
周铭华;[D];西华大学;2008年
华适;[D];贵州大学;2008年
孙前明;[D];江苏大学;2002年
张英杰;[D];国防科学技术大学;2009年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1502)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'VC:频繁调用GDI的BitBlt函数,导致光标闪烁、电脑卡顿(CAPTUREBLT)',
blogAbstract:'VC:频繁调用GDI的BitBlt函数,导致光标闪烁、电脑卡顿(CAPTUREBLT)\r\n&\r\n频繁调用BitBlt函数时,最后一个参数加上了CAPTUREBLT特性,光标闪烁频繁,操作系统是win7 x64。根据MSDN的解释:\r\nWindows 98/Me, Windows 2000/XP: Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. Note that this generally cannot be used for printing device contexts.',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}最受欢迎模板:
讨论帖:对蜘蛛纸牌进行反编辑 程序搞定了的辅助工具
讨论帖:对蜘蛛纸牌进行反编辑 程序搞定了的辅助工具
发表日期: 03:10:01
分享给朋友:
论坛用户太子回帖:记得曾看到过有人把扫雷改成秒破版的,当时下载下来,挺有意思,想着自己有时间也改个玩玩。于是动手改了,本文章是由多多印刷网小编编辑整理。
讨论帖:对蜘蛛纸牌进行反编辑 程序搞定了的辅助工具论坛发帖人:"太子"论坛用户"太子"回帖:记得曾看到过有人把扫雷改成秒破版的,当时下载下来,挺有意思,想着自己有时间也改个玩玩。于是动手改了这个蜘蛛纸牌的游戏
在反编译游戏之前,我先玩了几局,感觉上不是很有意思 :&
首先OD载入,打开后,来看看它调用的API函数吧,有很多,其中BitBlt比较明显,我们首先从它入手吧。可能有人会问为什么要首先在这个函数上设断,玩了这个游戏后你会发现它有很多位图的移动过程,所以免不了要复制图片从一点到另一点,所以我觉得这个函数比较重要,如果这里实在没什么收获,可以再选择嘛,呵呵。
BP BitBlt后
F9运行程序来看看
eax, dword ptr [esi+C]0100279C
eax, dword ptr [esi+4]0100279F
dword ptr [ebp-18], edx
edx, dword ptr [ebp+10]
dword ptr [ebp+18], edx010027破解
0F8D BF000000 jge
edx, dword ptr [ebp+14]
ebx, dword ptr [ebp+18]
ebx, dword ptr [edx+C]
0F8D B0000000 |jge
edx, dword ptr [ebp-14]
ebx, dword ptr [ebp+10]
dword ptr [ebp+18], edx010027CA
short 0027CC
edx, dword ptr [ebp-14]010027CF
dword ptr [ebp-8], edx
dword ptr [ebp-10], eax010027DA
short 0027DC
edx, dword ptr [ebp-18]010027DF
dword ptr [ebp-10],
eax, dword ptr [ebp+10]
dword ptr [ebp-8], edx010027EB
dword ptr [ebp+18], eax010027EE
short 0027F0
C745 F8 40000&|mov
dword ptr [ebp-8],
ebx, dword ptr [ebp+C]010027FA
short 27FC
eax, dword ptr [ebp+14]010027FF
ebx, dword ptr [eax+8]
short 02804
edx, dword ptr [ebp+C]
eax, dword ptr [edi+edx]0100280A
ebx, eax0100280C
short 280E
dword ptr [ebp-4], edi
short 02818
eax, dword ptr [ebp-1C]0100281B
ecx, eax0100281D
ecx, edx0100281F
dword ptr [ebp-4], eax
short 02826
C745 FC 3F000&||mov
dword ptr [ebp-4], 3F0100282D
eax, eax0100282F
68 2000CC00
/ROP = SRCCOPY
dword ptr [ebp-10] |YSrc
dword ptr [ebp-C] |hSrcDC0100283B
dword ptr [ebp-8] |Height0100283E
dword ptr [ebp-4] |Width
dword ptr [ebp+18] |YDest
dword ptr [ebp+8] |hDestDC
FF15 7C100001 ||call
dword ptr [&&GDI32.BitBlt&] \BitBlt0100284E
ecx, dword ptr [esi+8]
ebx, dword ptr [ebp-4]
ecx, dword ptr [esi]
short 00285A
eax, dword ptr [ebp-8]0100285D
dword ptr [ebp+18], eax
eax, dword ptr [esi+C]
eax, dword ptr [esi+4]
dword ptr [ebp+18], eax
|.^ 0F8C 41FFFFFF \jl
首先是在这里被断下了,我们先来看看这个函数体,有没有什么信息,往上瞧瞧0100271F
dword ptr [ebp+8] /hDC
/&CreateCompatibleDC&0100272B
68 BC120001
010012BC /RsrcName = &FELT&
dword ptr [1012000] |hInst = 2736
dword ptr [ebp-C], |
dword ptr [&&USER32.LoadBitmapW&&; 0100273F
dword ptr [ebp-C] |hDC
dword ptr [ebp-24], |
dword ptr [&&GDI32.SelectObject&&; 0100274C
esi, dword ptr [ebp+18]0100274F
ebx, dword ptr [esi]
ecx, dword ptr [ebp+14]
恩,有了新的发现,有个LoadBitmap函数,这是加载位图的函数,加载的位图名称已经显示出来了,就是那个&FELT&,用RESHACKER打开程序看看,在位图资源处应该会看到这个名为&FELT&的图片,只是用我的RESHACKER没有打开,换eXeScope试试,可以看到这个图片就是程序的背景图片,还有52张扑克图片,扑克的点数图片咱就不说了,&CARDBACK&是蜘蛛的扑克背景图片,标识号106的是关于对话框的图片,标识号108的是放置扑克的图片,这里只要一一对照知道是哪些相互对应就可以了。
可以看到&FELT&应该是程序的背景图片,这里可以大胆猜猜测一下,程序中当前循环的目的就是画出程序的背景,这里可以先放一下,把这里BitBlt的断点先取消,接着F9往下看看
dword ptr [ebp-4], eax010028破解
eax, dword ptr [ebp+14]010028AD
esi, dword ptr [ebp+8]
dword ptr [ebp-30], esi
//[ebp-30]=esi
short //如果EAX&[ebp-30]或EAX&0x34(也就是52)跳到10028D7//如果上述不满足向下走010028BF
eax, dword ptr [ebp-2C] |
68 DC120001
010012DC |Format = &CARD%d&
dword ptr [&&USER32.wsprintfW&] \wsprintfW//以Format函数格式输出,这里可以应该是 输出“CARD1”~“CARD52”010028CF
eax, dword ptr [ebp-2C]
short //上面不符合条件的跳转到这里
short 0028DC
68 BC120001
UNICODE &FELT&
short 0028E3
short 0028E8
68 C8120001
UNICODE &CARDBACK&//可以看到会压入堆栈1个值,这里可以看到FELT 或 CARDBACK 其中之一//从上面对于图片的分析知道,这是2幅图片的值//如果不是这2幅图片则向下跳转到8ED
short 0028EF
//把刚才得到的CARD? 或 FELT 或 CARDBACK压入堆栈
dword ptr [1012000] |hInst = 28F9
dword ptr [&&USER32.LoadBitmapW&&; //用LoadBitmap来读取EAX中指定的图片010028FF
dword ptr [ebp-34], |
dword ptr [&&GDI32.CreateCompati&;
dword ptr [ebp-34] /hObject0100290C
edi, dword ptr [&&GDI32.SelectOb&; |
| SelectObject
ebx, dword ptr [ebp+C]0100291A
68 2000CC00
0CC0020 /ROP = SRCCOPY0100291F
|Height = 60 (96.)
|Width = 47 (71.)
dword ptr [ebp+10] |YDest0100292B
dword ptr [ebp-38], |0100292E
|XDest0100292F
dword ptr [ebp-30] |hDestDC
FF15 7C100001 call
dword ptr [&&GDI32.BitBlt&]; |//拷贝指定的图片到某个位置
恩,分析这么多差不多了,把这里的断点取消,F9再往下看,我们会发现程序已经出现窗口了,出现了可以供选择难易程度的对话框,我们先选择 &初级&,然后点击&确定&看看我们会发现程序又被断下了,由于下面的程序段比较长,我省略一部分01005CEA
esi, dword ptr [&&GDI32.CreateCo&;
/hDC01005CF1
call \CreateCompatibleDC01005CF3
/hDC01005CF4
dword ptr [ebp-58], |01005CF7
call \CreateCompatibleDC01005CF9
68 C8120001
/RsrcName = &CARDBACK&//这里是CARDBACK后面有LoadBitmap函数,应该就是装载CARDBACK图片的01005CFE
dword ptr [1012000] |hInst = 5D04
dword ptr [ebp-48], |01005D07
dword ptr [&&USER32.LoadBitmapW&&; 01005D0D
/hObject01005D0E
dword ptr [ebp-48] |hDC01005D11
dword ptr [ebp-6C], |01005D14
dword ptr [&&GDI32.SelectObject&&; \.........................................................01005F0E
|& \8B45 C8
eax, dword ptr [ebp-38]//EAX=[EBP-38]01005F11
short 01005F3F//EAX与0x68比较,还记得0x68和0x69吗?//呵呵 就是那2幅图片啊,如果忘记了,看看我们前面分析的那个函数段吧//如果不是CARDBACK图片就向下到05F16
dword ptr [ebp-60], ecx01005F19
68 2000CC00
ecx01005F1F
ecx01005F20
dword ptr [ebp-48]//[ebp-60]不为0,就PUSH
short 05F25
|Width = 47 (71.)01005F29
dword ptr [ebp-34] |YDest01005F2C
dword ptr [ebp-30] |XDest01005F2F
ebx |hDestDC01005F30
FF15 7C100001 ||call
dword ptr [&&GDI32.BitBlt&] ; \BitBlt//分析知道程序根据[EBP-60]和ECX的数值进行比较,从而确定绘制的图高0x60或者是9//这里我们可以理解成绘制一幅位图或者是绘制一幅图的一部分01005F36
01005FBF01005F3B
short 01005F27//上面知道,如果不是CARDBACK图片就到这里了,再接着分析01005F3F
short 5F44
short 01005F61//EAX如果小于1,或大于52,就跳到1005F61//EAX如果是 1~52 时,这个值也是可以查到(eXeScope)01005F49
/&%d&01005F4A
eax, dword ptr [ebp-2C] |01005F4D
68 DC120001
010012DC |Format = &CARD%d&01005F52
|s01005F53
dword ptr [&&USER32.wsprintfW&&; \wsprintfW//如果EAX属于1~52 之间就输入 CARD1~CARD52,和刚才分析过的程序段一样吧01005F59
esp, 0C01005F5C
eax, dword ptr [ebp-2C]01005F5F
short 5F61
short 05F66
68 BC120001
UNICODE &FELT&//这里是EAX 和 0x69的比较,就是是否画出图FELT01005F6B
short 5F6D
eax, ax01005F70
eax01005F71
dword ptr [1012000] ; |hInst = 5F77
dword ptr [&&USER32.LoadBitmap&; 01005F7D
/hObject01005F7E
dword ptr [ebp-58] |hDC01005F81
dword ptr [ebp-5C], |01005F84
dword ptr [&&GDI32.SelectObjec&; \01005F8A
68 2000CC00
0CC0020 /ROP = SRCCOPY01005F8F
dword ptr [ebp-58] |hSrcDC01005F96
dword ptr [ebp-70], |01005F99
|Height = 60 (96.)01005F9B
|Width = 47 (71.)01005F9D
dword ptr [ebp-34] |YDest01005FA0
dword ptr [ebp-30] |XDest01005FA3
|hDestDC01005FA4
FF15 7C100001 ||call
dword ptr [&&GDI32.BitBlt&] \BitBlt
根据这里的BitBlt中Height和Width 2个值我们可以分析出每张扑克牌的高度是0x60,宽度是0x47,这里我们可以截取一幅扑克图片的大小来比较一下,可以知道这个数值确实是单张扑克的尺寸,这里我们就可以猜测一下了,函数的功能就是绘制左边这幅图。这里我们再次取消BitBlt的断点后,F9运行,可以发现程序已经运行,没有再被断下来了。
呵呵,好了,初步分析可以告一段落了,这里我们首先来分析一下,最初的那个疑问,首个BitBlt是否是用来画出背景的呢?这里可以用个简单的方法,根据我们刚才的分析知道push
&FELT&push
&CARDBACK&
这里我们可以把&FELT&替换成&CARDBACK&试一下,恩,效果是很明显的。这样刚才的分析应该大体都成立,因为都用到了LoadBitmap来加载图片,而且我们可以分析具体显示的是哪幅位图,思路应该没什么问题。  下面我们再来具体的分析一下,刚才所遇到的每个被断下位置处的函数体的作用。看能不能更快找到关键地方呢(下面我所说的函数体一词,指的是包含BitBlt函数的那个整体函数,即PUSH EBP, MOV EBP, ESP下的所有部分)。
首先分析第一个函数,从具体功能来说,我们分析出它会绘制出程序的背景,试想一下,它和后面我们遇到的函数比较而言,其中不太可能有产生扑克点数函数,恩,可以先放一下。再来分析一下遇到的第二个函数,可以看到wsprintfw函数将输出CARD1~CARD52间的某个值,也就是对应扑克牌中的具有具体花色和具体点数的牌,这可以从上面分析中得知(好像挺啰嗦:)这里我们试想一下,程序的工作流程应该是先初始化产生一组随机数,然后通过随机数来计算从而得到要输出的扑克,然后来才会在画面上绘制出具体的扑克。有了这个思想,我们来看一下wsprintfw函数距离函数体开始处的位置,可以发现距离是很近的,可以断定这里不可能有初始化的函数,只可能是初始化好后,程序运行到这里把位图拷贝到桌面才对。
好的,我们再来看一下第三个函数吧,根据我们刚才的思路,这第三个参数是最有可能的,我们就先把注意力集中到这里吧。
我们先在地址01005FA4 这里的BitBlt下断点,其他的断点都先删除,经过跟踪,我们发现一直都是在一个循环体内跑,而且只要想点开程序窗体,马上又被断下来了,仔细想想,BitBlt这个函数肯定是不断的被用来重画画面的,如果一直这样循环怎么行呢,恩,我们再想想有没有什么其他的方法呢?恩,有的,就是wsprintfw函数,可以想到只有当显示扑克点数的时候它才会运行到这里,所以这里应该不会总是处在循环状态,我们来测试一下,就在wsprintfw函数下断点,其他的断点删除,下面是堆栈显示的图片。
很明显这张应该是CARD44,应该是 黑桃5。然后我们F8单步来走,当函数跳回到开始处时,发现了一个特别的CALL,经验证这是个关键CALL01005DEE
dword ptr [ebp-44], eax01005DF1
cl01005DF4
dword ptr [ebp-60], ecx01005DF7
ecx, dword ptr [ebp-3C]01005DFA
E8 17CFFFFF
关键CALL01005DFF
dword ptr [ebp-38], eax//那我们F7跟进,看看01002D16
GDI32.SetPixel01002D18
ebp01002D19
ebp, esp01002D1B
837D 0C FF
dword ptr [ebp+C], -F
esi01002D20
esi, ecx01002D22
short 2D24
6C01002D26
eax01002D27
short 02D29
ecx, dword ptr [esi+8]
//关键地址01002D2C
edi01002D2D
dword ptr [ebp+C]
//扑克的行数01002D30
dword ptr [ebp+8]
//扑克的列数01002D33
//关键函数
ecx, dword ptr [esi+4]01002D3B
//edi=eax01002D3D
edi01002D3E
E8 DB460000
eax, eax01002D45
short 01002D67
//关键跳转//这里如果NOP掉,程序上端的扑克都将正面向上01002D47
esi, dword ptr [esi+4]01002D4A
ebx01002D4B
edi01002D4C
ecx, esi01002D4E
E8 E6460000
//关键函数
ebx, eax01002D55
edi01002D56
ebx, ebx, 0D01002D59
ecx, esi01002D5B
E8 F3460000
//关键函数
eax, dword ptr [ebx+eax+1]01002D64
ebx01002D65
short 02D67
eax01002D6A
edi01002D6B
esi01002D6C
ebp01002D6D
下面我们具体分析每个关键的作用
01002D45地址处的跳转控制这程序上端的扑克是否处于正面显示状态,如果NOP掉,可以看到那些图片都正面向上了
最初在这里我自己改写了一下,把间距拉大了一些,好看了一些,见下图后来分析出计算扑克点数的地址后,就没再用这种方法了,后面的方法更好用,呵呵[ESP+C]表示显示扑克的行数[ESP+8]表示显示扑克的列数
接下来看一下 关键函数1吧 F7跟进01007ECF
GDI32.SetPixel01007ED1
ebp01007ED2
ebp, esp01007ED4
eax, dword ptr [ebp+8]
①//EAX=[EBP+8]是扑克的列数01007ED7
ecx, dword ptr [ecx+eax*4]
②//这里需要用到上个函数的关键地址了,这里指向另一个地址//这里可以看成是一个数组在取其中的某个值01007EDA
ecx, ecx01007EDC
short 01007EEE01007EDE
dword ptr [ebp+C]//扑克的行数为内循环的次数01007EE1
E8 0CFFFFFF
eax, eax01007EE8
short 01007EEE01007EEA
eax, dword ptr [eax]
③01007EEC
short 0EEE
eax, FFFFFFFF01007EF1
ebp01007EF2
8在地址01007EE1
还有个CALL 跟进01007DF2
GDI32.SetPixel01007DF4
ebp01007DF5
ebp, esp01007DF7
eax, dword ptr [ecx]
④01007DF9
edx, edx01007DFB
dword ptr [ebp+8], edx01007DFE
short 07E00
eax, eax01007E02
short 07E04
eax, dword ptr [eax+8]
⑤01007E07
edx01007E08
edx, dword ptr [ebp+8]
//注意这里是循环体01007E0B
short 7E0D
ebp01007E0E
这里我们把几个关键的语句拿下来组在一起看吧01007ED4
eax, dword ptr [ebp+8]
①//EAX=扑克的列数01007ED7
ecx, dword ptr [ecx+eax*4]
②//ECX=[ECX+EAX*4]的偏移地址01007DF7
eax, dword ptr [ecx]
④//EAX=[ECX]的偏移地址01007E04
eax, dword ptr [eax+8]
⑤//EAX=EAX+801007EEA
eax, dword ptr [eax]
③//EAX=[EAX]的偏移地址
//别搞混了⑤ ③ 可不是连续的!
这个关系很明确了吧,这就是这2个CALL的具体作用
分析完 关键函数1 在往下看,不就是EDI=EAX了吗,这里先保存这个EDI的数值
再来F7进入 关键函数2 吧
edi, edi0100743B
ebp0100743C
ebp, esp0100743E
eax, dword ptr [ebp+8]
ecx, dword ptr [ecx+C]
eax, dword ptr [eax+eax*2]
eax, dword ptr [ecx+eax*4]0100744A
ebp0100744B
可以看到主要的就4句,意思和上面刚分析的差不多,这里主要是得到EAX的数值出了关键函数2后,会发现EBX=EAX, EBX=EBX*0xD,保存EBX,下面会用到的。接着进入关键函数
eax, dword ptr [ebp+8]0100745B
ecx, dword ptr [ecx+C]0100745E
eax, dword ptr [eax+eax*2]
eax, dword ptr [ecx+eax*4+4]
这里的主要也是4句,分析同上即可,最后得到EAX的数值,退出关键函数3后,01002D60
eax, dword ptr [ebx+eax+1]//EAX=EBX+EAX+1
这里看一下EAX的10进制数值,呵呵,是不是感觉很熟悉,恩,这就是扑克显示的点数,和资源里设置的是一样的,可以从wsprintfw函数中观察到。  至此,分析的应该差不多了,写个测试程序应该很简单的,于是我就写了一个测试,很奇怪的是OD调试纸牌程序的时候,测试程序好用,一旦,单独打开纸牌程序,测试程序就不好用了?恩,奇怪啊,后来发现是01002D29
ecx, dword ptr [esi+8]
//关键地址
这一句的问题,我取的ecx地址是动态改变的,而[esi+8]=[]是程序的固定地址,在我电脑上显示的是1012010这个数值,应该是全局变量,呵呵,改好地址后,测试程序成功了。这里贴一下我用VB 写的测试程序吧。Dim AppHandle As Long
Dim ProcessID As Long
Dim proHandle As Long
Dim ReadData(10) As Long
'读取内存数据的数组
Dim lAddress As Long
'暂存地址Dim ESI4 As Long
'[ESI+4]Dim ESI8 As Long
'[ESI+8]Dim ESIC As Long
'[ESI+C]Dim n As Integer
'行数变量Dim i As Integer
'列数变量Dim m As Integer
'临时变量Dim I2 As Integer
'临时变量Dim J As Integer
'临时变量Dim B(109) As Long
'计算每张扑克用到的变量的地址
List1.Clear
AppHandle = FindWindow(vbNullString, &蜘蛛&)
If AppHandle = 0 Then
Form1.Caption = &游戏辅助--游戏没有启动&
Form1.Caption = &游戏辅助--连接游戏成功&
GetWindowThreadProcessId WndHandle, ProcessID
If ProcessID = 0 Then
MsgBox &获取程序PID错误&
proHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
'获取进程句柄
ReadProcessMemory proHandle, ByVal &H101200C, ReadData(0), 4, 0&ESI4 = ReadData(0)
ReadProcessMemory proHandle, ByVal &H1012010, ReadData(0), 4, 0&
ESI8 = ReadData(0)
ReadProcessMemory proHandle, ByVal &H1012014, ReadData(0), 4, 0&
ESIC = ReadData(0)
'保存了关键的地址
For n = 0 to 9
List1.AddItem &第& & n + 1 & &列&
For i = 1 To 11
EAX = EBX = ECX = EDI = 0
If (J = 0) Then
lAddress = ESI8 + n * 4
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0)
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0)
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
EDI = ReadData(0)
lAddress = ESI8 + n * 4
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0)
For I2 = 1 To J
'根据列数循环查找对应的地址
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0) + 8
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0)
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
EDI = ReadData(0)
lAddress = ESI4 + 12
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0) + (EAX + EAX * 2) * 4
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
EBX = ReadData(0) * 13
lAddress = ESI4 + 12
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
lAddress = ReadData(0) + (EAX + EAX * 2) * 4 + 4
'B(m) = lAddress
'定义的一个地址数组B(109)存放的所有地址
ReadProcessMemory proHandle, ByVal lAddress, ReadData(0), 4, 0&
EAX = EBX + ReadData(0) + 1
List1.AddItem 'CARD' & EAX
'输出为CARD?的字符
CloseHandle (proHandle)
以上是读取每张扑克的点数,程序很简陋,只是用来测试一下的。
程序中可以注意到我定义了B(109)的数组,用来存储地址,所以就可以来修改内存,这样就可以把每张牌修改成自己想要的点数程序格式如下WriteProcessMemory proHandle, ByVal B(0), 0, 4, 0&
'这里0表示A的意思WriteProcessMemory proHandle, ByVal B(109), 1, 4, 0&
'1表示2的意思其他的同理修改即可。InvalidateRect AppHandle, rect, True
'用来刷新屏幕(rect取窗体大小即可)论坛用户"fit2"回帖:楼主的贴子发到这里好像有点不符合主题吧论坛用户"调戏"回帖:So
下次从看雪复制的话 麻烦加个转帖...论坛用户"山里来的风"回帖:兄弟又被X了,看雪好出名的。人人都知也。
上一页下一页
低价优质,一站式采购满足企业多场景营销宣传的印品需求
领先的商业印品定制服务商荣膺中国印刷电商服务品牌20强榜单
设计变简单,你的设计你做主在线自助式轻设计,众多精美款式选择
售后无忧,贴心服务质量问题或运输破损,无条件免费重印
_领先的商务营销印品定制服务商&&&&&&Copyright&(C)&2017&&
版权所有&&&&&&鲁ICP备号-7&&&公安部备案号:94
有什么可以帮您呢?
或者拨打服务热线}

我要回帖

更多关于 这个座位有人吗 漫画 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信