IrfanView 序號產生器分析(初級版) (13千字)

看雪資料發表於2015-11-15

初學解密,很想做一個 KeyGen,這是低階菜鳥向高階菜鳥升級的必經之路。於是駕貓尋得一看圖軟體
IfanView 效果不錯,功能強大,可和 ACDSee 相媲美。這個軟體不需要註冊即可使用其全部功能,不過他
還是設定了註冊選項,註冊成功後,在關於對話方塊中就有你的大名了。正好那他開刀。拿寶刀 Trw2000 。
下 bpx hmemcpy,截下後 bc *,再 pmodule,這時已得到輸入的名字,F10 跟下去,又得到輸入的假註冊
碼(d eax 看看,裡面放著輸入資料的長度)。再跟下去領空會進入系統核心,下 pmodule 跳出來,往下
走來到一個迴圈,別管它,用 g 命令跳過去,接下來就是本文的正題了:(順便提一下,姓名必須大於 2
各字元且小於 85 個字元。仔細看就會發現)
..................................
0167:0044FC1E  LEA      ECX,[ESP+11D0]----放入你輸入的假註冊碼
0167:0044FC25  LEA      EDX,[ESP+10D0]----放入你輸入的名字
0167:0044FC2C  PUSH    ECX
0167:0044FC2D  PUSH    EDX
0167:0044FC2E  CALL    00435F40----應該有點感覺吧,真正的註冊碼就在裡面產生
                //這個CALL下面的內容我就省略了,應位於主題無關。
...................................
0167:00435F40  MOV      EAX,[ESP+08]----從上面的CALL跳過來的。開工哦^o^
0167:00435F44  SUB      ESP,BYTE +14
0167:00435F47  PUSH    EBX
0167:00435F48  PUSH    EBP
0167:00435F49  PUSH    ESI
0167:00435F4A  PUSH    EDI
0167:00435F4B  PUSH    EAX
0167:00435F4C  XOR      EBX,EBX
0167:00435F4E  CALL    004B0863----這個CALL可能有用,不過隨叫我們還是菜鳥,別管它,抓住關鍵最重要
0167:00435F53  MOV      ESI,[ESP+2C]
0167:00435F57  MOV      EBP,EAX
0167:00435F59  MOV      EDI,ESI
0167:00435F5B  OR      ECX,BYTE -01
0167:00435F5E  XOR      EAX,EAX
0167:00435F60  ADD      ESP,BYTE +04
0167:00435F63  XOR      EDX,EDX
0167:00435F65  REPNE SCASB
0167:00435F67  NOT      ECX
0167:00435F69  DEC      ECX
0167:00435F6A  TEST    ECX,ECX
0167:00435F6C  JNG      00435F85
0167:00435F6E  MOVSX    ECX,BYTE [EDX+ESI]----從這裡開始工作哦
0167:00435F72  ADD      EBX,ECX
0167:00435F74  MOV      EDI,ESI
0167:00435F76  OR      ECX,BYTE -01
0167:00435F79  XOR      EAX,EAX
0167:00435F7B  INC      EDX
0167:00435F7C  REPNE SCASB
0167:00435F7E  NOT      ECX
0167:00435F80  DEC      ECX
0167:00435F81  CMP      EDX,ECX----EDX放名字的長度
0167:00435F83  JL      00435F6E----將名字的各個ASCII碼相加後放入EBX
0167:00435F85  MOV      EAX,0104----以下各部生成密文
0167:00435F8A  PUSH    BYTE +0A
0167:00435F8C  SUB      EAX,EBX
0167:00435F8E  CDQ   
0167:00435F8F  XOR      EAX,EDX
0167:00435F91  SUB      EAX,EDX
0167:00435F93  ADD      EAX,014C
0167:00435F98  LEA      EDX,[EAX*8+00]
0167:00435F9F  SUB      EDX,EAX
0167:00435FA1  LEA      ECX,[EAX+EDX*4]
0167:00435FA4  LEA      EDX,[ESP+14]
0167:00435FA8  PUSH    EDX
0167:00435FA9  LEA      ESI,[EAX+ECX*2]
0167:00435FAC  SHL      ESI,03
0167:00435FAF  PUSH    ESI----到此為止輸入? esi後看到的十進位制數即為密文
0167:00435FB0  CALL    004BB8D4----處理密文的有效性,並且將十進位制密文轉換為ASCII碼
0167:00435FB5  ADD      ESP,BYTE +0C
0167:00435FB8  CMP      ESI,000F423F----檢視十進位制的密文是否大於999999按它的演算法大於999999的
                    //可能性不大。不過我還是寫了C原始碼。你可以忽略不管。
0167:00435FBE  JA      NEAR 004360B3----大就跳,一般是小
0167:00435FC4  MOV      CL,[ESP+14]----開始進行密文資料的移位,大致順序是:(第一位記為0)
                    //第4位到第6位,第5位到第8位,第3位到第5位,
                    //第2位到第3位,第1位到第2位
