yC 逆着看

yC 有源码但是我们逆着看

 

.386
.model flat, stdcall
option casemap:none

include /masm32/include/kernel32.inc   ;<--------像c语言中的#include <stdio.h>
include /masm32/include/user32.inc
include /masm32/include/comdlg32.inc
include /masm32/include/shell32.inc
include /masm32/include/imagehlp.inc

includelib /masm32/lib/kernel32.lib   ;<---------像c语言中的#pragma   comment(lib,"Ws2_32.lib")
includelib /masm32/lib/user32.lib
includelib /masm32/lib/comdlg32.lib
includelib /masm32/lib/shell32.lib
includelib /masm32/lib/imagehlp.lib

include /masm32/include/windows.inc
include resource.inc

DlgProc PROTO :HWND, :UINT, :WPARAM, :LPARAM  <---自定义函数,传说中的callback()函数

;------------ CONST --------- <---常量(#define PI 3.141)
.const
CHECK_SI_FLAG           equ 1   
ERASE_HEADER_FLAG       equ 2
DESTROY_IMPORT_FLAG     equ 4
CHECK_HEADER_CRC        equ 8
ANTI_DUMP_FLAG          equ 16
API_REDIRECT_FLAG       equ 32

szFilter                db "ExE files",0,"*.exe",0,"All files",0,"*.*",0,0
szCurDir                db ".",0
szNoFile                db "No file selected up to now !",0
szErr                   db "ERROR",0

;------------ DATA ---------- <------变量 (int a=0;)
.data
hInst                   dd 0   
hDLG                    dd 0
ofn                     OPENFILENAME <>
cFname                   db MAX_PATH dup (0)

;------------ CODE ----------<------从这里开始运行
.code

include CryptStuff.ASM
include PER.ASM

main:
        invoke GetModuleHandle,0
        mov hInst,eax
        invoke DialogBoxParam,eax,IDD_MAINDLG,0,offset DlgProc,0
THEEND:
        invoke ExitProcess,0

DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        LOCAL  hDrop : HANDLE

        pushad
        .IF uMsg == WM_INITDIALOG
           invoke LoadIcon,hInst,IDI_ICON
           invoke SendMessage,hDlg,WM_SETICON,TRUE,eax
           push hDlg
           pop hDLG
           ; check the checkboxes :)
           invoke CheckDlgButton,hDlg,IDC_CHECKHEADERCRC,TRUE
           invoke CheckDlgButton,hDlg,IDC_DESTROYIMPORT,TRUE
           invoke CheckDlgButton,hDlg,IDC_ANTIDUMP,TRUE
           INVOKE CheckDlgButton,hDlg,IDC_APIREDIRECT,TRUE
           invoke DragAcceptFiles,hDlg,TRUE
           
        .ELSEIF uMsg == WM_DROPFILES
           push wParam
           pop hDrop
           invoke DragQueryFile,hDrop,0,offset cFname,sizeof cFname
           invoke DragFinish,hDrop
           invoke SetDlgItemText,hDlg,IDC_TARGETFILE,offset cFname
           
        .ELSEIF uMsg == WM_COMMAND
           mov eax,wParam
           
           .IF ax == IDC_CLOSE
              invoke SendMessage,hDlg,WM_CLOSE,NULL,NULL
              
           .ELSEIF ax == IDC_CHOOSEFILE
              ; get a file path
              mov ofn.lStructSize,SIZEOF ofn 
              mov ofn.lpstrFilter,offset szFilter
              push hDlg
              pop ofn.hwndOwner
              mov ofn.lpstrFile, offset cFname 
              mov ofn.nMaxFile,SIZEOF cFname
              mov ofn.lpstrInitialDir,offset szCurDir
              mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_HIDEREADONLY
              push offset ofn
              call GetOpenFileName
              test eax,eax
              jz @@ExitDlgProc
              invoke SetDlgItemText,hDlg,IDC_TARGETFILE,offset cFname  
                          
           .ELSEIF ax == IDC_CRYPT
              ; ----- was a file selected ? -----
              mov eax,offset cFname
              .IF byte ptr [eax] == 0
                 invoke MessageBox,hDlg,offset szNoFile,offset szErr,MB_ICONERROR
                 jmp @@ExitDlgProc
              .ENDIF
              
              ; ---- build the protection flag -----
              xor edi,edi
              invoke IsDlgButtonChecked,hDlg,IDC_SICHECK
              .IF eax == BST_CHECKED
                 or edi,CHECK_SI_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_ERASEPEHEADER
              .IF eax == BST_CHECKED
                 or edi,ERASE_HEADER_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_DESTROYIMPORT
              .IF eax == BST_CHECKED
                 or edi,DESTROY_IMPORT_FLAG
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_CHECKHEADERCRC
              .IF eax == BST_CHECKED
                 or edi,CHECK_HEADER_CRC
              .ENDIF
              invoke IsDlgButtonChecked,hDlg,IDC_ANTIDUMP
              .IF eax == BST_CHECKED
                 or edi,ANTI_DUMP_FLAG
              .ENDIF
              INVOKE IsDlgButtonChecked,hDlg,IDC_APIREDIRECT
              .IF EAX == BST_CHECKED
                 OR  EDI, API_REDIRECT_FLAG
              .ENDIF
              push edi
              push hDlg
              push offset cFname
              call CryptFile
           .ENDIF
           
        .ELSEIF uMsg == WM_CLOSE
           invoke EndDialog,hDlg,0
        .ENDIF
        popad
        
  @@ExitDlgProc:
        xor eax,eax
        ret
