找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2992|回复: 11

【Win32Asm】生成GUID的对话框

[复制链接]
发表于 2018-11-16 02:57:17 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 watermelon 于 2018-11-16 02:59 编辑

不知道什么时候开始,好像是前两天,群里的QQ小冰29号大佬开始给自己的ID上了一串“乱七八糟”的字符串,随之系统消息(这里要指明是管理员那个系统消息)大佬也给自己的ID后面上了一串字符串。
当时我不明白这个是什么,感觉看起来很晦涩,好像密码一样,后来从他们吹水的过程中了解到这个原来是GUID。

GUID全称为Globally Unique Identifier,翻译为:全局唯一标识符。百度百科说:“全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。” “在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如注册表项、类及接口标识、数据库、系统目录等对象。”   ----百度百科GUID

现在了解了,原来QQ小冰29号和系统消息大佬们给自己上的是全局唯一标识符,意思就是独一无二呗。
所以小弟就想写一个能生成GUID的对话框,一个目的是温习罗云彬大大给教的Win32Asm,另一个目的是我想弄出来。

我们从网上百度可以知道要弄GUID可以用API函数CoCreateGuid和GUID转化为字符串的函数StringFromGUID2,这个就常规invoke调用就行。但是我写好后发现结果不对,他是乱码啊,只出现几个汉字,这显然是错误的。后来百度发现原来还要进行字符集之间的转换,好吧。

这个程序的一大费力的事情就是自己对资源文件进行编写。什么坐标,长度,宽度都要考虑进去,为了对称美观小弟花了好长时间功夫(实际上UI的设计我还是没有长进)

下面小弟就放上程序,希望各位大佬多多批评指针。

资源文件:
  1. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. #include                <resource.h>
  3. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. #define        ICO_MAIN                0x1000        //图标
  5. #define        DLG_MAIN                1
  6. #define        IDC_GUIDTEXT        101
  7. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  8. ICO_MAIN        ICON                "Main.ico"
  9. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10. DLG_MAIN DIALOG 280, 180, 240, 100
  11. STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
  12. CAPTION "watermelon GUID generator"
  13. FONT 9, "宋体"
  14. {
  15. CTEXT "Passion Coding, Yeah!!!", -1, 125, 80, 120, 20
  16. EDITTEXT IDC_GUIDTEXT, 40, 20, 160, 15
  17. DEFPUSHBUTTON "开始生成(&S)", IDOK, 95, 48, 50, 20
  18. }
  19. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
复制代码