0167:00435FC8  MOV      AL,[ESP+15]
0167:00435FCC  MOV      DL,[ESP+13]
0167:00435FD0  MOV      [ESP+16],CL
0167:00435FD4  MOV      CL,[ESP+11]
0167:00435FD8  MOV      [ESP+18],AL
0167:00435FDC  MOV      AL,[ESP+12]
0167:00435FE0  MOV      [ESP+15],DL
0167:00435FE4  MOV      [ESP+12],CL
0167:00435FE8  MOV      ECX,[ESP+14]
0167:00435FEC  AND      ECX,FF----和上面的一句加起來其實就是一句MOV CL,[ESP+14]。這樣的語句後面還
                    //有,要注意哦。
0167:00435FF2  MOV      [ESP+13],AL-------資料移位結束,多看看就明白了^_^
0167:00435FF6  MOV      EAX,ECX----ECX裡放的是第4位,不瞭解就再仔細看看上面的資料移位方法
0167:00435FF8  SHL      EAX,05----接下來是一大堆無聊的操作,大家都是菜鳥,每句用C語言表示就可以了
0167:00435FFB  SUB      EAX,ECX
0167:00435FFD  MOV      ECX,[ESP+18]
0167:00436001  AND      ECX,FF
0167:00436007  LEA      EDX,[EAX+EAX*2]----無聊,不就是EAX*3嗎!_^
0167:0043600A  LEA      EAX,[ECX+ECX*4]
0167:0043600D  SHL      EAX,03
0167:00436010  SUB      EAX,ECX
0167:00436012  SUB      EAX,EDX
0167:00436014  CDQ            ----把EAX的符號擴充套件到EDX中去(若EAX為負,則EDX為-1,否則為0)後面
                //也有這樣的語句
0167:00436015  MOV      ECX,EAX
0167:00436017  XOR      ECX,EDX
0167:00436019  SUB      ECX,EDX
0167:0043601B  LEA      EAX,[ECX+ECX*4]又來了,寫成C語言的時候可別範傻
0167:0043601E  SHL      EAX,03
0167:00436021  SUB      EAX,ECX
0167:00436023  MOV      ECX,09
0167:00436028  CDQ   
0167:00436029  IDIV    ECX
0167:0043602B  MOV      EAX,[ESP+13]
0167:0043602F  AND      EAX,FF
0167:00436034  ADD      DL,30
0167:00436037  MOV      [ESP+17],DL
0167:0043603B  LEA      EDX,[EAX+EAX*2]
0167:0043603E  SHL      EDX,04
0167:00436041  SUB      EDX,EAX
0167:00436043  MOV      EAX,[ESP+15]
0167:00436047  AND      EAX,FF
0167:0043604C  LEA      ECX,[EAX+EAX*8]
0167:0043604F  LEA      EAX,[EAX+ECX*4]
0167:00436052  LEA      EAX,[EDX+EAX*2]
0167:00436055  CDQ   
0167:00436056  XOR      EAX,EDX
0167:00436058  SUB      EAX,EDX
0167:0043605A  LEA      ECX,[EAX+EAX*8]
0167:0043605D  LEA      EAX,[EAX+ECX*4]
0167:00436060  MOV      ECX,09
0167:00436065  SHL      EAX,1
0167:00436067  CDQ   
0167:00436068  IDIV    ECX
0167:0043606A  MOV      ECX,[ESP+10]
0167:0043606E  AND      ECX,FF
0167:00436074  LEA      EAX,[ECX+ECX*2]
0167:00436077  LEA      EAX,[EAX+EAX*8]
0167:0043607A  SHL      EAX,1
0167:0043607C  SUB      EAX,ECX
0167:0043607E  ADD      DL,30
0167:00436081  MOV      [ESP+14],DL
0167:00436085  MOV      ECX,[ESP+11]
0167:00436089  AND      ECX,FF
0167:0043608F  LEA      EDX,[ECX*8+00]
0167:00436096  SUB      EDX,ECX
0167:00436098  LEA      EDX,[EDX+EDX*4]
0167:0043609B  SUB      EAX,EDX
0167:0043609D  CDQ   
0167:0043609E  MOV      ECX,EAX
0167:004360A0  XOR      ECX,EDX
0167:004360A2  SUB      ECX,EDX
0167:004360A4  LEA      EAX,[ECX+ECX*2]
0167:004360A7  LEA      EAX,[EAX+EAX*8]
0167:004360AA  SHL      EAX,1
0167:004360AC  SUB      EAX,ECX----慢慢長路。吾等菜鳥,就把上面的彙編語句
                //一句一句翻成C語句吧!!!_!
