鍵盤記錄2003演算法分析
鍵盤記錄2003演算法分析
目標:鍵盤記錄2003
作者:LFTBirthday
型別:明碼比較,無殼。
工具:olly
0041F87B E8 D4DF0100
CALL <JMP.&MFC42.#3098>
; 讀入第一個輸入框的姓名MFC42.#3098
0041F880 80BD 68FFFFFF 00 CMP BYTE PTR SS:[EBP-98],0
; [EBP-98]處存放FTBirthday,判斷是否為空
0041F887 75 18 JNZ SHORT FTBirthd.0041F8A1
; 不為空則繼續ORT
FT
0041F889 6A 40 PUSH 40
0041F88B 68 0CEE4000 PUSH FTBirthd.0040EE0C
;
ASCII "Attention!"
0041F890 68 F4ED4000 PUSH FTBirthd.0040EDF4
;
ASCII "Please enter your name!"
0041F895 8BCF MOV ECX,EDI
0041F897 E8 BEDF0100 CALL <JMP.&MFC42.#4224>
0041F89C E9 FA000000 JMP FTBirthd.0041F99B
0041F8A1 56 PUSH ESI
; ESI入棧ES
0041F8A2 6A 0A PUSH 0A
; 0A入棧 0
0041F8A4 5E POP ESI
; OA給ESI,ESI=0000000A
0041F8A5 8D45 E8 LEA EAX,DWORD PTR
SS:[EBP-18] ; 把[EBP-18]=0012E508的有效值(=記憶體地址)給EAX
0041F8A8 56 PUSH ESI
0041F8A9 50 PUSH EAX
0041F8AA 68 DAD60000 PUSH 0D6DA
0041F8AF 8BCF MOV ECX,EDI
0041F8B1 E8 9EDF0100 CALL <JMP.&MFC42.#3098>
;
讀入註冊碼第一部分,EAX為位數,12E508處存放註冊碼第一部分四位
0041F8B6 8D45 D0 LEA EAX,DWORD PTR
SS:[EBP-30] ; 把[EBP-30]=0012E4F0的有效值(=記憶體地址)給EAX
0041F8B9 56 PUSH ESI
0041F8BA 50 PUSH EAX
0041F8BB 68 DBD60000 PUSH 0D6DB
0041F8C0 8BCF MOV ECX,EDI
0041F8C2 E8 8DDF0100 CALL <JMP.&MFC42.#3098>
;
讀入註冊碼第二部分,EAX為位數,12E4F0處存放註冊碼第二部分四位
0041F8C7 8D45 DC LEA EAX,DWORD PTR
SS:[EBP-24] ; 把[EBP-24]=0012E4FC的有效值(=記憶體地址)給EAX
0041F8CA 56 PUSH ESI
0041F8CB 50 PUSH EAX
0041F8CC 68 DCD60000 PUSH 0D6DC
0041F8D1 8BCF MOV ECX,EDI
0041F8D3 E8 7CDF0100 CALL <JMP.&MFC42.#3098>
;
讀入註冊碼第三部分,EAX為位數,0012E4FC處存放註冊碼第三部分四位
0041F8D8 8D45 F4 LEA EAX,DWORD PTR
SS:[EBP-C] ; 把[EBP-C]=0012E514的有效值(=記憶體地址)給EAX
0041F8DB 56 PUSH ESI
0041F8DC 50 PUSH EAX
0041F8DD 68 DDD60000 PUSH 0D6DD
0041F8E2 8BCF MOV ECX,EDI
0041F8E4 E8 6BDF0100 CALL <JMP.&MFC42.#3098>
;
讀入註冊碼第四部分,EAX為位數,12E514處存放註冊碼第四部分四位
0041F8E9 8D45 E8 LEA EAX,DWORD PTR
SS:[EBP-18] ; EAX
0012E508 ASCII "1111"
0041F8EC 50 PUSH EAX
0041F8ED 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64] ; EAX
0012E4BC
0041F8F0 50 PUSH EAX
0041F8F1 FF15 40114000 CALL DWORD PTR DS:[<&KERNEL32.lstrcpyA>]
; kernel32.lstrcpyA
0041F8F7 8B35 48114000 MOV ESI,DWORD PTR DS:[<&KERNEL32.lstrcatA>]
; kernel32.lstrcatA
0041F8FD 8D45 D0 LEA EAX,DWORD PTR
SS:[EBP-30] ; EAX
0012E4F0 ASCII "2222"
0041F900 50 PUSH EAX
0041F901 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64] ; EAX
0012E4BC ASCII "1111"
0041F904 50 PUSH EAX
0041F905 FFD6 CALL ESI
; EAX 0012E4BC ASCII "11112222"
0041F907 8D45 DC LEA EAX,DWORD PTR
SS:[EBP-24] ; EAX
0012E4FC ASCII "3333"
0041F90A 50 PUSH EAX
0041F90B 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64] ; EAX
0012E4BC ASCII "11112222"
0041F90E 50 PUSH EAX
0041F90F FFD6 CALL ESI
; EAX 0012E4BC ASCII "111122223333"
0041F911 8D45 F4 LEA EAX,DWORD PTR
SS:[EBP-C] ; EAX
0012E514 ASCII "4444"
0041F914 50 PUSH EAX
0041F915 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64] ; EAX
0012E4BC ASCII "1111222233334444"
0041F918 50 PUSH EAX
0041F919 FFD6 CALL ESI
; EAX 0012E4BC ASCII "1111222233334444"
0041F91B 8D85 34FFFFFF LEA EAX,DWORD PTR SS:[EBP-CC]
; EAX 0012E454
0041F921 50 PUSH EAX
0041F922 8D85 68FFFFFF LEA EAX,DWORD PTR SS:[EBP-98]
; EAX 0012E488 ASCII "FTBirthday"
0041F928 68 00434000 PUSH FTBirthd.00404300
;
引數1 ASCII "_r <@~=nj/2[l5,^"
0041F92D 50 PUSH EAX
; 引數2,使用者名稱X
0041F92E E8 61FEFFFF CALL FTBirthd.0041F794
;
關鍵CALL,EAX 0012E454 ASCII "ANXKAKKKLLQPVRTR"
0041F933 83C4 0C ADD ESP,0C
0041F936 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64] ; EAX
0012E4BC ASCII "1111222233334444"
0041F939 50 PUSH EAX
0041F93A 8D85 34FFFFFF LEA EAX,DWORD PTR SS:[EBP-CC]
; EAX 0012E454 ASCII "ANXKAKKKLLQPVRTR"
0041F940 50 PUSH EAX
0041F941 FF15 20114000 CALL DWORD PTR DS:[<&KERNEL32.lstrcmpiA>]
; kernel32.lstrcmpiA
0041F947 5E POP ESI
0041F948 85C0 TEST EAX,EAX
; 將由使用者名稱處理得到的註冊碼和輸入的註冊碼比較
0041F94A 6A 40 PUSH 40
0041F94C 75 31 JNZ SHORT FTBirthd.0041F97F
0041F94E 68 E4ED4000 PUSH FTBirthd.0040EDE4
;
ASCII "Registration"
0041F953 68 A0ED4000 PUSH FTBirthd.0040EDA0
;
ASCII "Registration succeeded. Thank you for choosing Perfect Keylogger!"
0041F958 8BCF MOV ECX,EDI
0041F95A E8 FBDE0100 CALL <JMP.&MFC42.#4224>
0041F95F 8D85 68FFFFFF LEA EAX,DWORD PTR SS:[EBP-98]
0041F965 8D4F 64 LEA ECX,DWORD PTR
DS:[EDI+64]
0041F968 50 PUSH EAX
0041F969 E8 24DA0100 CALL <JMP.&MFC42.#860>
0041F96E 8D45 9C LEA EAX,DWORD PTR
SS:[EBP-64]
0041F971 8D4F 60 LEA ECX,DWORD PTR
DS:[EDI+60]
0041F974 50 PUSH EAX
0041F975 E8 18DA0100 CALL <JMP.&MFC42.#860>
0041F97A 6A 01 PUSH 1
0041F97C 58 POP EAX
0041F97D EB 1E JMP SHORT FTBirthd.0041F99D
0041F97F 68 8CED4000 PUSH FTBirthd.0040ED8C
;
ASCII "Registration error"
0041F984 68 38ED4000 PUSH FTBirthd.0040ED38
;
ASCII "Registration code or user name is invalid. Please check all fields
and try again!"
0041F989 8BCF MOV ECX,EDI
0041F98B E8 CADE0100 CALL <JMP.&MFC42.#4224>
0041F990 68 2C010000 PUSH 12C
0041F995 FF15 38114000 CALL DWORD PTR DS:[<&KERNEL32.Sleep>]
; kernel32.Sleep
0041F99B 33C0 XOR EAX,EAX
0041F99D 5F POP EDI
0041F99E C9 LEAVE
0041F99F C3 RETN
進入關鍵call看看
0041F795 8BEC MOV EBP,ESP
0041F797 51 PUSH ECX
0041F798 51 PUSH ECX
0041F799 53 PUSH EBX
0041F79A 56 PUSH ESI
0041F79B FF75 0C PUSH DWORD PTR SS:[EBP+C]
0041F79E 8B35 B4104000 MOV ESI,DWORD PTR DS:[<&KERNEL32>;
kernel32.lstrlenA
0041F7A4 FFD6 CALL ESI
; EAX 10註冊碼長度,EDX "_r <@~=nj/2[l5,^"
0041F7A6 FF75 08 PUSH DWORD PTR SS:[EBP+8]
0041F7A9 8BD8 MOV EBX,EAX
;
EBX=10
0041F7AB 895D FC MOV DWORD PTR SS:[EBP-4],EBX
0041F7AE FFD6 CALL ESI
; EAX A使用者名稱長度,EDX "FTBirthday"
0041F7B0 8BF0 MOV ESI,EAX
;
ESI=A
0041F7B2 85F6 TEST ESI,ESI
;
判斷使用者名稱是否為空ESI
0041F7B4 8975 F8 MOV DWORD PTR SS:[EBP-8],ESI
; [EBP-8]=0012E430=0A 00 00 00
0041F7B7 75 08 JNZ SHORT FTBirthd.0041F7C1
; 不為零則跳,為空OVER
0041F7B9 8B45 10 MOV EAX,DWORD PTR
SS:[EBP+10]
0041F7BC 8020 00 AND BYTE PTR DS:[EAX],0
0041F7BF EB 4E JMP SHORT FTBirthd.0041F80F
0041F7C1 57 PUSH EDI
; 一切正常,就到這裡
0041F7C2 8B7D 10 MOV EDI,DWORD PTR
SS:[EBP+10]
0041F7C5 FF75 0C PUSH DWORD PTR SS:[EBP+C]
0041F7C8 57 PUSH EDI
0041F7C9 FF15 40114000 CALL DWORD PTR DS:[<&KERNEL32.ls>;
把"_r <@~=nj/2[l5,^"複製到EAX
0041F7CF 3BF3 CMP ESI,EBX
;
判斷使用者名稱長度是否大於註冊碼
0041F7D1 8975 0C MOV DWORD PTR SS:[EBP+C],ESI
; [EBP+C]=0A
0041F7D4 7F 03 JG SHORT FTBirthd.0041F7D9
; 大於則跳HORT
0041F7D6 895D 0C MOV DWORD PTR SS:[EBP+C],EBX
; [EBP+C]=10
0041F7D9 33F6 XOR ESI,ESI
;
ESI清零
0041F7DB 3975 0C CMP DWORD PTR SS:[EBP+C],ESI
; 判斷有沒有輸入註冊碼
0041F7DE 7E 2C JLE SHORT FTBirthd.0041F80C
0041F7E0 8BC6 MOV EAX,ESI
;
演算法迴圈開始,EAX初值為0
0041F7E2 6A 19 PUSH 19
0041F7E4 99 CDQ
; EDX置零
0041F7E5 F77D FC IDIV DWORD PTR SS:[EBP-4]
; EAX idiv 註冊碼長度(EBP-4=10),商放入EAX,餘數放入EDX
0041F7E8 8BC6 MOV EAX,ESI
0041F7EA 5B POP EBX
0041F7EB 8D0C3A LEA ECX,DWORD PTR
DS:[EDX+EDI] ; 字串第[餘數+1]位開始給ECX
0041F7EE 99 CDQ
; EDX置零
0041F7EF F77D F8 IDIV DWORD PTR SS:[EBP-8]
; EAX idiv 使用者名稱長度(EBP-8=A),商放入EAX,餘數放入EDX
0041F7F2 8B45 08 MOV EAX,DWORD PTR
SS:[EBP+8] ; "FTBirthday"給EAXR
0041F7F5 0FB60402 MOVZX EAX,BYTE PTR DS:[EDX+EAX]
; 取使用者名稱的第[餘數+1]位
0041F7F9 0FB611 MOVZX EDX,BYTE PTR
DS:[ECX] ; 取ECX處字串的第一位
0041F7FC 33C2 XOR EAX,EDX
;
異或,結果放入EAX
0041F7FE 99 CDQ
; EDX置零
0041F7FF F7FB IDIV EBX
; 異或結果idiv19,商放入EAX,餘數放入EDX
0041F801 80C2 41 ADD DL,41
;
餘數+41
0041F804 46 INC ESI
; 迴圈指標加1
0041F805 3B75 0C CMP ESI,DWORD PTR
SS:[EBP+C] ; 比較迴圈是否結束,[EBP+C]=0012E444="10 00 00 00"
0041F808 8811 MOV BYTE PTR
DS:[ECX],DL ; DL即為註冊碼的下一位
0041F80A ^7C D4 JL SHORT FTBirthd.0041F7E0
; 小於則跳回繼續
0041F80C 8BC7 MOV EAX,EDI
;
結束後把最終結果放入EAX
0041F80E 5F POP EDI
0041F80F 5E POP ESI
0041F810 5B POP EBX
0041F811 C9 LEAVE
0041F812 C3 RETN
模擬演算法驗證
使用者名稱"FTBirthday"
即"46 54 42 69 72 74 68 64 61 79" =A[i]
字串"_r <@~=nj/2[l5,^" 即"5F 72 20 3C 40 7E 3D 6E 6A 2F 32
5B 31 35 2C 5E" =B[i]
初始ESI=0 EAX=0
註冊碼第一位={A[0 idiv A的餘數] xor B[0 idiv 10的餘數]}idiv 19的餘數+41
={A[0] xor B[0]}idiv 19的餘數+41
={46 xor 5F}idiv 19的餘數+41
=19 idiv 19的餘數+41=0+41=41="A"
註冊碼第二位={A[1 idiv A的餘數] xor B[1
idiv 10的餘數]}idiv 19的餘數+41
={A[1] xor B[1]}idiv 19的餘數+41
={54 xor 72}idiv 19的餘數+41
=26 idiv 19的餘數+41=D+41=4E="N"
註冊碼第三位={A[2 idiv A的餘數] xor B[2
idiv 10的餘數]}idiv 19的餘數+41
={A[2] xor B[2]}idiv 19的餘數+41
={42 xor 20}idiv 19的餘數+41
=62 idiv 19的餘數+41=17+41=58="X"
註冊碼第四位={A[3 idiv A的餘數] xor B[3
idiv 10的餘數]}idiv 19的餘數+41
={A[3] xor B[3]}idiv 19的餘數+41
={69 xor 3C}idiv 19的餘數+41
=55 idiv 19的餘數+41=A+41=4B="K"
………………
註冊碼第十一位={A[A idiv A的餘數] xor B[A
idiv 10的餘數]}idiv 19的餘數+41
={A[0] xor B[A]}idiv 19的餘數+41
={46 xor 32}idiv 19的餘數+41
=74 idiv 19的餘數+41=10+41=51="Q"
………………
註冊碼第十六位={A[F idiv A的餘數] xor B[F
idiv 10的餘數]}idiv 19的餘數+41
={A[5] xor B[F]}idiv 19的餘數+41
={74 xor 5E}idiv 19的餘數+41
=2A idiv 19的餘數+41=11+41=52="R"
所以示例註冊碼為
使用者名稱:"FTBirthday"
註冊碼:"ANXK-AKKK-LLQP-VRTR"
相關文章
- C#鍵盤記錄器2010-03-15C#
- 全鍵盤Vimium快捷鍵學習記錄2017-03-28
- linux下的鍵盤記錄2012-05-02Linux
- pcmedik V5.4.8.2003破解手記--演算法分析2003-05-10演算法
- Java中的鍵盤錄入2018-04-18Java
- 安卓日常開發記錄-鍵盤的相關處理方式2018-08-11安卓
- Swift自定義表情鍵盤+錄音2019-03-02Swift
- 怎麼禁用筆記本鍵盤 關閉筆記本自帶鍵盤方法2022-01-14筆記
- 如何禁用筆記本鍵盤 win10禁用筆記本自帶鍵盤2022-03-14筆記Win10
- Java鍵盤錄入的兩種方式2021-09-09Java
- 2.3用按鍵精靈錄製鍵盤與滑鼠操作2018-09-25
- 記錄 WSL 從 C 盤遷移至 D 盤2020-06-22
- 演算法學習之路|舊鍵盤打字2018-02-28演算法
- Android 軟鍵盤踩坑記2018-12-21Android
- 內部網盤phpdisk建立記錄2015-02-13PHP
- 鍵盤鎖住了fn和什麼鍵能解除 筆記本鍵盤鎖住了按什麼鍵恢復2022-04-15筆記
- 轉盤小程式首頁運營覆盤記錄2024-04-01
- 筆記本鍵盤全部失靈怎麼回事 筆記本鍵盤失靈原因及解決方法2021-11-17筆記
- 中華通訊錄演算法分析2015-11-15演算法
- POPMAN時常管家2003版--簡單演算法分析2015-11-15演算法
- 面試演算法題記錄2022-04-26面試演算法
- 鍵盤滑鼠工具CMDbarV2.3演算法淺析!2015-11-15演算法
- 筆記本鍵盤個別鍵失靈怎麼修復 筆記本自帶鍵盤失靈了的解決教程2022-11-02筆記
- Eclipse工具:常用快捷鍵記錄2019-04-07Eclipse
- OWASP Top 10關鍵點記錄2018-05-31
- 一鍵部署lamp指令碼記錄2017-11-27LAMP指令碼
- centerOs根目錄盤擴容筆記2024-09-13ROS筆記
- 移動端鍵盤遮擋頁面原理分析2018-01-26
- 又一款黑客資料線,能夠記錄鍵盤輸入甚至控制裝置2021-09-07黑客
- Windows 10 隱私控制更新 有望緩解對“ 內建鍵盤記錄器 ”的顧慮2018-03-08Windows
- win10系統筆記本如何鎖住鍵盤 win10鎖住筆記本鍵盤的方法2022-04-26Win10筆記
- 鍵盤事件2020-12-27事件
- 鍵盤操作2024-06-30
- 鍵盤亂鍵怎麼處理 電腦鍵盤按鍵錯亂2022-03-19
- oracle記錄累計演算法2014-02-11Oracle演算法
- 鍵盤怎麼退出fn模式 筆記本桌上型電腦械鍵盤怎麼關閉取消fn鍵2022-05-03模式筆記
- 華碩win10鍵盤燈怎麼開 關閉華碩筆記本鍵盤燈的方法2021-02-20Win10筆記
- 雷神鍵盤怎麼調節燈光模式 雷神筆記本鍵盤燈光怎麼調2022-07-11模式筆記