源程序:
  1. ;本程序由watermelon进行编写,目的是生成GUID
  2.                 .386
  3.                 .model flat, stdcall
  4.                 option casemap :none
  5.                
  6. include                windows.inc
  7. include                user32.inc
  8. includelib        user32.lib
  9. include                kernel32.inc
  10. includelib        kernel32.lib
  11. include                gdi32.inc
  12. includelib        gdi32.lib
  13. include                advapi32.inc
  14. includelib        advapi32.lib
  15. include                comctl32.inc
  16. includelib         comctl32.lib
  17. include         shell32.inc
  18. includelib        shell32.lib
  19. include         ws2_32.inc
  20. includelib        ws2_32.lib
  21. include         ole32.inc
  22. includelib        ole32.lib


  23. ;等值定义
  24. ICO_MAIN        equ                1000h        ;图标
  25. DLG_MAIN        equ                1
  26. IDC_GUIDTEXT        equ                101


  27.                 .data
  28. hInstance        dd                ?


  29.                 .code
  30. ;对话框过程
  31. _ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam
  32.                 LOCAL        @szBuffer[128]:byte        ;用于存放生成的GUID
  33.                 LOCAL        @guid:GUID                ;定义一个GUID结构体
  34.                 LOCAL        @result[128]:byte        ;用于存放最终的结果

  35.                 mov        eax,wMsg
  36.                 .if        eax == WM_CLOSE
  37.                         invoke        EndDialog,hWnd,NULL
  38.                 .elseif        eax == WM_INITDIALOG
  39.                         invoke        LoadIcon,hInstance,ICO_MAIN
  40.                         invoke        SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
  41.                         invoke        GetDlgItem,hWnd,IDC_GUIDTEXT                ;初始时候先灰化
  42.                         invoke        EnableWindow,eax,FALSE
  43.                 .elseif        eax == WM_COMMAND
  44.                         mov        eax,wParam
  45.                         .if        ax == IDOK
  46.                                 ;TODO :这里开始写生成GUID的程序,运用CoCreateGuid
  47.                                 invoke        GetDlgItem,hWnd,IDC_GUIDTEXT
  48.                                 invoke        EnableWindow,eax,TRUE                ;将EDITTEXT激活
  49.                                
  50.                                 ;下面开始获取GUID和最终的结果
  51.                                 invoke        CoCreateGuid,addr @guid
  52.                                 ;将GUID转化为字符串
  53.                                 invoke        StringFromGUID2,addr @guid,addr @szBuffer,sizeof @szBuffer
  54.                                 ;字符集之间的转化,否则会出现显示不全或者乱码的情况
  55.                                 .if        eax
  56.                                         invoke        WideCharToMultiByte,CP_UTF8,0,\
  57.                                                 addr @szBuffer,-1,addr @result,\
  58.                                                 sizeof @result,NULL,NULL
  59.                                         invoke        SetDlgItemText,hWnd,IDC_GUIDTEXT,addr @result
  60.                                 .else
  61.                                         invoke        SetDlgItemText,hWnd,IDC_GUIDTEXT,addr @szBuffer
  62.                                 .endif
  63.                         .endif
  64.                 .else
  65.                         mov        eax,FALSE
  66.                         ret
  67.                 .endif
  68.                 mov        eax,TRUE
  69.                 ret

  70. _ProcDlgMain        endp

  71. start:
  72.                 invoke        GetModuleHandle,NULL
  73.                 mov        hInstance,eax
  74.                 invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL        ;模态对话框
  75.                 invoke        ExitProcess,NULL
  76. end        start
复制代码


附上运行时候的图片

EXE的图标来自歌曲:Alone   ---Wisp X/初音未来(QQ音乐),感谢深夜陪我一起passion coding

开始时候编辑框灰化

开始时候编辑框灰化

点击开始生成,编辑框中出现GUID

点击开始生成,编辑框中出现GUID

Passion.zip

29.31 KB, 下载次数: 6

回复

使用道具 举报

发表于 2018-11-19 12:15:09 | 显示全部楼层
watermelon 发表于 2018-11-19 12:07
站长好贴心把build.bat和nasm.exe都给了出来,移到当前目录双击bat就出来了EXE真的方便。
NASM写的程序很 ...

其实不是……而是我把.rdata段的内容合并到.text段了(虽然这样做并不好)少了一个段,就少了一个必须要对齐的东西,从而压缩了体积。

另外你对WideCharToMultiByte的调用让我看了觉得累得慌……如果是我,我就直接使用W系API了
回复 赞! 1 靠! 0

使用道具 举报

发表于 2018-11-19 08:29:16 | 显示全部楼层
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器就好。
不依赖任何lib(自己找出kernel32.dll的地址,然后从kernel32.dll里面找到LoadLibrary等各种函数,再加载需要的DLL使用)
整个程序只有2KB。

20181119092227.png

