【文章标题】: 公务员之路5.1题库解密
【文章作者】: 松松
【作者邮箱】: dongmenbianxue@163.com
【作者QQ号】: 4752017
【软件名称】: 公务员之路
【软件大小】: 没记
【下载地址】: 自己搜索下载
【加壳方式】: aspack
【编写语言】: delphi5
【使用工具】: OD
【操作平台】: win2K
【软件介绍】: 公务员考试专用训练软件全国通用版《公务员之路》
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
该程序的题库保存在sysdat\data0下。dat文件其实是mdb,所有题目,答案都是加过密的。现在我们的目标就是解开题库。
  1。查壳。PEID查出是aspack,简单壳,用工具就可以脱。
  2。该软件是用delphi5编写的,用DEDE反编。
  3。经过跟踪,关键CALL是00557634。
  00557634  /$  55            PUSH EBP
  00557635  |.  8BEC          MOV EBP,ESP
  00557637  |.  6A 00         PUSH 0
  00557639  |.  53            PUSH EBX
  0055763A  |.  56            PUSH ESI
  0055763B  |.  57            PUSH EDI
  0055763C  |.  8BF1          MOV ESI,ECX
  0055763E  |.  8BFA          MOV EDI,EDX
  00557640  |.  8BD8          MOV EBX,EAX
  00557642  |.  33C0          XOR EAX,EAX
  00557644  |.  55            PUSH EBP
  00557645  |.  68 F6765500   PUSH _公务员?005576F6
  0055764A  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  0055764D  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  00557650  |.  8D4D FC       LEA ECX,DWORD PTR SS:[EBP-4]
  00557653  |.  8BD7          MOV EDX,EDI
  00557655  |.  8BC3          MOV EAX,EBX
  00557657  |.  E8 00FFFFFF   CALL _公务员?0055755C  ***这个CALL 处理字符串。两个并成一个
  0055765C  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  0055765F  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
  00557662  |.  E8 61C8EAFF   CALL _公务员?00403EC8
  00557667  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0055766A  |.  E8 85CAEAFF   CALL _公务员?004040F4   ***取出长度
  0055766F  |.  8BF8          MOV EDI,EAX
  00557671  |.  85FF          TEST EDI,EDI
  00557673  |.  7E 6B         JLE SHORT _公务员?005576E0
  00557675  |.  BB 01000000   MOV EBX,1
  0055767A  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]   ***这里开始解密
  0055767D  |.  8A4418 FF     |MOV AL,BYTE PTR DS:[EAX+EBX-1]  
  00557681  |.  0FB7D6        |MOVZX EDX,SI                  ***SI初始值为$3039
  00557684  |.  C1EA 08       |SHR EDX,8                     
  00557687  |.  32C2          |XOR AL,DL
  00557689  |.  84C0          |TEST AL,AL
  0055768B  |.  75 1F         |JNZ SHORT _公务员?005576AC
  0055768D  |.  8B45 08       |MOV EAX,DWORD PTR SS:[EBP+8]
  00557690  |.  E8 2FCCEAFF   |CALL _公务员?004042C4
  00557695  |.  8B55 FC       |MOV EDX,DWORD PTR SS:[EBP-4]
  00557698  |.  8A541A FF     |MOV DL,BYTE PTR DS:[EDX+EBX-1]
  0055769C  |.  885418 FF     |MOV BYTE PTR DS:[EAX+EBX-1],DL
  005576A0  |.  66:6BC6 0B    |IMUL AX,SI,0B
  005576A4  |.  66:83C0 0C    |ADD AX,0C
  005576A8  |.  8BF0          |MOV ESI,EAX
  005576AA  |.  EB 30         |JMP SHORT _公务员?005576DC
  005576AC  |>  8B45 08       |MOV EAX,DWORD PTR SS:[EBP+8]
  005576AF  |.  E8 10CCEAFF   |CALL _公务员?004042C4
  005576B4  |.  8B55 FC       |MOV EDX,DWORD PTR SS:[EBP-4]
  005576B7  |.  8A541A FF     |MOV DL,BYTE PTR DS:[EDX+EBX-1]
  005576BB  |.  0FB7CE        |MOVZX ECX,SI
  005576BE  |.  C1E9 08       |SHR ECX,8
  005576C1  |.  32D1          |XOR DL,CL
  005576C3  |.  885418 FF     |MOV BYTE PTR DS:[EAX+EBX-1],DL    ***解出的放入内存
  005576C7  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  005576CA  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
  005576CF  |.  66:03F0       |ADD SI,AX
  005576D2  |.  66:6BC6 0B    |IMUL AX,SI,0B
  005576D6  |.  66:83C0 0C    |ADD AX,0C
  005576DA  |.  8BF0          |MOV ESI,EAX
  005576DC  |>  43            |INC EBX
  005576DD  |.  4F            |DEC EDI
  005576DE  |.^ 75 9A         \JNZ SHORT _公务员?0055767A
  005576E0  |>  33C0          XOR EAX,EAX
  005576E2  |.  5A            POP EDX
  005576E3  |.  59            POP ECX
  005576E4  |.  59            POP ECX
  005576E5  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
  005576E8  |.  68 FD765500   PUSH _公务员?005576FD
  005576ED  |>  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
  005576F0  |.  E8 7FC7EAFF   CALL _公务员?00403E74
  005576F5  \.  C3            RETN
  005576F6   .^ E9 19C1EAFF   JMP _公务员?00403814
  005576FB   .^ EB F0         JMP SHORT _公务员?005576ED
  005576FD   .  5F            POP EDI
  005576FE   .  5E            POP ESI
  005576FF   .  5B            POP EBX
  00557700   .  59            POP ECX
  00557701   .  5D            POP EBP
  00557702   .  C2 0400       RETN 4
  
  解密算法很简单。下面给出delphi的代码,根据汇编直接写出,所以不太美观,效率也不是很好。但是可以正确解密。
  
  function TForm1.decrypt(str: string): string;
  var
    i: integer;
    j, tt, tt2: word;
    tmp: string;
    tmpword: array of word;
  
  begin
    tt2 := $3039;
    setlength(tmpword, length(str) div 2);
    for i := 0 to length(tmpword) - 1 do
    begin
      tmpword[i] := strtoint('$' + str[i * 2 + 1] + str[i * 2 + 2]);
    end;
    for i := 0 to length(tmpword) - 1 do
    begin
      tt := tt2;
      tt := tt shr 8;
      j := tmpword[i] xor tt;
      if j > 0 then
      begin
        tmp := tmp + char(j);
        tt := tt2 + tmpword[i];
        j := tt * $0B;
        j := j + $0C;
        tt2 := j;
      end
      else
      begin
        j := tmpword[i];
        tmp := tmp+char(j);
        j := tt2 * $0B;
        j := j + $0C;
        tt2 := j;
      end;
  
    end;
  
    result := tmp;
  end;
  
  有了算法,论坛里的某位老兄,可以写一个程序,直接把题库导出了。祝考试成功。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年06月02日 11:41:53