对话框程序的Pediy

在Vc编写的对话框程序中加入保存用户名的汇编码,有兴趣的同志可以加入保存密码的汇编码作为尝试。

1、主要断点
GetWindowTextA 找到用户名所在的位置,在最后程序要退出时加入跳转jmp 00401AE2  挑战到我们的程序。

MessageBoxA找弹出对话框所在的位置可以自行将弹出对话框去除

2、将输入的用户名保存到我的"c:\jyh.txt"文件中,此文件名称信息存入data数据段中,尽量在data段尾部以便确保程序启动后不会将我们的信息覆盖

3、CreateFileA,WriteFileA,CloseHandle3个函数定义如下,按照stdcall参数从右至左入栈,这3个函数的地址可以使用lordpe工具的pe editor查看,查看时选择kernel32.dll同时勾选View Always FirsThunk

4、使用od工具 Alt+M查看段地址及大小,找到text代码段地址的最后一段地址,可以看到为大量的00填充,将这些地址的代码改为如下代码,Call 函数地址时一定要写Call [402004]否则出错;或者也可以用lordpe工具查看text的大小,400000+1000+1AE2是代码段目前所占用的大小,可以在这个地址后面加入我们的代码

HANDLE CreateFile(     LPCTSTR lpFileName,     DWORD dwDesiredAccess,     DWORD dwShareMode,     LPSECURITY_ATTRIBUTES lpSecurityAttributes,     DWORD dwCreationDisposition,     DWORD dwFlagsAndAttributes,     HANDLE hTemplateFile   );   BOOL WriteFile(     HANDLE hFile,     LPCVOID lpBuffer,     DWORD nNumberOfBytesToWrite,     LPDWORD lpNumberOfBytesWritten,     LPOVERLAPPED lpOverlapped   );   BOOL CloseHandle(     HANDLE hObject   ); 

自己写的代码:
00401AE2   > \60                pushad
00401AE3   .  FF7424 20         push    dword ptr [esp+20]
00401AE7   .  FF7424 28         push    dword ptr [esp+28]
00401AEB   .  6A 00             push    0                                        ; /hTemplateFile = NULL
00401AED   .  68 80000000       push    80                                       ; |Attributes = NORMAL
00401AF2   .  6A 04             push    4                                        ; |Mode = OPEN_ALWAYS
00401AF4   .  6A 00             push    0                                        ; |pSecurity = NULL
00401AF6   .  6A 03             push    3                                        ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401AF8   .  68 000000C0       push    C0000000                                 ; |Access = GENERIC_READ|GENERIC_WRITE
00401AFD   .  68 FE314000       push    004031FE                                 ; |FileName = "c:\jyh.txt"
00401B02   .  FF15 04204000     call    dword ptr [<&KERNEL32.CreateFileA>]      ; \CreateFileA
00401B08   .  50                push    eax                                      ; /hObject
00401B09   .  8D4424 08         lea     eax, dword ptr [esp+8]                   ; |
00401B0D   .  6A 00             push    0                                        ; |/pOverlapped = NULL
00401B0F   .  50                push    eax                                      ; ||pBytesWritten
00401B10   .  FF7424 10         push    dword ptr [esp+10]                       ; ||nBytesToWrite
00401B14      8D4424 3C         lea     eax, dword ptr [esp+3C]
00401B18   .  50                push    eax                                      ; ||Buffer
00401B19   .  FF7424 10         push    dword ptr [esp+10]                       ; ||hFile
00401B1D   .  FF15 10204000     call    dword ptr [<&KERNEL32.WriteFile>]        ; |\WriteFile
00401B23   .  FF15 00204000     call    dword ptr [<&KERNEL32.CloseHandle>]      ; \CloseHandle
00401B29   .  83C4 08           add     esp, 8
00401B2C   .  61                popad
00401B2D   .  83C4 28           add     esp, 28
00401B30   .^ E9 D7FAFFFF       jmp     0040160C

 

5、上面的代码中,我们恢复堆栈后,add esp,28为原来程序的代码因为在上面没有地方写这段代码所以放到我们代码的最后写,最后跳转到jmp     0040160C源程序领空继续执行。

 原来程序:

00401607   .  83C4 28       add     esp, 28 //这一行改为jmp 00401AE2  并将add     esp, 28挪到我们编写的代码中执行,上面信息可参考。
0040160A   .  C3            retn

附:

相关资料程序及可执行文件可以到我的资源区下载:见我的资源区

PEDIY就是我们常说的代码二次开发,也就是在没有原码,没有接口的情况下对可执行文件进行扩充。对于代码的二次开发,一般来说有两种办法: 
  一、利用汇编代码直接增加我们需要的功能。 
  二、利用汇编代码增加一个接口,然后使用高级语言开发我们需要的功能。 
      对于第二种就是用高级语言写一函数做为输出函数,然后在原程序里直接Call调用就可以了。这里我们就来使用第一种方法,毕竟我们只需要一个记录密码的小功能,用不着太麻烦。 

你可能感兴趣的:(c,汇编,null,语言,工具,attributes)