getguid.zip (589.62 KB, 下载次数: 3)

  1. global _start

  2. segment .text
  3. _start:
  4. ;找到kernel32.dll的地址
  5. mov eax, [fs:0x30]                ; EAX = &PEB
  6. mov eax, [eax + 0xc]        ; EAX = &(PEB->Ldr)
  7. mov eax, [eax + 0x14]        ; EAX = PEB->Ldr.InMemOrder.Flink (当前exe)
  8. mov ebx, [eax + 0x10]        ; EBX = 当前EXE的基址
  9. mov [_WCEx.hInstance], ebx
  10. mov eax, [eax]                        ; EAX = Flink(ntdll.dll)
  11. mov eax, [eax]                        ; EAX = Flink(kernel32.dll)
  12. mov ebx, [eax + 0x10]        ; EBX = kernel32.dll的基址
  13. mov [_addr_of_Kernel32], ebx

  14. ;找到导出表
  15. mov edx, [ebx + 0x3c]        ; EDX = DOS->e_lfanew
  16. add edx, ebx                        ; EDX = PE头
  17. mov edx, [edx + 0x78]        ; EDX = 导出表偏移
  18. add edx, ebx                        ; EDX = 导出表
  19. mov esi, [edx + 0x20]        ; ESI = 名字表偏移
  20. add esi, ebx                        ; ESI = 名字表

  21. ;找到GetProcAddress的序号
  22. xor ecx,ecx
  23. .LoopGetFunc:
  24. inc ecx
  25. lodsd
  26. add eax, ebx                        ; EAX = 函数名
  27. cmp dword [eax], 'GetP'
  28. jnz .LoopGetFunc
  29. cmp dword [eax+4], 'rocA'
  30. jnz .LoopGetFunc
  31. cmp dword [eax+8], 'ddre'
  32. jnz .LoopGetFunc
  33. cmp word [eax+12], 'ss'
  34. jnz .LoopGetFunc

  35. ;按着序号取得GetProcAddress的地址
  36. mov esi, [edx + 0x24]    ; ESI = 序号表偏移
  37. add esi, ebx             ; ESI = 序号表
  38. mov cx, [esi + ecx * 2]  ; CX = 函数序号
  39. dec ecx
  40. mov esi, [edx + 0x1c]    ; ESI = 地址表偏移
  41. add esi, ebx             ; ESI = 地址表
  42. mov edx, [esi + ecx * 4] ; EDX = 指针(偏移)
  43. add edx, ebx             ; EDX = GetProcAddress
  44. mov [_addr_of_GetProcAddress],edx

  45. ;调用GetProcAddress取得LoadLibrary的地址
  46. push _name_of_LoadLibraryA
  47. push ebx                ; Kernel32基址
  48. call edx                ; GetProcAddress
  49. mov [_addr_of_LoadLibraryA], eax

  50. ;取得ExitProcess的地址
  51. push _name_of_ExitProcess
  52. push dword[_addr_of_Kernel32]
  53. call [_addr_of_GetProcAddress]
  54. mov [_addr_of_ExitProcess], eax

  55. ;使用LoadLibrary加载user32.dll
  56. push _name_of_user32
  57. call [_addr_of_LoadLibraryA]
  58. mov [_addr_of_User32], eax

  59. ;使用LoadLibrary加载ole32.dll
  60. push _name_of_ole32
  61. call [_addr_of_LoadLibraryA]
  62. mov [_addr_of_Ole32], eax

  63. ;使用LoadLibrary加载gdi32.dll
  64. push _name_of_gdi32
  65. call [_addr_of_LoadLibraryA]
  66. mov [_addr_of_Gdi32], eax

  67. ;从User32导入需要的符号
  68. mov esi, _NameList_User32
  69. mov edi, _imp_from_user32
  70. mov ecx, _num_imp_user32
  71. mov ebp, [_addr_of_User32]
  72. .ImpFromUser32:
  73. push ecx
  74. lodsd
  75. push eax
  76. push ebp
  77. call [_addr_of_GetProcAddress]
  78. or eax,eax
  79. jnz .store_user32
  80. int3
  81. .store_user32:
  82. stosd
  83. pop ecx
  84. loop .ImpFromUser32

  85. ;从Ole32导入需要的符号
  86. mov esi, _NameList_Ole32
  87. mov edi, _imp_from_ole32
  88. mov ecx, _num_imp_ole32
  89. mov ebp, [_addr_of_Ole32]
  90. .ImpFromOle32:
  91. push ecx
  92. lodsd
  93. push eax
  94. push ebp
  95. call [_addr_of_GetProcAddress]
  96. or eax,eax
  97. jnz .store_ole32
  98. int3
  99. .store_ole32:
  100. stosd
  101. pop ecx
  102. loop .ImpFromOle32

  103. ;从Gdi32导入需要的符号
  104. mov esi, _NameList_Gdi32
  105. mov edi, _imp_from_gdi32
  106. mov ecx, _num_imp_gdi32
  107. mov ebp, [_addr_of_Gdi32]
  108. .ImpFromGdi32:
  109. push ecx
  110. lodsd
  111. push eax
  112. push ebp
  113. call [_addr_of_GetProcAddress]
  114. or eax,eax
  115. jnz .store_gdi32
  116. int3
  117. .store_gdi32:
  118. stosd
  119. pop ecx
  120. loop .ImpFromGdi32


  121. ;====创建窗口====
  122. mov dword [_WCEx.cbSize], 48
  123. mov dword [_WCEx.lpfnWndProc], _wnd_proc
  124. mov dword [_WCEx.hbrBackground], 16
  125. mov dword [_WCEx.lpszClassName], _ClassName

  126. push 32512 ; IDC_ARROW
  127. push 0
  128. call [_addr_of_LoadCursor]
  129. mov [_WCEx.hCursor], eax

  130. ;用新的GUID当作窗口类名
  131. call _update_guid
  132. mov esi, _StringGUID
  133. mov edi, _ClassName
  134. mov ecx, 20
  135. rep movsd

  136. ;把开头的{替换为c,把中间的横杠替换为下划线,把最后的}替换为'\0'
  137. mov word [_ClassName], 'c'
  138. mov ax,'_'
  139. mov [_ClassName+18], ax
  140. mov [_ClassName+28], ax
  141. mov [_ClassName+38], ax
  142. mov [_ClassName+48], ax
  143. mov word [_ClassName+74], 0

  144. push _WCEx
  145. call [_addr_of_RegisterClassEx]

  146. ;创建窗口
  147. push 0                                                ;lpParam
  148. push dword[_WCEx.hInstance]        ;hInstance
  149. push 0                                                ;hMenu
  150. push 0                                                ;hWndParent
  151. push 200                                        ;Height
  152. push 320                                        ;Width
  153. push 0x80000000                                ;Y
  154. push 0x80000000                                ;X
  155. push 0x00CA0000                                ;dwStyle
  156. push _WindowTitle                        ;lpWindowName
  157. push eax                                        ;lpClassName
  158. push 0                      ;dwExStyle
  159. call [_addr_of_CreateWindowExW]
  160. mov [_hWnd],eax

  161. push 1
  162. push dword [_hWnd]
  163. call [_addr_of_ShowWindow]

  164. push dword [_hWnd]
  165. call [_addr_of_UpdateWindow]

  166. ;====消息循环====
  167. .msgloop:
  168. push 0
  169. push 0
  170. push 0
  171. push _msg
  172. call [_addr_of_GetMessage]
  173. or eax, eax
  174. jz .loopout

  175. push _msg
  176. call [_addr_of_TranslateMessage]
  177. push _msg
  178. call [_addr_of_DispatchMessage]

  179. jmp .msgloop
  180. .loopout:

  181. push dword[_msg.wParam]
  182. call [_addr_of_ExitProcess]
  183. ret

  184. ;====函数:生成GUID====
  185. _update_guid:
  186. ;生成二进制的GUID
  187. push dword _BinGUID
  188. call [_addr_of_CoCreateGuid]

  189. ;生成GUID的字符串
  190. push dword 40
  191. push dword _StringGUID
  192. push dword _BinGUID
  193. call [_addr_of_StringFromGUID2]
  194. ret

  195. ;====消息处理函数====
  196. _wnd_proc:
  197. mov eax,[esp+8] ;读取消息
  198. ;然后判断是啥
  199. cmp eax, 1
  200. je .wm_create

  201. cmp eax, 2
  202. je .wm_destroy

  203. cmp eax, 0x111
  204. je .wm_command

  205. .default_msg:
  206. jmp [_addr_of_DefWindowProc]

  207. .wm_create:
  208. ;取得系统默认字体
  209. push 17 ;DEFAULT_GUI_FONT
  210. call [_addr_of_GetStockObject]
  211. mov [_DefFont], eax

  212. ;创建控件——文本标签
  213. push 0                                                ;lpParam
  214. push dword[_WCEx.hInstance]        ;hInstance
  215. push 100                                        ;hMenu
  216. push dword[esp+16]                        ;hWndParent
  217. push 17                                                ;Height
  218. push 273                                        ;Width
  219. push 24                                                ;Y
  220. push 16                                                ;X
  221. push 0x50000000                                ;dwStyle
  222. push _StaticTitle                        ;lpWindowName
  223. push _Ctrl_Static                        ;lpClassName
  224. push 0                      ;dwExStyle
  225. call [_addr_of_CreateWindowExA]

  226. push 1
  227. push dword[_DefFont]
  228. push 0x0030 ; WM_SETFONT
  229. push eax
  230. call [_addr_of_PostMessage]

  231. ;创建控件——文本框
  232. push 0                                                ;lpParam
  233. push dword[_WCEx.hInstance]        ;hInstance
  234. push 101                                        ;hMenu
  235. push dword[esp+16]                        ;hWndParent
  236. push 18                                                ;Height
  237. push 273                                        ;Width
  238. push 48                                                ;Y
  239. push 16                                                ;X
  240. push 0x50810800                                ;dwStyle
  241. push _StringGUID                        ;lpWindowName
  242. push _Ctrl_Edit                                ;lpClassName
  243. push 0                      ;dwExStyle
  244. call [_addr_of_CreateWindowExW]
  245. mov [_hWnd_TextBox], eax

  246. push 1
  247. push dword[_DefFont]
  248. push 0x0030 ; WM_SETFONT
  249. push eax
  250. call [_addr_of_PostMessage]

  251. ;创建控件——按钮
  252. push 0                                                ;lpParam
  253. push dword[_WCEx.hInstance]        ;hInstance
  254. push 102                                        ;hMenu
  255. push dword[esp+16]                        ;hWndParent
  256. push 33                                                ;Height
  257. push 89                                                ;Width
  258. push 128                                        ;Y
  259. push 16                                                ;X
  260. push 0x50000001                                ;dwStyle
  261. push _ButtonTitle                        ;lpWindowName
  262. push _Ctrl_Button                        ;lpClassName
  263. push 0                      ;dwExStyle
  264. call [_addr_of_CreateWindowExA]
  265. mov [_hWnd_Button], eax

  266. push 1
  267. push dword[_DefFont]
  268. push 0x0030 ; WM_SETFONT
  269. push eax
  270. call [_addr_of_PostMessage]

  271. xor eax, eax
  272. ret 16

  273. .wm_command:
  274. mov eax,[esp+12]
  275. cmp ax,102 ;按钮的ID
  276. jnz .default_msg

  277. shr eax,16
  278. cmp ax,0 ;是否为按钮按下的消息
  279. jnz .default_msg

  280. ;按钮按下,更新GUID
  281. call _update_guid
  282. push _StringGUID
  283. push dword[_hWnd_TextBox]
  284. call [_addr_of_SetWindowText]

  285. xor eax,eax
  286. ret 16

  287. .wm_destroy:
  288. push 0
  289. call [_addr_of_PostQuitMessage]
  290. xor eax,eax
  291. ret 16


  292. ; segment .rdata
  293. _name_of_LoadLibraryA db "LoadLibraryA", 0
  294. _name_of_ExitProcess db "ExitProcess", 0

  295. _name_of_user32 db "user32.dll", 0
  296. _name_of_LoadCursor db "LoadCursorA", 0
  297. _name_of_RegisterClassEx db "RegisterClassExW", 0
  298. _name_of_CreateWindowExA db "CreateWindowExA", 0
  299. _name_of_CreateWindowExW db "CreateWindowExW", 0
  300. _name_of_SetWindowText db "SetWindowTextW", 0
  301. _name_of_PostQuitMessage db "PostQuitMessage", 0
  302. _name_of_ShowWindow db "ShowWindow", 0
  303. _name_of_UpdateWindow db "UpdateWindow", 0
  304. _name_of_GetMessage db "GetMessageA", 0
  305. _name_of_PostMessage db "PostMessageA", 0
  306. _name_of_TranslateMessage db "TranslateMessage", 0
  307. _name_of_DispatchMessage db "DispatchMessageA", 0
  308. _name_of_DefWindowProc db "DefWindowProcA", 0

  309. _name_of_ole32 db "ole32.dll", 0
  310. _name_of_CoCreateGuid db "CoCreateGuid", 0
  311. _name_of_StringFromGUID2 db "StringFromGUID2", 0

  312. _name_of_gdi32 db "gdi32.dll", 0
  313. _name_of_GetStockObject db "GetStockObject", 0

  314. _NameList_User32:
  315. dd _name_of_LoadCursor
  316. dd _name_of_RegisterClassEx
  317. dd _name_of_CreateWindowExA
  318. dd _name_of_CreateWindowExW
  319. dd _name_of_SetWindowText
  320. dd _name_of_PostQuitMessage
  321. dd _name_of_ShowWindow
  322. dd _name_of_UpdateWindow
  323. dd _name_of_GetMessage
  324. dd _name_of_PostMessage
  325. dd _name_of_TranslateMessage
  326. dd _name_of_DispatchMessage
  327. dd _name_of_DefWindowProc
  328. _num_imp_user32 equ ($ - _NameList_User32) / 4

  329. _NameList_Ole32:
  330. dd _name_of_CoCreateGuid
  331. dd _name_of_StringFromGUID2
  332. _num_imp_ole32 equ ($ - _NameList_Ole32) / 4

  333. _NameList_Gdi32:
  334. dd _name_of_GetStockObject
  335. _num_imp_gdi32 equ ($ - _NameList_Gdi32) / 4

  336. _Ctrl_Static db "STATIC", 0
  337. _Ctrl_Edit dw "E", "D", "I", "T", 0 ;因为生成的GUID字符串是宽字符,所以用W方式的API来弄它相关的
  338. _Ctrl_Button db "BUTTON", 0
  339. _WindowTitle db "GUID Generator", 0
  340. _StaticTitle db "New GUID:", 0
  341. _ButtonTitle db "&Generate", 0

  342. segment .bss
  343. _addr_of_Kernel32 resd 1
  344. _addr_of_User32 resd 1
  345. _addr_of_Ole32 resd 1
  346. _addr_of_Gdi32 resd 1

  347. _addr_of_GetProcAddress        resd 1
  348. _addr_of_LoadLibraryA resd 1
  349. _addr_of_ExitProcess resd 1

  350. _imp_from_user32:
  351. _addr_of_LoadCursor resd 1
  352. _addr_of_RegisterClassEx resd 1
  353. _addr_of_CreateWindowExA resd 1
  354. _addr_of_CreateWindowExW resd 1
  355. _addr_of_SetWindowText resd 1
  356. _addr_of_PostQuitMessage resd 1
  357. _addr_of_ShowWindow resd 1
  358. _addr_of_UpdateWindow resd 1
  359. _addr_of_GetMessage resd 1
  360. _addr_of_PostMessage resd 1
  361. _addr_of_TranslateMessage resd 1
  362. _addr_of_DispatchMessage resd 1
  363. _addr_of_DefWindowProc resd 1

  364. _imp_from_ole32:
  365. _addr_of_CoCreateGuid resd 1
  366. _addr_of_StringFromGUID2 resd 1

  367. _imp_from_gdi32:
  368. _addr_of_GetStockObject resd 1

  369. _BinGUID                resd 4
  370. _StringGUID                resw 40
  371. _ClassName                resw 40        ;窗口类名(直接用GUID来取)
  372. _hWnd                        resd 1
  373. _hWnd_TextBox        resd 1
  374. _hWnd_Button        resd 1

  375. _DefFont resd 1 ;默认字体

  376. _WCEx:                        ;WNDCLASSEX结构
  377. .cbSize                        resd 1
  378. .style                        resd 1
  379. .lpfnWndProc        resd 1
  380. .cbClsExtra                resd 1
  381. .cbWndExtra                resd 1
  382. .hInstance                resd 1
  383. .hIcon                        resd 1
  384. .hCursor                resd 1
  385. .hbrBackground        resd 1
  386. .lpszMenuName        resd 1
  387. .lpszClassName        resd 1
  388. .hIconSm                resd 1

  389. _msg:
  390. .hwnd                        resd 1
  391. .message                resd 1
  392. .wParam                        resd 1
  393. .lParam                        resd 1
  394. .time                        resd 1
  395. .ptx                        resd 1
  396. .pty                        resd 1
