为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

一步步学破解

2011-12-27 22页 pdf 895KB 29阅读

用户头像

is_838019

暂无简介

举报
一步步学破解 专注于.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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索