DlgProc endp
end main


这里是网站和源码
Yoda's Protector Source

 

 

内容概要:本文详细介绍了在Linux环境下进行C++开发所需掌握的内容,以一个Web多人聊天项目为例,涵盖从开发环境搭建到项目部署的全过程。首先推荐了一个项目地址,该项目支持HTTP请求、Websocket、多房间和多人聊天、MySQL用户信息存储、Redis缓存、json序列化等功能,并建议扩展功能如基于Reactor模型构建HTTP/Websocket服务、仿写MySQL/Redis连接池等。接着介绍了开发环境,包括Ubuntu 20.04、MySQL 8.0、Redis 6.0、gcc/g++ 10.5.0等,并提供了详细的部署步骤,如安装boost库、编译聊天室服务、配置MySQL和Redis等。最后分析了项目架构,包括数据存储(MySQL存储用户信息,Redis存储房间消息和用户cookie)、消息格式(HTTP请求消息和Websocket交互消息)、HTTP/Websocket数据处理流程等。; 适合人群:有一定Linux基础,想深入了解C++开发及网络编程的开发者,尤其是有志于从事Web开发或服务器端开发的技术人员。; 使用场景及目标:①掌握Linux C++开发环境的搭建,包括工具链的安装与配置;②理解并实践HTTP、Websocket等网络协议的应用;③熟悉MySQL、Redis等数据库的使用;④学习如何处理HTTP请求、Websocket交互消息及数据存储;⑤能够独立完成类似Web聊天室的项目开发。; 其他说明:本文不仅提供了理论指导,还给出了具体的实践操作步骤,如编译过程中可能遇到的问题及解决方案。对于初学者来说,可以按照文中提供的链接和教程逐步学习,同时鼓励读者根据自身需求对项目进行扩展和优化。
对于圆弧,我们可以先将其转化为对应的圆弧,然后再根据圆弧的方法求出两个圆心。具体的做法是,将圆弧的起点和终点分别连接圆心,得到两条直径,然后求出这两条直径的交点,即为圆弧的中心点,再根据圆弧的方法求出两个圆心。 代码实现如下: ```c++ #include <iostream> #include <cmath> using namespace std; const double PI = acos(-1.0); int main() { double x1, y1, x2, y2, r; cin >> x1 >> y1 >> x2 >> y2 >> r; // 求出圆弧的圆心坐标 double xm = (x1 + x2) / 2, ym = (y1 + y2) / 2; double d = sqrt(r * r - pow(x1 - xm, 2) - pow(y1 - ym, 2)); double A = atan2(y1 - ym, x1 - xm); double B = acos(d / r); double C = A + B; double D = A - B; double xc1 = xm + r * cos(C), yc1 = ym + r * sin(C); double xc2 = xm + r * cos(D), yc2 = ym + r * sin(D); // 求出圆弧的中心点坐标 double xa = x1 - xc1, ya = y1 - yc1; double xb = x2 - xc1, yb = y2 - yc1; double cos_theta = (xa * xb + ya * yb) / (sqrt(xa * xa + ya * ya) * sqrt(xb * xb + yb * yb)); double sin_theta = sqrt(1 - cos_theta * cos_theta); double L = r * acos(cos_theta); double xm1 = xc1 + (xa + xb) / 2, ym1 = yc1 + (ya + yb) / 2; double u = (xb - xa) / L, v = (ya - yb) / L; double xc = xm1 + u * L / 2, yc = ym1 + v * L / 2; // 求出圆心坐标 double d1 = sqrt((x1 - xc) * (x1 - xc) + (y1 - yc) * (y1 - yc)); double d2 = sqrt((x2 - xc) * (x2 - xc) + (y2 - yc) * (y2 - yc)); if (abs(d1 - r) < 1e-6) cout << x1 << " " << y1 << " " << xc << " " << yc << endl; else if (abs(d2 - r) < 1e-6) cout << x2 << " " << y2 << " " << xc << " " << yc << endl; else cout << "No solution" << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值