复制代码
回复 赞! 1 靠! 0

使用道具 举报

发表于 2018-11-16 07:00:15 | 显示全部楼层
你可以把“标识符”理解为“名字”,把“生成标识符”理解为“起名字”。

我造了个com类我应该叫它什么呢?起个GUID吧。有个用户注册了新账号我应该怎么代表这个用户呢?用GUID吧。我生产了一万台设备,它和服务器交互的时候,服务器怎么分出谁是谁呢?用GUID作为机器码吧。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-16 11:05:59 | 显示全部楼层
0xAA55 发表于 2018-11-16 07:00
你可以把“标识符”理解为“名字”,把“生成标识符”理解为“起名字”。

我造了个com类我应该叫它什么呢 ...

感谢站长鼓励和指导,小弟我get到啦
回复 赞! 靠!

使用道具 举报

发表于 2018-11-18 11:34:58 | 显示全部楼层
挺想说的是,Visual Studio一直是自带GUID生成器的,而且还可以辅助格式化。
Capture.JPG
Capture.JPG
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-18 18:34:48 | 显示全部楼层
tangptr@126.com 发表于 2018-11-18 11:34
挺想说的是,Visual Studio一直是自带GUID生成器的,而且还可以辅助格式化。

...

啊,果然是啊,谢谢tangptr大佬指导
2.jpg
1.jpg
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-19 12:07:08 | 显示全部楼层
0xAA55 发表于 2018-11-19 08:29
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器 ...

