一步步学破解
专注于.net技术
夺
posts - 75, comments - 13, trackbacks - 0
一步步学破解-函数调用堆栈变化分析 (一)
比如 我们有这样一个C函数
#include
long test(int a,int b)
{
a = a + 1;
b = b + 100;
return a + b;
}
void main()
{
printf("%d",test(1000,2000));
}
写成32位汇编就是这样
;////////...
专注于.net技术
夺
posts - 75, comments - 13, trackbacks - 0
一步步学破解-函数调用堆栈变化分析 (一)
比如 我们有这样一个C函数
#include
long test(int a,int b)
{
a = a + 1;
b = b + 100;
return a + b;
}
void main()
{
printf("%d",test(1000,2000));
}
写成32位汇编就是这样
;/////////////////////////////////////////////////////////////////////////////////////////
/////////////
.386
.model flat,stdcall ;这里我们用stdcall 就是函数参数 压栈的时候从最后一个开始压
,和被调用函数负责清栈
option casemap:none ;区分大小写
includelib msvcrt.lib ;这里是引入类库 相当于 #include了
printf PROTO C:DWORD,:VARARG ;这个就是声明一下我们要用的函数头,到时候 汇编
程序会自动到msvcrt.lib里面找的了
;:VARARG 表后面的参数不确定 因为C就是这样的printf(const ch
ar *, ...);
;这样的函数要注意 不是被调用函数负责清栈 因为它本身不知道有多
少个参数
;而是有调用者负责清栈 下面会详细说明
.data
szTextFmt BYTE '%d',0 ;这个是用来类型转换的,跟C的一样,字符用字节类型
a dword 1000 ;假设
b dword 2000 ;处理数值都用双字 没有int 跟long 的区别
;/////////////////////////////////////////////////////////////////////////////////////////
.code
_test proc ;A:DWORD,B:DWORD
push ebp
mov ebp,esp
博客园 首页 社区 新文章 新随笔 订阅 管理
< 2009年4月 >
日 一 二 三 四 五 六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
留言簿
给我留言
查看留言
我参加的小组
编程爱好者
随笔档案
2009年6月 (6)
2009年5月 (2)
2009年4月 (31)
2009年3月 (16)
2009年2月 (17)
2006年9月 (3)
最新评论
1. Re:破解软件的感悟-PE文件格
www.plcworld.cn
mov eax,dword ptr ss:[ebp+8]
add eax,1
mov edx,dword ptr ss:[ebp+0Ch]
add edx,100
add eax,edx
pop ebp
retn 8
_test endp
_main proc
push dword ptr ds:b ;反汇编我们看到的b就不是b了而是一个[*****]数字 dwo
rd ptr 就是我们在ds(数据段)把[*****]
;开始的一个双字长数值取出来
push dword ptr ds:a ;跟她对应的还有 byte ptr ****就是取一个字节出来 比如
这样 mov al,byte ptr ds:szTextFmt
;就把 % 取出来 而不包括 d
call _test
push eax ;假设push eax的地址是×××××
push offset szTextFmt
call printf
add esp,8
ret
_main endp
end _main
;////////////////////////////////////////////////////////////// 下面介绍堆栈的变化
首先要明白的是 操作堆栈段 ss 只能用 esp或ebp寄存器 其他的寄存器eax ebx edx等都不
能够用 而 esp永远指向堆栈栈顶 ebp用来 在堆栈段
里面寻址
push 指令是压栈 ESP=ESP-4
pop 指令是出栈 ESP=ESP+4
我们假设main函数一开始堆栈定是 ESP=400
push dword ptr ds:b ;ESP-4=396 ->里面的值就是 2000 就是b的数值
push dword ptr ds:a ;ESP-4=392 ->里面的值就是 1000 就是a的数值
call test ;ESP-4=388->里面的数值是什么?这个太重要了 就是我们
用来找游戏函数的原理所在。
里面的数值就是call test 指令下一条指令的地址->即p
ush eax的地址×××××
到了test函数里面
push ebp ;ESP-4=384->里面保存了当前ebp的值 而不是把ebp清零
mov ebp,esp ;这里ESP=384就没变化了,但是 ebp=esp=384,为什么
要这样做呢 因为我们要用ebp到堆栈里面找参数
mov eax,dword ptr ss:[ebp+8] ;反汇编是这样的 想想为什么a就是[ebp+8]呢
;我们往上看看堆栈里地址392处就保存着a的值 这里ebp=384 加
上8正好就是392了
;这样就把传递过来的1000拿了出来eax=1000
add eax,1 ;相当于 a+1了 eax=1001
mov edx,dword ptr ss:[ebp+0Ch] ; 0Ch=12 一样道理这里指向堆栈的地址是384+
12=396 就是2000了 edx=2000
add edx,100 ;相当于 b+100 edx=2100
阅读排行榜
评论排行榜
式深入浅出(一)
讲的不错哦,学习了。
--程亮
2. re: 多站点整合—单点登录简单
方案
非常棒!~在中国国情下,非常使
用。3Q!~
--东山
3. re: win32汇编系列(一)
好!谢谢了!
--ljnnn123
4. re: 多站点整合—单点登录简单
方案
今天研究SSO,吃午饭前最后看到
的一篇,非常感谢楼主的细心分析
!对于跨域问题很有参考价值,至
少该方案已经是商用应用的,值得
深究,裁剪或改进之,有空可以分
析下 Microsoft Passport,...
--晓风残月
5. re: 单点登录方案+c#实现不同
应用程序通讯,摸拟按键并跳过登
录界面
sysuser.xml放在服务端还是客户端
?在服务端的话怎么区分不同的用
户呢?如果在客户端的话是不是有
写盘的权限?
--ybgenius
1. 一步步学习汇编(11)之Call和ret
指令(破解软件的必修课二)(588)
2. 多站点整合—单点登录简单方案
(325)
3. 一步步学习汇编(15)之int指令理
解(破解软件的必修课六) (285)
4. 一步步学习汇编(10)之jmp指令
原理分析(破解软件的必修课)(26
3)
5. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(258)
1. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(3)
2. 多站点整合—单点登录简单方案
(2)
3. 索引原理及项目中如何使用索引
实例分析(2)
4. 写控件,你准备好了吗(三)?
www.plcworld.cn
0 0
(请您对文章做出评价)
add eax,edx ;eax=eax+edx=1001+2100=3101 这里eax已经保存
了最终的结果了
;因为win32汇编一般用eax返回结果 所以如果最终结果不是在eax
里面的话 还要把它放到eax
;比如假设我的结果保存在变量nRet里面 最后还是要这样 mov ea
x,dword ptr nRet
pop ebp ;ESP=384+4=388 而保存在栈顶384的值 保存到 ebp中 即
恢复ebp原来的值
;因为一开始我们就把ebp的值压栈了,mov ebp,esp已经改变了
ebp的值,这里恢复就是保证了堆栈平衡
retn 8 ;ESP+8->396 这里retn是由系统调用的 我们不用管 系统会自
动把EIP指针指向 原来的call的下一条指令
;由于是系统自动恢复了call那里的压栈所以 真正返回到的时候ES
P+4就是恢复了call压栈的堆栈
;到了这个时候 ESP=400 就是函数调用开始的堆栈,就是说函数
调用前跟函数调用后的堆栈是一样的
;这就是堆栈平衡
由于我们用stdcall上面retn 8就是被调用者负责恢复堆栈的意思了,函数test是被调用者,
所以负责把堆栈加8,call 那里是系统自动恢复的
push eax ;ESP-4=396->里面保存了eax的值3101
;上面已经看到了eax保存着返回值,我们要把它传给printf也是通过堆栈传
递
push offset szTextFmt ;ESP-4=392->里面保存了szTextFmt的地址 也就是C里面的指
针 实际上没有什么把字符串传递的,我们传的都是地址
;无论是在汇编或C 所以在汇编里没有什么字符串类型 用最多的就是DWOR
D。嘿嘿游戏里面传递参数 简单多了
call printf ;ESP-4=388->里面保存了下一条指令的地址
add esp,8 ;ESP+8=400 恢复了调用printf前的堆栈状态
;上面说了由于printf后面参数是:VARARG 这样的类型是有调用者恢复堆
栈的 所以printf里面没有retn 8之类的指令
;这是由调用者负责清栈 main是调用者 所以下面一句就是 add esp,8 把
堆栈恢复到调用printf之前
;而call printf那里的压栈 是由系统做的 恢复的工作也是系统完成 我们不
用理 只是知道里面保存是返回地址就够
;了
ret ;main 函数返回 其他的事情是系统自动搞定 我们不用理 任务完成
posted on 2009-04-23 16:45 jasonM 阅读(74) 评论(0) 编辑 收藏 网摘
刷新评论列表 刷新页面 返回页首
发表评论
昵称: [登录] [注册]
主页:
60天内阅读排行
(2)
5. 写控件,你准备好了吗(-)?
(2)
1. 群发软件开发原理分析(31)
2. .net调用vc++写的dll(26)
3. CMainFrame::PreCreateWindo
w这个函数执行了两次(25)
4. 通俗解释socket(并附上注释So
cket源代码)(20)
5. 开发旺旺群发软件,难点及重要
技术点分析(一)(19)
www.plcworld.cn
专注于.net技术
夺
posts - 75, comments - 13, trackbacks - 0
一步步学破解-windows消息循环原理实例总结(二)
我们看上面的流程,可以总结出创建一个窗口的流程:
(1).注册窗口类(RegisterClass)。在注册之前,要先填写RegisterClass的参数WNDCLA
SSEX结构。
(2)建立窗口(CreateWindow)。
(3)显示窗口(ShowWindows)。
(4)刷新窗口客户区(UpdateWindow)。
(5)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),如果有消息到达
,则将消息分派到回调函数处理(DispatchMessage),如果消息是WM_QUIT,则退出循
环。
二.那么为什么要按照这样的顺序做呢?我们来用下图阐述一下原理:
(1).当我们按了键盘和shu标后,此时会产生一个消息(包含消息的类型,发生的时间,位置
等),并放入到系统消息队列中。此时windows会检查消息发生的位置,如果发现这个消息刚
好位于某个应用程序的窗口内的时候,就将这个消息放于应用程序的消息队列中。如图c所示
。
Code
博客园 首页 社区 新文章 新随笔 订阅 管理
< 2009年4月 >
日 一 二 三 四 五 六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
留言簿
给我留言
查看留言
我参加的小组
编程爱好者
随笔档案
2009年6月 (6)
2009年5月 (2)
2009年4月 (31)
2009年3月 (16)
2009年2月 (17)
2006年9月 (3)
最新评论
1. Re:破解软件的感悟-PE文件格
www.plcworld.cn
(2).当应用程序还没有来取消息的时候,消息就暂时保留在消息队列里,当程序中的消息循
环执行到GetMessage的时候,控制权转移到GetMessage所在的USER32.DLL中(箭头1),
USER32.DLL从程序消息队列中取出一条消息(箭头2),然后把这条消息返回应用程序(箭
头3)。
(3).然后应用程序将处理这条消息,但不是自己直接调用窗口过程来完成,而是通过Disp
atchMessage间接调用窗口过程,Dispatch的英文含义是“分派”,之所以是“分派”,是因为一
个程序可能建有不止一个窗口,不同的窗口消息必须分派给相应的窗口过程。当控制权转移到
USER32.DLL中的DispatchMessage时,DispatchMessage找出消息对应窗口的窗口过程,然
后把消息的具体信息当做参数来调用它(箭头5),窗口过程根据消息找到对应的分支去处理
,然后返回(箭头6),这时控制权回到DispatchMessage,最后DispatchMessage函数返回
应用程序(箭头7)。这样,一个循环就结束了,程序又开始新一轮的GetMessage。
(4). 应用程序之间也可以互发消息,PostMessage是把一个消息放到其他程序的消息队
列中,如图4.4中箭头d所示,目标程序收到了这条消息就把它放入该程序的消息队列去处理;
而SendMessage则越过消息队列直接调用目标程序的窗口过程(如图4.4中箭头I所示),窗口
过程返回以后才从SendMessage返回(如图4.4中箭头II所示)。
窗口过程是由Windows回调的,Windows又是怎么知道往哪里回调呢?答案是我们在调
用RegisterClassEx函数的时候告诉了Windows。
三.理解了原理之后,我们来仔细分析上面创建一个窗口的程序。
(1).为什么要使用注册窗口类?
例如:在一个窗口中,可能有不同的按钮,它们的工作原理都是一样的。但是各个按钮可能都
有不同的表现形式,比如大小,颜色等。所以在这种情况下,我们需要将创建窗口的共性提取
出来,然后再设置每个具体的窗口。这样就更加符合面向对象的原理。
(2).当应用程序取得消息后,DispatchMessage是如何知道要发给谁去处理呢?
这是因为在注册窗口类时,已经指定了。否则windows不可能知道。
(3).注册窗口类后,就要创建窗口了,建立窗口以后,传回来的是窗口句柄,要把它先保存起
来,这时候,窗口虽已建立,但还没有在屏幕上显示出来,要用ShowWindow把它显示出来
,ShowWindow也可以用在别的地方,主要用来控制窗口的显示状态(显示或隐藏),大小
控制(最大化、最小化或原始大小)和是否激活(当前窗口还是背后的窗口),它用窗口句柄
做第一个参数,第二个参数则是显示的方式
(4).窗口建立后,我们需要在窗口的客户区显示,这就要用到UpdateWindow, 它实际
上就是向窗口发送了一条WM_PAINT消息
三.消息循环
函数会在这里返回取到的消息,hWnd参数指定要获取哪个窗口的消息,例子中指定为NU
LL,表示获取的是所有本程序所属窗口的消息,wMsgFilterMin和wMsgFilterMax为0表示
获取所有编号的消息。
GetMessage函数从消息队列里取得消息,填写好MSG结构并返回
TranslateMessage将MSG结构传给Windows进行一些键盘消息的转换,当有键盘按下和
放开时,Windows产生WM_KEYDOWN和WM_KEYUP或WM_SYSKEYDOWN和WM_SYSK
EYUP消息,但这些消息的参数中包含的是按键的扫描码,转换成常用的ASCII码要经过查表
阅读排行榜
评论排行榜
式深入浅出(一)
讲的不错哦,学习了。
--程亮
2. re: 多站点整合—单点登录简单
方案
非常棒!~在中国国情下,非常使
用。3Q!~
--东山
3. re: win32汇编系列(一)
好!谢谢了!
--ljnnn123
4. re: 多站点整合—单点登录简单
方案
今天研究SSO,吃午饭前最后看到
的一篇,非常感谢楼主的细心分析
!对于跨域问题很有参考价值,至
少该方案已经是商用应用的,值得
深究,裁剪或改进之,有空可以分
析下 Microsoft Passport,...
--晓风残月
5. re: 单点登录方案+c#实现不同
应用程序通讯,摸拟按键并跳过登
录界面
sysuser.xml放在服务端还是客户端
?在服务端的话怎么区分不同的用
户呢?如果在客户端的话是不是有
写盘的权限?
--ybgenius
1. 一步步学习汇编(11)之Call和ret
指令(破解软件的必修课二)(588)
2. 多站点整合—单点登录简单方案
(325)
3. 一步步学习汇编(15)之int指令理
解(破解软件的必修课六) (285)
4. 一步步学习汇编(10)之jmp指令
原理分析(破解软件的必修课)(26
3)
5. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(258)
1. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(3)
2. 多站点整合—单点登录简单方案
(2)
3. 索引原理及项目中如何使用索引
实例分析(2)
4. 写控件,你准备好了吗(三)?
www.plcworld.cn
0 0
(请您对文章做出评价)
,很不方便,TranslateMessage遇到键盘消息则将扫描码转换成ASCII码并在消息队列中插入
WM_CHAR或WM_SYSCHAR消息,参数就是转换好的ASCII码,如此一来,要处理键盘消息
的话只要处理WM_CHAR消息就好了。遇到别的消息则TranslateMessage不做处理。
例如:如果我们按一个健盘上的健,如果不用TranslateMessage,则会处理WM_KEYD
OWN和WM_KEYUP消息,否则,就只会产生WM_CHAR消息。
最后,由DispatchMessage将消息发送到窗口对应的窗口过程去处理。窗口过程返回后D
ispatchMessage函数才返回,然后开始新一轮消息循环。
四. WM_PAINT消息
在最初创建窗口时,整个客户区域是无效的。因为程序还没有在窗口上画什么东西。当
调 用updatawindow后,会发送一个WM_PAINT消息(第一个WM_PAINT消息),
它会指示在窗口的客户区内画一些东西。
那么当我们改变窗口大小时,使整个窗口无效,迫使windows刷新。
当窗口与另一个窗口重叠时,当移开后,使被重叠的那部分无效。
当最小化窗口后,当窗口重新恢复到原始状态时,windows并不保存客户区的内
容(因为那样工作量太大),只是使之无效而已。
一旦客户区域失效,窗口过程就会接收一个新的WM_PAINT消息,此时使用Get
ClientRect获得变化后的客户区哉。并在新窗口的中央显示文本。
posted on 2009-04-24 13:05 jasonM 阅读(133) 评论(0) 编辑 收藏 网摘
刷新评论列表 刷新页面 返回页首
发表评论
昵称: [登录] [注册]
主页:
邮箱: (仅博主可见)
60天内阅读排行
(2)
5. 写控件,你准备好了吗(-)?
(2)
1. 群发软件开发原理分析(31)
2. .net调用vc++写的dll(26)
3. CMainFrame::PreCreateWindo
w这个函数执行了两次(25)
4. 通俗解释socket(并附上注释So
cket源代码)(21)
5. 开发旺旺群发软件,难点及重要
技术点分析(一)(19)
www.plcworld.cn
专注于.net技术
夺
posts - 75, comments - 13, trackbacks - 0
一步步学破解-在已有的主窗口上创建按钮(三)
因为按钮是子窗口,是系统已定义好的,所以不需要使用注册窗口类注册,也不需要写消息处
理,直接在窗口的WM_CREATE中创建就可以了,在上一讲的窗口过程中加入如下代码:
case WM_CREATE:
{
CreateWindow(TEXT("BUTTON"),TEXT("按钮(&A)"),WS_CHILD | WS_VISIB
LE |BS_PUSHBUTTON,10,10,65,22,hWnd,(HMENU)1000,hInst,NULL);
return 0;
}
这样就实现了在sdk中加入控件的功能,非常简单吧!!
同样的道理,如果我们想增加一个文本框控件,仅需要加入:
///下面一个是编辑框按钮,你可以在其中输入文字,具有一个简单的写字板的
///功能,可以复制、粘贴、剪切等操作
///////////////////////////////////////////////////////////////////
CreateWindow(
"edit", //在这里设置此按钮为edit类型,表示将控件设定为编辑框控件
"试试", //字符型数组在前面已经定义,在这里显示它的内容
WS_CHILD | WS_VISIBLE,
10,
160,
568,
130,
hWnd,
(HMENU)1001,
hInst,
NULL);
备注:设定按钮的类型为button,其它类型有静态控件static,
滚动条控件scrollbar,编辑框控件edit,列表框控件listbox
博客园 首页 社区 新文章 新随笔 订阅 管理
< 2009年4月 >
日 一 二 三 四 五 六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
留言簿
给我留言
查看留言
我参加的小组
编程爱好者
随笔档案
2009年6月 (6)
2009年5月 (2)
2009年4月 (31)
2009年3月 (16)
2009年2月 (17)
2006年9月 (3)
最新评论
1. Re:破解软件的感悟-PE文件格
www.plcworld.cn
专注于.net技术
夺
posts - 75, comments - 13, trackbacks - 0
一步步学破解-sdk进程间传递信息
网上关于使用sdk在进程间传递信息的文章,在google和百度中搜了一天,都没搜到,全是v
c或者.net的,郁闷,没办法,自己写了个发送方和接收方的自己来测试一下,相关代码和注
释如下:
发送方代码:
#include
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevlinstance,LPSTR sz
CmdLine,int iCmdShow)
{
char szBuffer[100];
int number=100;
char szStart[]="Press OK to start SendMessage";
char szText[]="Text send to other windows";
HWND hWnd=FindWindow("MyClass",NULL);
//如果没有找到,则:
if(hWnd==0)
{
MessageBox(NULL,TEXT("Hello,Windows 98!"),TEXT("格式化字符串"),0);
}
//如果找到了句柄,则:
else
{
wsprintf(szBuffer,"%s",szStart,szText);
MessageBox(NULL,szBuffer,TEXT("SendMessage"),MB_OK);
SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)szText);
}
}
接收方代码:
#include
/* 导入包含文件WINDOWS.H,此文件包含了其它的Windows头文件 */
/* WINDEF.H 基本类型定义 */
/* WINNT.H 支持Unicode的类型定义 */
/* WINBASE.H 内核函数 */
/* WINUSER.H 用户接口函数 */
博客园 首页 社区 新文章 新随笔 订阅 管理
< 2009年4月 >
日 一 二 三 四 五 六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
留言簿
给我留言
查看留言
我参加的小组
编程爱好者
随笔档案
2009年6月 (6)
2009年5月 (2)
2009年4月 (31)
2009年3月 (16)
2009年2月 (17)
2006年9月 (3)
最新评论
1. Re:破解软件的感悟-PE文件格
www.plcworld.cn
/* WINGDI.H 图形设备接口函数 */
/****************************************************************
********/
/* 窗口对象的过程处理函数 */
/* LRESULT: 简单定义为LONG(long) */
/* CALLBACK:__stdcall,指在Windows本身和用户的应用程序之间发生的函数调 */
/* 用的特殊调用序列。 */
/* HWND: 窗口句柄,32位数字,该参数为接受消息的窗口的句柄, */
/* CreateWindow函数的返回值。 */
/* UINT: unsigned int 无符号整型32位, */
/* 该参数为MSG结构中的message域相同,表示该消息的数字 */
/* WPARAM: UINT,32位消息参数 */
/* LPARAM: LONG,32位消息参数 */
/****************************************************************
********/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst; // 当前实例
TCHAR szBuffer[100];
#define IDC_BUTTON 40000
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine, int
iCmdShow)
{
/* 定义窗口类 */
/* TCHAR:char */
/* _T和TEXT宏,功能一致,通常没用,在Unicode系统中, */
/* 自动把后面的字符串转换为宽字符串 */
/***************************************************************
*********/
TCHAR tcClassName[] = TEXT("MyClass"); //窗口类名字符串
//char szBuffer[100];
hInst=hInstance;
/***************************************************************
*********/
/* WNDCLASS:窗口类结构,定义了窗口的一般特性,可以创建不同的窗口 */
/* typedef struct */
/* { */
/* UINT style ; */
/* WNDPROC lpfnWndProc ; */
/* int cbClsExtra ; */
/* int cbWndExtra ; */
/* HINSTANCE hInstance ; */
/* HICON hIcon ; */
/* HCURSOR hCursor ; */
/* HBRUSH hbrBackground ; */
/* LPCTSTR lpszMenuName ; */
/* LPCTSTR lpszClassName ; */
/* } */
/* WNDCLASS, * PWNDCLASS ; */
/***************************************************************
*********/
HWND hWnd;
阅读排行榜
评论排行榜
式深入浅出(一)
讲的不错哦,学习了。
--程亮
2. re: 多站点整合—单点登录简单
方案
非常棒!~在中国国情下,非常使
用。3Q!~
--东山
3. re: win32汇编系列(一)
好!谢谢了!
--ljnnn123
4. re: 多站点整合—单点登录简单
方案
今天研究SSO,吃午饭前最后看到
的一篇,非常感谢楼主的细心分析
!对于跨域问题很有参考价值,至
少该方案已经是商用应用的,值得
深究,裁剪或改进之,有空可以分
析下 Microsoft Passport,...
--晓风残月
5. re: 单点登录方案+c#实现不同
应用程序通讯,摸拟按键并跳过登
录界面
sysuser.xml放在服务端还是客户端
?在服务端的话怎么区分不同的用
户呢?如果在客户端的话是不是有
写盘的权限?
--ybgenius
1. 一步步学习汇编(11)之Call和ret
指令(破解软件的必修课二)(588)
2. 多站点整合—单点登录简单方案
(325)
3. 一步步学习汇编(15)之int指令理
解(破解软件的必修课六) (285)
4. 一步步学习汇编(10)之jmp指令
原理分析(破解软件的必修课)(26
3)
5. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(258)
1. 单点登录方案+c#实现不同应用
程序通讯,摸拟按键并跳过登录界
面(3)
2. 多站点整合—单点登录简单方案
(2)
3. 索引原理及项目中如何使用索引
实例分析(2)
4. 写控件,你准备好了吗(三)?
www.plcworld.cn
MSG msg;
WNDCLASS wc; //窗口类属性描述结构
wc.lpszClassName = tcClassName; //窗口类名
wc.lpszMenuName = NULL; //窗口类菜单资源名
wc.lpfnWndProc = WndProc; //窗口对象的过程处理函数,指向函数的指针
wc.hInstance = hInstance; //当前进程对象句柄,接收于WinMain参数
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子
对象
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标对象
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //光标对象
wc.cbClsExtra = 0; //同类窗口对象公共数据区大小
wc.cbWndExtra = 0; //当前窗口对象私有数据区大小
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类风格,水平或垂直尺寸改
变后刷新
if (!RegisterClass(&wc)) //注册窗口类,参数为指向WNDCLASS结构的指针
{
/**************************************************************
**********/
/* 窗口类注册不成功的错误信息 */
/* MessageBox 消息框 */
/* 参数一:窗口句柄,如果没有则为NULL */
/* 参数二:消息框主体显示的字符串 */
/* 参数三:消息框标题栏上的字符串 */
/* 参数四:winuser.h中定义的MB_开始的常数组合,消息框风格:按钮,图标 */
/* 为0,则只有ok按钮 */
/* 返回值:返回IDOK(1)。 */
/* 还可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等
*/
/**************************************************************
**********/
MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERRO
R);
return 0; //如果注册失败,返回并终止程序
}
/***************************************************************
*********/
/* 定义窗口对象属性,指定有关窗口的更详细信息 */
/***************************************************************
*********/
TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口对象标题名称
CREATESTRUCT cs; //窗口对象属性描述结构,定义在WINUSER.H
cs.lpszClass = tcClassName; //窗口类名
cs.lpszName = tcWindowCaptionName; //窗口对象标题名称,显示在标题栏
cs.style = WS_OVERLAPPEDWINDOW; //窗口对象风格
cs.x = 100; //窗口对象在屏幕上的x坐标
cs.y = 100; //窗口对象在屏幕上的y坐标
cs.cx = 400; //窗口对象的宽度
cs.cy = 300; //窗口对象的高度
cs.hwndParent = NULL; //窗口对象的父窗口句柄
cs.hMenu = NULL; //窗口对象的菜单句柄或子窗口编号
60天内阅读排行
(2)
5. 写控件,你准备好了吗(-)?
(2)
1. 群发软件开发原理分析(31)
2. .net调用vc
本文档为【一步步学破解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。