找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5200|回复: 1

OllyDbg翻译一

[复制链接]
发表于 2014-3-21 16:27:20 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这是从ollydbg官网http://www.ollydbg.de/翻译过来的:
    ollydbg是一个windows下的32位汇编级分析调试器,在没有源码的情况下对于二进制代码的分析能力显得尤为重要。ollydbg是一个共享软件,但是可以自由的下载使用,它的特点如下:
    直观的用户界面没有隐藏命令
    代码分析 - 跟踪寄存器,识别函数过程,跳转,api调用,开关语句,表,常量和字符串
    直接加载并调试dll
    目标文件的扫描 - 从目标文件和库中定位函数
    允许用户自定义标签注释和功能描述
    可以分析Borland格式的调试信息
    保存会话中的信息,并更新写回到可执行文件
    开放式体系 - 支持第三方插件
    无需安装 - 不会再注册表和系统中产生垃圾
    调试多线程程序
    附加到进程
    可配置的反汇编器,支持masm和ideal格式
    支持MMX,3DNow!,SSE数据类型和指令,支持Athlon扩展指令
    全面支持UNICODE
    动态识别ASCII和UNICODE字符串 - 支持Delphi格式的
    识别复杂代码的结构,例如call,jump到某个过程
    识别超过1900个api和400个c函数调用
    由外部帮助文件可获取api函数的上下文帮助
    设置条件断点,条件记录断点,内存断点和硬件断点
    跟踪程序执行,记录已知函数参数
    显示修正
    动态跟踪栈帧
    支持搜索模糊命令和掩码二进制序列
    搜索全部分配的内存
    寻找常量和地段标记
    查看和修改内存,设置断点,暂停程序执行
    将命令汇编成最短二进制形式
    从软盘运行

Plugin Development Kit 1.10
ollydbg插件开发
编译
    要编译你自己的插件,需要c或c++编译器(有运行库和链接器),插件接口(plugin.h文件)最低兼容以下编译器:
    Borland C++ 5.5
    Borland C++ Builder 5
    Microsoft Visual C++ 5.0
插件开发工具包包括2个全功能插件的源代码:
   书签插件,让你为被调试程序设置多达10个书签;命令行插件,实现了命令行接口 。插件都是未文档化的你可以作为模板开发自己的插件,他们都是免费的。
   需要如下设置编译器才能使插件和ollydbg正常通信,除了上述那些编译器,plugin.h还按如下规则检查:
     通过名称导出函数而非序号
     如果你使用c++编译器需要在所有回调函数中禁用名称粉碎(声明为extern "C")
     强制使用C格式给api或者回调函数传递参数(声明为cdecl)
     对于plugin.h中声明的结构体,强制按1字节对齐
     设置默认字符类型为UNSIGNED


   记得所有从ollydbg获取的指针都可能是空,忽略这一点是常见错误
   使用静态运行库直接链接到你的插件,否则不同版本运行时dll会使ollydbg不稳定。不要把你的插件不必要滴分为若干个dll,如果你需要数据文件且不想让用户修改,试着将这些数据作为资源直接写入你的插件。为了让ollydbg连接你的插件,需要链接ollydbg.lib,一些编译器,如Borland,包含了implib工具可以扫描可执行文件(ollydbg.exe),并产生一个特殊的库记录所有导出函数,另一些编译器例如(vc)可以从def文件(ollydbg.def)生成导入库。类似的产品请阅读他们的文档。
请不要浪费资源,不要输出未使用的回调函数,这样可以是的你的程序更快,ollydbg当前的版本支持多达32个插件。
  用vc5从命令行编译插件例子:
  1.将bookmar.c,cmdexec.c,command.c,plugin.h,vc50\bookmar.mak,vc50\cmdline.mak,vc50\ollydbg.lib复制到相同目录
  2.编辑mak文件
    INCLUDE=c:\vc\include
    LIBPATH=c:\vc\lib
   这样他们就可以指向你的头文件和库文件目录了
3.进入c:\vc\bin,执行
   c:\vc\bin\nmake -f bookmark.mak
   c:\vc\bin\nmake -f cmdline.mak