站长好贴心把build.bat和nasm.exe都给了出来,移到当前目录双击bat就出来了EXE真的方便。
NASM写的程序很规矩,小弟我看了好像是站长没有写资源文件,把控件的一些特性(例如资源ID直接写成了数值)。还有就是站长一开始强调的不依赖任何lib,自己找出kernel32.dll的地址,然后只加载这个程序所需要的dll和各种导出函数来使用,我刚刚自己又把我的程序去掉图片编译了一下,发现我的大小是3.00KB(3,072字节),而站长的是2.00KB(2,048字节)。看来是站长的手动找kernel32.dll地址然后后面自己找函数起了作用。orz
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-19 12:10:30 | 显示全部楼层
0xAA55 发表于 2018-11-19 08:29
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器 ...

小弟我还得再仔细研读一下程序,看看这个手动找到kernel32.dll和里面函数的
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-11-19 16:06:30 | 显示全部楼层
0xAA55 发表于 2018-11-19 12:15
其实不是……而是我把.rdata段的内容合并到.text段了(虽然这样做并不好)少了一个段,就少了一个必须要 ...

:-O,有道理
回复 赞! 靠!

使用道具 举报

发表于 2018-11-20 18:06:36 | 显示全部楼层
没钱好痛苦啊啊啊啊
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 16:14 , Processed in 0.044175 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表