0167:004360AE  JMP      004361A8----跳過去檢測生成的註冊碼的正確性
0167:004360B3  MOV      AL,[ESP+15]----密文大於999999時的處理方法,和前面的有些相識
0167:004360B7  MOV      DL,[ESP+16]
0167:004360BB  MOV      CL,[ESP+14]
0167:004360BF  MOV      [ESP+16],AL
0167:004360C3  MOV      AL,[ESP+11]
0167:004360C7  MOV      [ESP+18],DL
0167:004360CB  MOV      DL,[ESP+12]
0167:004360CF  MOV      [ESP+12],AL
0167:004360D3  MOV      EAX,[ESP+16]
0167:004360D7  MOV      [ESP+15],CL
0167:004360DB  AND      EAX,FF
0167:004360E0  MOV      [ESP+13],DL
0167:004360E4  MOV      ECX,EAX
0167:004360E6  SHL      ECX,06
0167:004360E9  SUB      ECX,EAX
0167:004360EB  MOV      EAX,[ESP+18]
0167:004360EF  AND      EAX,FF
0167:004360F4  LEA      EAX,[EAX+EAX*8]
0167:004360F7  SHL      EAX,02
0167:004360FA  SUB      EAX,ECX
0167:004360FC  MOV      ECX,09
0167:00436101  CDQ   
0167:00436102  XOR      EAX,EDX
0167:00436104  SUB      EAX,EDX
0167:00436106  LEA      EAX,[EAX+EAX*8]
0167:00436109  SHL      EAX,02
0167:0043610C  CDQ   
0167:0043610D  IDIV    ECX
0167:0043610F  ADD      DL,30
0167:00436112  MOV      [ESP+17],DL
0167:00436116  MOV      EAX,[ESP+14]
0167:0043611A  AND      EAX,FF
0167:0043611F  ADD      EAX,BYTE +20
0167:00436122  LEA      EDX,[EAX*8+00]
0167:00436129  SUB      EDX,EAX
0167:0043612B  LEA      EAX,[EAX+EDX*4]
0167:0043612E  LEA      ECX,[EAX+EAX*2]
0167:00436131  MOV      EAX,[ESP+13]
0167:00436135  AND      EAX,FF
0167:0043613A  LEA      EDX,[EAX+EAX*4]
0167:0043613D  SHL      EDX,03
0167:00436140  SUB      EDX,EAX
0167:00436142  LEA      EAX,[ECX+EDX*2]
0167:00436145  CDQ   
0167:00436146  XOR      EAX,EDX
0167:00436148  SUB      EAX,EDX
0167:0043614A  LEA      ECX,[EAX*8+00]
0167:00436151  SUB      ECX,EAX
0167:00436153  LEA      EAX,[EAX+ECX*4]
0167:00436156  MOV      ECX,09
0167:0043615B  LEA      EAX,[EAX+EAX*2]
0167:0043615E  CDQ   
0167:0043615F  IDIV    ECX
0167:00436161  MOV      EAX,[ESP+10]
0167:00436165  AND      EAX,FF
0167:0043616A  ADD      DL,30
0167:0043616D  MOV      [ESP+14],DL
0167:00436171  LEA      EDX,[EAX*8+00]
0167:00436178  SUB      EDX,EAX
0167:0043617A  LEA      EAX,[EAX+EDX*4]
0167:0043617D  MOV      EDX,[ESP+11]
0167:00436181  AND      EDX,FF
0167:00436187  MOV      ECX,EDX
0167:00436189  SHL      ECX,04
0167:0043618C  ADD      ECX,EDX
0167:0043618E  SHL      EAX,1
0167:00436190  LEA      ECX,[ECX+ECX*4]
0167:00436193  SUB      EAX,ECX
0167:00436195  CDQ   
0167:00436196  XOR      EAX,EDX
0167:00436198  SUB      EAX,EDX
0167:0043619A  LEA      EDX,[EAX*8+00]
0167:004361A1  SUB      EDX,EAX
0167:004361A3  LEA      EAX,[EAX+EDX*4]
0167:004361A6  SHL      EAX,1
0167:004361A8  CDQ            ---上面的正確性檢測跳轉語句跳過來的。這裡也是一條語句別忘哦!
0167:004361A9  MOV      ECX,09
0167:004361AE  MOV      BYTE [ESP+19],00----加上字串結尾符'\0',這裡可知註冊碼必為10位
0167:004361B3  IDIV    ECX
0167:004361B5  ADD      DL,30
0167:004361B8  MOV      [ESP+11],DL
0167:004361BC  LEA      EDX,[ESP+10]
0167:004361C0  PUSH    EDX----一般來說到這裡就能找到正確的註冊碼了,打d esp+10看看
0167:004361C1  CALL    004B0863----這裡開始對生成的註冊碼進行正確性檢測。不過用處不大,不需要
                //為他編寫源程式,通常都能校驗透過(隨叫我是菜鳥,只要把問題大
                //致解決就可以了,想要進一步瞭解的話,自己進去就是了吧)
0167:004361C6  ADD      ESP,BYTE


宣告:該文觀點僅代表作者本人,轉載請註明來自看雪專欄
最新評論 (0)
登入後即可評論

相關文章