4.使用vs编译插件
   编译bookmark.dll
     1.将bookmark.c, plugin.h, vc50\bookmark.dsp, vc50\bookmark.dsw vc50\ollydbg.lib 复制到同一目录
     2.使用vs打开bookmark工程,编译


教程1:运行时跟踪
  运行时跟踪技术是在ollydbg1.04首次引入的,这种调试技术基本都很简单。代码是一步步执行的,调试器使用环形缓冲区处理每个命令,寄存器和标志位。当发生异常时可以多次回退到上个命令,分析出错条件。
  ollydbg1.06显著提高了运行跟踪的可能性,运行跟踪会系那是修改的寄存器,保留重要的信息和已知函数操作。使用此技术我们可以设置条件暂停运行跟踪,分析跟踪代码,在磁盘里记录跟踪日志克服内存限制,或者比较2个运行实例,调试自修改程序,寻找执行了最后一次的指令,等等
  无论如何这个过程都很慢,在500Mhz的处理器上,ollydbg每秒最多可以跟踪2500到5000条指令,要加速跟踪,可以标记代码中一次执行的准线性块
   为了让你熟悉跟踪过程我们试着调试一个简单的命令行程序
#include <stdio.h>
void f1(void) { printf("a"); };
void f2(void) { printf("b"); };
void f3(void) { printf("c"); };
void (*f[3])() = { f1,f2,f3 };
void main(void) {
  int i,j,k;
  for (i=0; i<100; i++) {
    for (j=0; j<1000000; j++) ;  // Long code    k=i/33;
    if (k>3) continue;
    f[k]();                      // Here error (when i==99)!
  };  printf("\n");
};
函数f1 f2 f3打印字母a b c,主程序调用每个函数33次,然后打印出新行和结束符,至少理论上是这样(你可能已经看出来哪里错了对吗?PS没看出来的打屁屁)好,我们学一下如何使用运行跟踪产生相同的错误结果。打开编译的程序,几秒后他崩溃了。


不,肯定哪里错了,ollydbg是你的实时调试器,选择调试但是反汇编窗口是空的,地址0062001指向空,你一点也不知道哪个命令跳转到这里,我们试着从头开始,Ctrl+F2,然后Ctrl+F11,等待几分钟,命令行仍然是空,可能一些代码花费了太长时间执行?F12暂停跟踪。在可执行模块里选择查看跟踪文件。

00401191地址处的一系列命令执行了24000次以上,转到该地址


一个3命令循环执行了1000000次,每秒5000个命令,ollydbg需要10分钟跟踪这个循环。注意,命令序列是准线性的,且没有跳到外面,在弹出的菜单选择“运行跟踪|跳过选择当追踪” 第四列的红线表示在跟踪时排除的命令,当ollydbg遇到排除序列,它会在该块之后设置临时断点,当然,任何返回或者跳转到外面都会使跟踪无效,因此ollydbg会检查这段代码并且要求你确认。继续跟踪,这次很快,20s,ollydbg就报告错误

确认了错误以后,打开跟踪窗口,
我们现在看到跳转到006210061的是004011AF处的指令CALL EAX,非法地址在调用前已经计算出,双击这一行以便在反汇编器中查看。寄存器和信息都是灰色的,说明他们都不是实际值,

0040A128的地址指向一个包括3个函数指针f1 f2 f3的数组,当这个命令执行最后一次,eax里面是3,已经超出数组边界,前2个命令应该执行边界检查,但是条件是非法的:当eax>3时跳出  正常的条件应该是>=    双击错误行,更正条件

在你输入了新的指令后,指令变红,表明指令经过修改,再次选中在弹出菜单选择“复制到可执行文件”,这样你的修改就写入文件了


你所需要的是保存修改的exe,这时exe运行正常,很简单对吗


教程2:加载dll
     ollydbg可以调试单独的dll,windows不能直接运行dll,因此ollydbg用一个小程序loaddll.exe打开他们。如果你调试dll,ollydbg会自动解压loaddll.exe并链接库作为参数运行。
有了loaddll,你可以调用调试库输出的函数,我会用MessageBox和wsprintf解释这一用法
     例一 MessageBox


     1.加载dll   我们当然选是,ollydbg启动Loaddll,加载库然后暂停在主窗口循环处,这个地址标记为Firstbp,然后ollydbg分析dll显示他的代码
