首页
社区
课程
招聘
[旧帖] [原创]用MASM32的Pre-Built Dialog给PE文件增加密码登陆框 0.00雪花
2008-5-1 09:53 16052

[旧帖] [原创]用MASM32的Pre-Built Dialog给PE文件增加密码登陆框 0.00雪花

2008-5-1 09:53
16052
【文章标题】: 用MASM32的Pre-Built Dialog给PE文件增加密码登陆框
【文章作者】: stalker
【作者邮箱】: superstalker@163.com
【编写语言】: 汇编语言
【使用工具】: MASM32 v9.0
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  在MASM32的Library Reference中可以找到Pre-Built Dialogs,里面有一个函数为GetTextInput,说明如下
  GetTextInput proc hParent   :DWORD,Instance :DWORD,
                    Icon      :DWORD,caption  :DWORD,
                    subcaption:DWORD,lpbuffer :DWORD
  
  Description
  The GetTextInput dialog is used to obtain text from the user. It has the option to display an additional text field above the edit control where the user enters the text.
  
  Parameters
  1.  Parent  The handle of the windows that calls the dialog box.
  
  2.  Instance  The instance handle for the application.
  
  3.  Icon  The handle of the application's icon.
  
  4. caption  A zero terminated string that contains the text to display on the title bar of the dialog.
  
  5. subcaption  A zero terminated string that contains the text to display in the addition field above the edit conrol.
  
  6. lpbuffer  The address of the buffer that will receive the text entered by the user. This buffer should be at least 128 bytes in length.
  
  Return Value
  The return value in EAX is always zero.
  
  Comments
  To test if the user has entered text, the first byte of the buffer should be tested for zero. If the value is not zero, the buffer contains the text typed by the user.
  
  在论坛里面看过几篇给PE文件增加启动消息框和Splash Screen的文章,里面有提到用DLL来给PE文件增加功能比较简单,所以今天
  我们也用DLL来实现给程序添加密码登陆框。
  
  首先来编写DLL,DLL源文件的主结构如下
  LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
  
      .if reason == DLL_PROCESS_ATTACH
        push instance
        pop hInstance
        mov eax, TRUE
  
      .elseif reason == DLL_PROCESS_DETACH
  
      .elseif reason == DLL_THREAD_ATTACH
  
      .elseif reason == DLL_THREAD_DETACH
  
      .endif
  
      ret
  
  LibMain endp
  其中DLL_PROCESS_ATTACH分支里的代码就是当DLL被加载时执行的代码,后面三个分支通过名字就应该很好理解了吧
  我们就把验证密码的代码写在DLL_PROCESS_ATTACH分支里面
  
  验证的流程很简单
  首先调用GetTextInput获取用户输入,然后验证用户输入是否为预置密码,如果密码正确,则返回PE文件继续执行下面的代码,
  如果不正确,直接调用ExitProcess退出进程
  
  整个DLL的源代码如下:
  ;by stalker

        .486                     
        .model flat, stdcall      
        option casemap :none      
  
        include \masm32\include\windows.inc
        include \masm32\include\masm32.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
   
  
        includelib \masm32\lib\masm32.lib
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
  
  
  
  
        .data?
          hInstance dd ?
          szInput db 128 dup(?)
        .data
          szLoginCode db "opensesame",0
          szCaption db "登陆",0
          szSubCaption db "请输入密码",0
        .code
  

  
  LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
  
      .if reason == DLL_PROCESS_ATTACH
        invoke GetTextInput,0,0,0,offset szCaption,offset szSubCaption,offset szInput
        invoke szCmp,offset szLoginCode,offset szInput;szCmp也是masm32中的函数,自己实现这个函数也可以,就是比较两个字符串是否相同
        or eax,eax
        jz @f
        push instance
        pop hInstance
        mov eax, TRUE
        ret
        @@:
        invoke ExitProcess,NULL
      .elseif reason == DLL_PROCESS_DETACH
  
      .elseif reason == DLL_THREAD_ATTACH
  
      .elseif reason == DLL_THREAD_DETACH
  
      .endif
  
      ret
  
  LibMain endp
  

  
  end LibMain
  
  DLL编译好了,如何让一个exe文件加载它呢,可以使用工具如LoadPE等(如果要使用工具添加的话,好象至少要在def文件中输出
  一个函数)
  我们就用手工的方法来添加吧,以系统自带的calc.exe为例,首先我们用TOPO给它增加一点空间,并改写它的入口地址
  然后用OD载入,写入如下代码
  0101E60A >  6A 6C           push    6C
  0101E60C    68 6E2E646C     push    6C642E6E
  0101E611    68 4C6F6769     push    69676F4C;压入的是"Login.dll"的ASCII码
  0101E616    54              push    esp
  0101E617    FF15 24100001   call    dword ptr [<&KERNEL32.LoadLibrar>; kernel32.LoadLibraryA
  0101E61D    83C4 0C         add     esp, 0C;调整好堆栈
  
  然后复制到可执行文件,保存,运行之,出现了登陆密码框,大功告成!
  
  由于我还没有权限上传附件,所以请dll的源码和def文件,还有修改后的calc.exe,请大家在下面这个地址下载
http://rapidshare.de/files/39278383/login.rar.html

谢谢版主加精,现在有权限了,把附件传上来
login.rar
  
--------------------------------------------------------------------------------
【经验总结】
  这只是一个很简单的例子,密码是明文保存的,大家可以继续拓展,可以先把密码加密,然后获取用户输入,进行同样的加
  密之后再进行比较等等。
  另外,我本来是想再写一个程序直接往PE文件中注入用OD写入的那几句代码的,无奈功底尚浅,暂时还无法做到。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年05月01日 9:43:57

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (21)
雪    币: 2576
活跃值: (447)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
wyfe 2008-5-1 09:56
2
0
有明码出现不安全。学习RAR思路,有效地防止直接破解,只能穷举。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是瑶瑶 2008-5-1 09:58
3
0
LZ写的不错,这个方法是否也适用于VC呢?用VC编译一个DLL可以吗?
还有,TOPO貌似给带壳程序加字节是不行的?
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-1 10:10
4
0
VC写的DLL当然可以拉,貌似只有Delphi写的DLL兼容性不好。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是瑶瑶 2008-5-1 10:25
5
0
学习了,下次有空用C写个试试
刚才试了下,用TOPO给带壳程序加字节后程序就不能运行了,可以想个办法再优化下
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-1 10:28
6
0
带壳的先脱掉壳应该就可以了
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-1 23:37
7
0
jz @f 是什么意思?
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 09:27
8
0
jz @f
表示ZF标志为1的时候,就跳转到下一个@@:标号,@b则表示到上一个@@:标号
雪    币: 381
活跃值: (125)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
HSQ 8 2008-5-2 10:17
9
0
个人觉得这样实现太简单,至少也得自己在PE增加代码,无需手动修改比较好!网上可以搜到
这种类型的例子,好像是罗聪写过的
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 11:30
10
0
感谢HSQ的建议,开始我也是这么想的,但是对PE文件还不够熟悉,等我学习完之后再来尝试
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 22:41
11
0
我查了半天都没发现,楼主是不是搞错了
上传的附件:
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 22:51
12
0
[QUOTE=aoanzhishu;448680]我查了半天都没发现,楼主是不是搞错了
[/QUOTE]

汗!把你完整的代码发上来看看
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 22:55
13
0
.486
.model flat,stdcall
option casemap :none

include D:\masm32\include\windows.inc
include D:\masm32\include\masm32.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc

includelib D:\masm32\lib\masm32.lib
includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib

.data?
   hInstance      dd   ?
   szInput        db   128 dup(?)

.data
   szLoginCode    db   "",0
   szCaption      db   "登陆",0
   szSubCaption   db   "请您输入密码",0
   
.code

LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
   
     .if   reason == DLL_PROCESS_ATTACH
          invoke  GetTextInput,0,0,0,offset szCaption,offset szSubCaption,offset szInput
          invoke  szCmp,offset szLoginCode,offset szInput
          or      eax,eax
          jz      
          push    instance
          pop     hInstance
          mov     eax,TRUE
          ret
         
          invoke  ExitProcess,NULL
         
     .elseif      reason == DLL_PROCESS_DETACH
     
     .elseif      reason == DLL_THREAD_ATTACH
     
     .elseif      reason == DLL_THREAD_DETACH
     
     .endif
     
     ret
     
LibMain endp

end LibMain
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 22:58
14
0
我这里只报了一个错误
就是jz后面没有标号
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 23:00
15
0
szCmp 在哪个inc 文件里
上传的附件:
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 23:01
16
0
masm32.inc啊
都说是masm32自带的了
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 23:04
17
0
也许我的版本没有,你能不能传给我,谢谢你了
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 23:06
18
0
不会吧,你都include了
包含的时候如果没有这个文件的话编译器会报错,而我看到你的并没有报错
对了,你的masm32是装在d:的吗?怎么你include的时候使用绝对路径?
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 23:10
19
0
是装在D盘的,我刚在我的masm32.inc 文件没有找到szCmp的定义啊
上传的附件:
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 23:14
20
0
szCmp       PROTO :DWORD,:DWORD
不会哟,我能找到,你是哪个版本的,我用的v9.0,在文章使用工具那里就说了
以前我用v8.0的时候也使用过这个函数
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2008-5-2 23:15
21
0
我知道了,我的是6.14
一时粗心,没看版本,谢谢你啦
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-5-2 23:22
22
0
不用谢,不过你的版本还真够老的

我也有责任,你开始提供的截图就有显示版本了,我只关心错误提示去了
游客
登录 | 注册 方可回帖
返回