注意windows将dll加载到内存后会自动执行dll启动代码
     2.从主菜单里选择“Debug|Call DLL export”,显示的对话框是非模态的,因此你仍然可以使用ollydbg其他功能。你可以打开代码和数据,设置断点,修改内存等。
     3.选择你想调用的函数, MessageBox这个名字是通用的,事实上有MessageBoxA和MessageBoxW之分,我们分析第二个。我们选好以后分析器判断出函数以ret 10结束
     4.设置堆栈参数数量。在这里不是必需的,因为ollydbg已经知道参数数量了
     5.填写参数列表。这个对话框支持多达10个栈参数,参数是任何不适用寄存器的合法表达式。除此之外对话框有2个伪变量,loaddll.exe创建的父窗口句柄Hwnd和loaddll的实例句柄Hinst.为了方便当你第一次使用call export,ollydbg将他们加入历史列表
     6.设置寄存器变量。寄存器变量在输出函数中很少使用。
     7.选项设置。调用隐藏意味着当函数执行时对话框会隐藏。当函数调用结束,ollydbg会再次打开Call export,调用暂停指的是调试程序执行以后会被暂停运行。如果没什么错误的话,对话框会是这样:


   8.通过按下call调用函数。ollydbg自动备份所有转储,验证和计算参数和寄存器,从屏幕移除对话框,然后调用MessageBoxW,会出现如下对话框:
  
  好了,按ok,MessageBoxW会返回,Call export报告成功,注意返回的eax是1,正好是IDOK的数字值,很简单,不是吗?


         
        细节与资源
    loaddll.exe是一个压缩的汇编写的win32程序。看看他的源码:

  1. This is the full code of loaddll.exe. It can be compiled using Borland's TASM32 with following commands:

  2. tasm32 -mx -zi -m5 loaddll.asm,,loaddll.lst
  3. tlink32 -v- -c -S:40000 -B:400000 -Tpe -aa -m loaddll,,,import32.lib
  4. brc32 loaddll.rc -feloaddll.exe

  5. LOADDLL.ASM:

  6.            P586                        ; 32-bit instructions used!
  7.            MODEL FLAT,PASCAL
  8.            IDEAL                       ; I really like it!
  9.            LOCALS

  10.            PUBLICDLL WndProc,Firstbp,Prepatch,CallDLL,Finished;
  11.            PUBLICDLL Patcharea,Endpatch
  12.            PUBLICDLL Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10

  13.            SEGMENT _DATA1 PARA PUBLIC USE32 'DATA'

  14.            ; Text below is a keyphrase used by OllyDbg to verify that LoadDll
  15.            ; is correct. Loads at fixed address 00420000. Never change! Note
  16.            ; how coward I am: you cannot replace copyright, otherwise this code
  17.            ; will not work!
  18.            DB "DLL Loader (C) 2004 Oleh Yuschuk"

  19.            ; Link area. Never change the meaning or order of next 32 dwords!
  20. ERRMSG     DD 0                        ; Pointer to error
  21. HINST      DD 0                        ; Process instance
  22. HWND       DD 0                        ; Handle of main window
  23. DLLBASE    DD 0                        ; Base address of loaded DLL or NULL
  24.            DD OFFSET Firstbp           ; Address of first breakpoint
  25.            DD OFFSET Prepatch          ; Address of patch area before call
  26.            DD OFFSET Arg1              ; Base of 10 arguments x 1024 bytes
  27.            DD OFFSET Finished          ; Address of breakpoint after call
  28. DUMMY      DD 4 DUP(0)                 ; Reserved for the future
  29. PROCADR    DD 0                        ; Address of procedure, starts execution
  30. REGEAX     DD 0                        ; Register arguments
  31. REGECX     DD 0
  32. REGEDX     DD 0
  33. REGEBX     DD 0
  34. REGESI     DD 0
  35. REGEDI     DD 0
  36. NARG       DD 0                        ; Number of arguments to push on stack
  37. ARGLIST    DD 10 DUP(0)                ; DLL argument list
  38. ESPDIFF    DD 0                        ; Difference in ESP caused by code
  39.            DD 0                        ; Reserved for the future

  40. WCLASS     = THIS DWORD                ; Hand-made WNDCLASS structure
  41.            DD 0000002Bh                ; CS_HREDRAW|VREDRAW|DBLCLKS|OWNDC
  42.            DD WndProc                  ; Window procedure
  43.            DD 0                        ; Class extra bytes
  44.            DD 0                        ; Window extra bytes
  45. WCINST     DD 0                        ; Instance
  46. WCICON     DD 0                        ; Icon
  47. HCURS      DD 0                        ; Cursor
  48. HBGND      DD 0                        ; Background brush
  49.            DD 0                        ; No menu
  50.            DD CLSNAME                  ; Class name

  51. MSG        = THIS DWORD                ; Hand-made MSG structure
  52.            DD 0                           ; Handle of window
  53. MSGID      DD 0                        ; Message ID
  54.            DD 0                        ; wParam
  55.            DD 0                        ; lParam
  56.            DD 0                        ; Timestamp
  57.            DD 0                        ; X coordinate
  58.            DD 0                        ; Y coordinate

  59. PSTRUCT    = THIS DWORD                ; Hand-made PAINTSTRUCT structure
  60.            DD 0                        ; HDC
  61.            DD 0                        ; fErase
  62.            DD 0                        ; rcPaint.left
  63.            DD 0                        ; rcPaint.top
  64.            DD 0                        ; rcPaint.right
  65.            DD 0                        ; rcPaint.bottom
  66.            DD 0                        ; fRestore
  67.            DD 0                        ; fIncUpdate
  68.            DB 32 DUP(0)                ; rgbReserved

  69. ORIGESP    DD 0                        ; Original ESP before call
  70. ORIGEBP    DD 0                        ; Original EBP before call
  71. EXPESP     DD 0                        ; Expected ESP after call (C)
  72. WNDNAME    DB "OllyDbg DLL Loader",0
  73. CLSNAME    DB "LoadDLLClass",0
  74. ICONAME    DB "MAINICON",0             ; Green smashed bug - igitt!
  75. E_NONAM    DB "Missing DLL name",0     ; Error notifications to OllyDbg
  76. E_NODLL    DB "Unable to load DLL",0
  77. E_NPARM    DB "Too many parameters",0

  78.            ALIGN 16
  79. Arg1       DB 1024 DUP (?)             ; Area for 10 memory arguments, 1 k each
  80. Arg2       DB 1024 DUP (?)
  81. Arg3       DB 1024 DUP (?)
  82. Arg4       DB 1024 DUP (?)
  83. Arg5       DB 1024 DUP (?)
  84. Arg6       DB 1024 DUP (?)
  85. Arg7       DB 1024 DUP (?)
  86. Arg8       DB 1024 DUP (?)
  87. Arg9       DB 1024 DUP (?)
  88. Arg10      DB 1024 DUP (?)

  89.            ENDS _DATA1

  90.            SEGMENT _TEXT1 PARA PUBLIC USE32 'CODE'

  91.            EXTRN GetModuleHandleA:     PROC
  92.            EXTRN GetCommandLineA:      PROC
  93.            EXTRN LoadIconA:            PROC
  94.            EXTRN LoadCursorA:          PROC
  95.            EXTRN GetStockObject:       PROC
  96.            EXTRN RegisterClassA:       PROC
  97.            EXTRN CreateWindowExA:      PROC
  98.            EXTRN DestroyWindow:        PROC
  99.            EXTRN PostQuitMessage:      PROC
  100.            EXTRN ShowWindow:           PROC
  101.            EXTRN Sleep:                PROC
  102.            EXTRN BeginPaint:           PROC
  103.            EXTRN EndPaint:             PROC
  104.            EXTRN DefWindowProcA:       PROC
  105.            EXTRN LoadLibraryA:         PROC
  106.            EXTRN PeekMessageA:         PROC
  107.            EXTRN TranslateMessage:     PROC
  108.            EXTRN DispatchMessageA:     PROC
  109.            EXTRN ExitProcess:          PROC

  110.            ; Window procedure of main LoadDLL window.
  111.            PROC WndProc
  112.            ARG LP:DWORD,WP:DWORD,MS:DWORD,HW:DWORD
  113.            PUSH EDX
  114.            PUSH EDI
  115.            PUSH ESI
  116.            MOV EAX,[MS]
  117.            CMP EAX,0001h               ; WM_CREATE
  118.            JE RET0
  119.            CMP EAX,0002h               ; WM_DESTROY
  120.            JNE @@080
  121.              PUSH 0
  122.              CALL PostQuitMessage
  123.              JMP RET0
  124. @@080:     CMP EAX,000Fh               ; WM_PAINT
  125.            JNE @@100
  126.              PUSH OFFSET PSTRUCT
  127.              PUSH [HW]
  128.              CALL BeginPaint
  129.              PUSH OFFSET PSTRUCT
  130.              PUSH [HW]
  131.              CALL EndPaint
  132.              JMP RET0
  133. @@100:     CMP EAX,0010h               ; WM_CLOSE
  134.            JNE @@200
  135.              PUSH [HW]
  136.              CALL DestroyWindow
  137.              JMP RET0
  138. @@200:     ; None of listed above, pass to DefWindowProc().
  139.            PUSH [LP]
  140.            PUSH [WP]
  141.            PUSH [MS]
  142.            PUSH [HW]
  143.            CALL DefWindowProcA
  144.            JMP RETA
  145. RET0:      XOR EAX,EAX
  146.            JMP SHORT RETA
  147. RET1:      MOV EAX,1
  148. RETA:      POP ESI
  149.            POP EDI
  150.            POP EDX
  151.            RET
  152.            ENDP WndProc

  153. START:     MOV EBP,ESP                 ; Here execution begins
  154.            PUSH 0
  155.            CALL GetModuleHandleA
  156.            MOV [DWORD DS:WCINST],EAX
  157.            MOV [DWORD DS:HINST],EAX
  158.            CALL GetCommandLineA        ; Path to LOADDLL is taken into quotes
  159.            MOV ESI,EAX
  160.            INC ESI                     ; Skip first quote
  161. @@10:        MOV AL,[BYTE DS:ESI]      ; Skip path to LOADDLL.EXE
  162.              INC ESI
  163.              OR AL,AL
  164.              JNE @@12
  165.                MOV [DWORD DS:ERRMSG],OFFSET E_NONAM
  166.                JMP ERROR
  167. @@12:        CMP AL,'"'
  168.              JNE @@10
  169. @@20:        MOV AL,[BYTE DS:ESI]      ; Skip spaces
  170.              CMP AL,' '
  171.              JNE @@30
  172.              INC ESI
  173.              JMP SHORT @@20
  174. @@30:      PUSH ESI
  175.            CALL LoadLibraryA           ; Load DLL
  176.            OR EAX,EAX
  177.            JNE @@32
  178.              MOV [DWORD DS:ERRMSG],OFFSET E_NODLL
  179.              JMP ERROR
  180. @@32:      MOV [DWORD DS:DLLBASE],EAX
  181.            PUSH OFFSET ICONAME
  182.            PUSH [DWORD DS:HINST]
  183.            CALL LoadIconA
  184.            MOV [DWORD DS:WCICON],EAX
  185.            PUSH 7F88h                  ; IDC_NO
  186.            PUSH 0                      ; External resource
  187.            CALL LoadCursorA
  188.            MOV [DWORD DS:HCURS],EAX
  189.            PUSH 0                      ; WHITE_BRUSH
  190.            CALL GetStockObject
  191.            MOV [DWORD DS:HBGND],EAX
  192.            PUSH OFFSET WCLASS
  193.            CALL RegisterClassA
  194.            PUSH 0                      ; Parameters: none
  195.            PUSH [DWORD DS:HINST]       ; Instance
  196.            PUSH 0                      ; Menu: none
  197.            PUSH 0                      ; Parent window: none
  198.            PUSH 100                    ; Width
  199.            PUSH 200                    ; Height
  200.            PUSH 80000000h              ; CW_USEDEFAULT
  201.            PUSH 80000000h              ; CW_USEDEFAULT
  202.            PUSH 10CF0000h              ; WS_OVERLAPPEDWINDOW|WS_VISIBLE
  203.            PUSH OFFSET WNDNAME         ; Window name
  204.            PUSH OFFSET CLSNAME         ; Class name
  205.            PUSH 0                      ; Extended style: none
  206.            CALL CreateWindowExA
  207.            MOV [DWORD DS:HWND],EAX     ; Save handle
  208.            PUSH 9                      ; SW_RESTORE
  209.            PUSH EAX
  210.            CALL ShowWindow
  211. Firstbp:   NOP                         ; First breakpoint is set here
  212. WINLOOP:     CMP [DWORD DS:PROCADR],0  ; Request to call some function?
  213.              JE NOCALL
  214.                MOV [DWORD DS:ORIGESP],ESP
  215.                MOV [DWORD DS:ORIGEBP],ESP
  216.                PUSH 0                  ; Security buffer (16 doublewords)
  217.                PUSH 0
  218.                PUSH 0
  219.                PUSH 0
  220.                PUSH 0
  221.                PUSH 0
  222.                PUSH 0
  223.                PUSH 0
  224.                PUSH 0
  225.                PUSH 0
  226.                PUSH 0
  227.                PUSH 0
  228.                PUSH 0
  229.                PUSH 0
  230.                PUSH 0
  231.                PUSH 0
  232.                MOV ECX,[DWORD DS:NARG]
  233.                JECXZ @@44
  234.                CMP ECX,10
  235.                JBE @@40
  236.                  MOV [DWORD DS:ERRMSG],OFFSET E_NPARM
  237.                  JMP ERROR
  238. @@40:          MOV EAX,OFFSET ARGLIST
  239. @@42:            PUSH [DWORD EAX]      ; Push requested number of arguments
  240.                  ADD EAX,4
  241.                  LOOP @@42
  242. @@44:          MOV [DWORD DS:EXPESP],ESP ; Expected ESP after return (C)
  243.                MOV EAX,[DWORD DS:REGEAX] ; Preset registers
  244.                MOV ECX,[DWORD DS:REGECX]
  245.                MOV EDX,[DWORD DS:REGEDX]
  246.                MOV EBX,[DWORD DS:REGEBX]
  247.                MOV ESI,[DWORD DS:REGESI]
  248.                MOV EDI,[DWORD DS:REGEDI]
  249. Prepatch:      NOP                     ; Patch area before call
  250.                NOP
  251.                NOP
  252.                NOP
  253.                NOP
  254.                NOP
  255.                NOP
  256.                NOP
  257.                NOP
  258.                NOP
  259.                NOP
  260.                NOP
  261.                NOP
  262.                NOP
  263.                NOP
  264.                NOP
  265. CallDLL:       CALL [DWORD DS:PROCADR] ; Call DLL function
  266.                NOP                     ; Patch area after call
  267.                NOP
  268.                NOP
  269.                NOP
  270.                NOP
  271.                NOP
  272.                NOP
  273.                NOP
  274.                NOP
  275.                NOP
  276.                NOP
  277.                NOP
  278.                NOP
  279.                NOP
  280.                NOP
  281.                NOP
  282.                MOV [DWORD DS:REGEAX],EAX ; Get modified registers
  283.                MOV [DWORD DS:REGECX],ECX
  284.                MOV [DWORD DS:REGEDX],EDX
  285.                MOV [DWORD DS:REGEBX],EBX
  286.                MOV [DWORD DS:REGESI],ESI
  287.                MOV [DWORD DS:REGEDI],EDI
  288.                MOV EAX,ESP
  289.                SUB EAX,[DWORD DS:EXPESP]
  290.                MOV [DWORD DS:ESPDIFF],EAX
  291.                MOV EBP,[DWORD DS:ORIGEBP]
  292.                MOV ESP,[DWORD DS:ORIGESP]
  293.                MOV [DWORD DS:PROCADR],0 ; Confirm execution
  294.                NOP
  295. Finished:      INT 3                   ; Pause after execution
  296.                NOP
  297. NOCALL:      PUSH 0
  298.              CALL Sleep                ; Be fair to other applications
  299.              PUSH 1                    ; PM_REMOVE
  300.              PUSH 0                    ; Process all messages
  301.              PUSH 0
  302.              PUSH 0                    ; Any window
  303.              PUSH OFFSET MSG
  304.              CALL PeekMessageA
  305.              OR EAX,EAX
  306.              JZ WINLOOP
  307.              PUSH OFFSET MSG
  308.              CALL TranslateMessage
  309.              PUSH OFFSET MSG
  310.              CALL DispatchMessageA
  311.              MOV EAX,[DWORD DS:MSGID]
  312.              CMP EAX,12h               ; WM_QUIT
  313.              JNE WINLOOP
  314.            PUSH 0
  315.            CALL ExitProcess            ; Hasta la vista!
  316. ERROR:     PUSH 00001001h              ; Special return code, means error
  317.            CALL ExitProcess            ; Error detected
  318.            ALIGN 4
  319. Patcharea: DB 2047 DUP(90h)            ; Big patch area (2 K of NOPs)
  320. Endpatch:  NOP
  321.            ENDS _TEXT1

  322.            END START

  323. LOADDLL.RC:

  324. MAINICON ICON                          // Green bug
  325. {
  326. '00 00 01 00 02 00 20 20 10 00 00 00 00 00 E8 02'
  327. '00 00 26 00 00 00 10 10 10 00 00 00 00 00 28 01'
  328. '00 00 0E 03 00 00 28 00 00 00 20 00 00 00 40 00'
  329. '00 00 01 00 04 00 00 00 00 00 80 02 00 00 00 00'
  330. '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
  331. '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00'
  332. '00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0'
  333. 'C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
  334. '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
  335. '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
  336. '00 00 00 00 02 A0 00 00 00 00 A2 00 00 00 00 00'
  337. '00 00 00 00 0A 20 00 00 00 0A 2A 2A 00 00 00 00'
  338. '00 00 00 00 A2 A2 00 00 00 A2 A2 A2 00 00 00 00'
  339. '00 00 00 00 2A 2A 00 00 0A 2A 2A 2A 00 00 00 00'
  340. '00 00 00 00 A2 A2 00 00 A2 A2 A2 A0 00 00 00 00'
  341. '00 00 00 00 2A 2A 00 0A 2A 2A 2A 20 00 00 02 A2'
  342. '00 00 00 00 02 A2 A0 A2 A2 A2 A2 00 00 00 0A 2A'
  343. '2A 2A 00 00 0A 2A 2A 2A 2A 2A 20 00 00 00 02 A2'
  344. 'A2 A2 A0 00 02 A2 A2 A2 A2 A2 00 00 00 00 0A 2A'
  345. '2A 2A 2A 2A 2A 2A 2A 2A 2A 00 00 00 00 00 00 A2'
  346. 'A2 A2 A2 A2 A2 A2 A2 A2 00 00 00 00 00 00 00 00'
  347. '2A 2A 2A 2A 2A 2A 2A 2A 00 00 00 00 00 00 00 00'
  348. '00 02 A2 A2 A2 A2 A2 A2 00 00 00 00 00 00 00 00'
  349. '00 00 0A 2A 2A 2A 2A 2A 2A 00 00 00 00 00 00 00'
  350. '00 00 02 A2 A2 A2 A2 A2 A2 A2 A2 00 00 00 00 00'
  351. '00 00 0A 2A 2A 2A 2A 2A 2A 2A 2A 20 00 00 00 00'
  352. '00 00 02 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 00 00 00'
  353. '00 00 0A 2A 2A 2A 2A 2A 00 00 2A 2A 2A 20 00 00'
  354. '00 00 A2 A2 A0 A2 A2 A0 00 00 02 A2 A2 A0 00 00'
  355. '00 00 2A 2A 00 0A 2A 20 00 00 00 2A 2A 20 00 00'
  356. '00 00 00 00 00 00 A2 A0 00 00 00 00 00 00 00 00'
  357. '00 00 00 00 00 00 2A 20 00 00 00 00 00 00 00 00'
  358. '00 00 00 00 00 00 A2 A0 00 00 00 00 00 00 00 00'
  359. '00 2A 20 00 00 00 2A 2A 00 00 00 00 00 00 00 00'
  360. 'A2 A2 A0 00 00 00 A2 A2 00 00 00 00 00 00 00 00'
  361. '2A 2A 20 00 00 00 2A 2A 00 00 00 00 00 00 00 00'
  362. 'A2 A2 A0 00 00 00 02 A2 00 00 00 00 00 00 00 0A'
  363. '2A 2A 20 00 00 00 0A 2A 00 00 00 00 00 00 00 02'
  364. 'A2 A2 00 00 00 00 00 00 00 00 00 00 00 00 00 0A'
  365. '2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
  366. '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F9'
  367. 'FF 3F FF F0 FE 0F FF F0 FC 07 FF E0 78 07 FF E0'
  368. '70 07 FF E0 60 0F 8F E0 40 0F 00 F0 00 1F 00 70'
  369. '00 3F 00 10 00 7F 00 00 00 FF 80 00 03 FF C0 00'
  370. '0F FF E0 00 03 FF FC 00 00 3F FF 00 00 1F FF 00'
  371. '00 03 FF 00 00 01 FF 00 00 00 FE 00 0F 00 FE 04'
  372. '0F 80 FF 0E 0F C1 FF FE 0F FF FC 7E 0F FF F0 3E'
  373. '07 FF E0 3E 07 FF E0 3E 07 FF C0 3F 07 FF C0 3F'
  374. '07 FF C0 7F 0F FF C0 FF FF FF E3 FF FF FF 28 00'
  375. '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00'
  376. '00 00 C0 00 00 00 00 00 00 00 00 00 00 00 00 00'
  377. '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
  378. '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
  379. '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF'
  380. '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
  381. '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
  382. '00 AA 00 0A AA 00 00 00 00 AA 00 AA AA 00 00 00'
  383. '00 AA 0A AA A0 00 0A AA 00 0A AA AA 00 00 0A AA'
  384. 'AA AA AA 00 00 00 00 0A AA AA AA 00 00 00 00 00'
  385. '0A AA AA A0 00 00 00 00 0A AA AA AA AA 00 00 00'
  386. 'AA AA AA 00 AA A0 00 00 00 00 A0 00 00 00 00 00'
  387. '00 00 A0 00 00 00 00 0A 00 00 AA 00 00 00 00 AA'
  388. '00 00 AA 00 00 00 00 AA 00 00 00 00 00 00 00 00'
  389. '00 00 00 00 00 00 FC E3 00 00 F8 41 00 00 F8 01'
  390. '00 00 88 03 00 00 00 07 00 00 00 0F 00 00 80 1F'
  391. '00 00 E0 03 00 00 F0 01 00 00 E0 00 00 00 F0 31'
  392. '00 00 EE 3F 00 00 86 1F 00 00 86 1F 00 00 87 3F'
  393. '00 00 8F FF 00 00'
  394. }

复制代码

从START开始执行,loaddll获取命令行,跳过可执行文件名(必须有双引号),解析dll路径将其传给loadlibrary,一旦出错,就会将错误信息指针放到固定位置,以0x1001退出码退出,成功后创建一个小窗口,然后暂停在Firstbp,这个断点是ollydbg启动时设置的。所有和ollydbg的通信都是通过128字节内存区,这个区域必须从0x420020开始,该处刚好位于关键区域之后。前几个数据包含loaddll.exe的地址,用于ollydbg设置断点和参数。接着是函数调用地址,寄存器内容,参数个数,参数。当loaddll执行到windows消息循环时,它会不断检查输出函数的地址是否非0,如果是,loaddll保存ESP和EBP,将16个0压栈。这样能避免用户指定无效参数个数。然后他会将参数和寄存器压栈,在Prepatch地址有16个NOP用于打补丁。如果你需要更多空间,可以调到Patcharea 2K字节长的地方。注意到Ollydbg在存在同名文件时不解析loaddll.exe    当CallDLL输出函数被调用时,该指令之后会有16个NOP,调用之后程序保存修改的寄存器和ESP偏移。如果提供的参数个数非法,ollydbg会报告错误。最终loaddll存储esp和ebp,清空PROCADR,断在Finished的INT3处,当执行到这里,ollydbg知道直接完毕。
  Loaddll.asm是自由软件,不过不要使用loaddll.rc的绿虫子图标!


回复

使用道具 举报

发表于 2014-3-21 17:06:15 | 显示全部楼层
{:soso_e163:}
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 11:54 , Processed in 0.040470 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表