这是偶无聊的时候跟踪金山游侠的部分代码,并用汇编根据其程序流程写出了完整的代码,就当练练手吧!

0041EC32  /.  55            push    ebp                                        ;后面要用EBP读堆栈找外部参数所以就要先保存EBP
0041EC33  |.  8BEC          mov     ebp, esp                                   ;用EBP读堆栈,以为ESP在不断变化
0041EC35  |.  51            push    ecx
0041EC36  |.  56            push    esi
0041EC37  |.  57            push    edi                                        ;以上为保存3个寄存器的值
0041EC38  |.  FF71 20       push    dword ptr [ecx+20]                         ; /打开的进程ID,第三个参数
0041EC3B  |.  6A 00         push    0                                          ; |句柄是否可以被继承,0为不继承,第二个参数
0041EC3D  |.  6A 10         push    10                                         ; |打开进程权限,这里是读权限,第一个参数
0041EC3F  |.  FF15 78F34500 call    dword ptr [<&KERNEL32.OpenProcess>]        ; /打开进程函数,要使用就得先打开
0041EC45  |.  8BF0          mov     esi, eax                                   ;  把EAX中的返回句柄保存到ESI中
0041EC47  |.  85F6          test    esi, esi                                   ;  测试ESI,就是看函数是否执行成功
0041EC49  |.  74 35         je      short 0041EC80                             ;  不成功的话跳到子程序末尾
0041EC4B  |.  8B7D 10       mov     edi, dword ptr [ebp+10]                    ;  把外部第3个参数保存到EDI
0041EC4E  |.  8D45 FC       lea     eax, dword ptr [ebp-4]                     ;  PUSH ECX时在内存中的值
0041EC51  |.  50            push    eax                                        ; /返回实际读取数,第五个参数
0041EC52  |.  57            push    edi                                        ; |要读写的字节数[EBP+10]中的值,第四个参数
0041EC53  |.  FF75 0C       push    dword ptr [ebp+C]                          ; |接收读取数值的缓冲区,第三个参数
0041EC56  |.  8365 FC 00    and     dword ptr [ebp-4], 0                       ; |把返回实际读取数缓冲区初始为0
0041EC5A  |.  FF75 08       push    dword ptr [ebp+8]                          ; |起始地址,第二个参数
0041EC5D  |.  56            push    esi                                        ; |句柄,第一个参数
0041EC5E  |.  FF15 74F34500 call    dword ptr [<&KERNEL32.ReadProcessMemory>]  ; /读进程内存
0041EC64  |.  85C0          test    eax, eax                                   ;  测试函数返回值
0041EC66  |.  74 11         je      short 0041EC79                             ;  不成功的话跳到子程序末尾
0041EC68  |.  397D FC       cmp     dword ptr [ebp-4], edi                     ;  比较设定读取长度和返回长度是否一样
0041EC6B  |.  75 0C         jnz     short 0041EC79                             ;  不一样的话跳到子程序末尾
0041EC6D  |.  56            push    esi                                        ; /进程ID,第一个参数
0041EC6E  |.  FF15 A0F34500 call    dword ptr [<&KERNEL32.CloseHandle>]        ; /结束进程
0041EC74  |.  6A 01         push    1                                          ;把1压入堆栈
0041EC76  |.  58            pop     eax                                        ;把刚才的1弹到EAX
0041EC77  |.  EB 09         jmp     short 0041EC82                             ;无条件跳
0041EC79  |>  56            push    esi                                        ; /进程ID,第一个参数
0041EC7A  |.  FF15 A0F34500 call    dword ptr [<&KERNEL32.CloseHandle>]        ; /结束进程
0041EC80  |>  33C0          xor     eax, eax                                   ;EAX清O
0041EC82  |>  5F            pop     edi
0041EC83  |.  5E            pop     esi                                        ;把先前保存的EDI和ESI还原
0041EC84  |.  C9            leave
0041EC85  /.  C2 0C00       retn    0C                                         ;返回并清理堆栈中12个字节

以下是用汇编写的代码,为了大家能看懂我没大量使用汇编指令,我使用高级语言的结构描述
_myReadProcessMemory    proc   uses edi esi lpBaseAddress,lpBuffer,dwSize ;
                       local  @lpNumberOfByteRead                         ;局部变量,保存返回读取的实际字数

invoke  OpenProcess,PROCESS_VM_READ,NULL,          ;以读的方式打开进程,最后一个参数是进程句柄我没写,因为我不知道push dword ptr [ecx+20]是怎么得到进程句柄的,谁能告诉我?
                       mov     esi, eax                                   ;把EAX中的返回句柄保存到ESI中
                       .if  esi == 1                                      ;判断函数是否执行成功
                            mov  edi,dwSize                               ;把dwSize参数保存到EDI
                            lea  eax,@lpNumberOfByteRead                  ;把@lpNumberOfByteRead地址装到EAX里
                            invoke  ReadProcessMemory,esi,lpBaseAddress,lpBuffer,dwSize,eax  ;读内存
                            .if eax == 1                                  ;判断函数是否执行成功
                               .if @lpNumberOfByteRead == edi             ;比较设定读取长度和返回长度是否一样
                                       invoke  CloseHandle,esi            ;结束进程
                                       push 1                             ;把1压入堆栈
                                       pop  eax                           ;把刚才的1弹到EAX做为返回值,因为程序返回时默认把返回值压到EAX中
                                       jmp  _end                          ;条到结尾
                               .endif
                            .endif
                            invoke  CloseHandle,esi                       ;结束进程
                        .endif
                        xor eax,eax                                       ;EAX清O,因为程序返回时默认把返回值压到EAX中,返回0说明没执行成功
_end:
                        ret                                               ;返回
_myReadProcessMemory    endp

BY:晓斌
QQ:6750333

用OD跟踪金山游侠的部分代码并用汇编还原其功能相关推荐

  1. 天龙八部网单服务器修改物品,如何用金山游侠V修改单机版天龙八部里面的物品啊?...

    先用游侠搜索物品十进制代码,然后回到游戏将物品的位置调换,再使用游侠搜索代码,重复搜索直到出现一个或两个地址. 详细步骤(举例): 一.配件的修改: 先到桂州货铺去买一个铁手环,佩带上,再把从自己房间 ...

  2. OD调试9—实例:深入分析代码完成软件破解

    OD调试9-实例:深入分析代码完成软件破解  爆破,是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关.因为这样子的话,我们就享受不到破解.逆向的真正乐趣了. 了解程序背后按照剧情发展经常会出 ...

  3. ICCV2017跟踪算法BACF原理及代码解析

    文章和代码下载地址: Galoogahi H K, Fagg A, Lucey S. Learning Background-Aware Correlation Filters for Visual ...

  4. 局域网对战平台 linux,在Linux下可用Wine安装和运行完美对战平台、金山游侠2002体验版...

    在Linux操作系统下可用Wine安装和运行完美对战平台.金山游侠2002体验版.exe文件,它们是Windows下的软件,在Linux中借助Wine就可以使用完美对战平台和金山游侠2002体验版了, ...

  5. TPAMI2015跟踪算法KCF原理及代码解析

    文章和代码下载地址: http://www.robots.ox.ac.uk/~joao/circulant/ 一.基础公式的由来 相关滤波跟踪器可以表示为最小化的岭回归问题: 表示期望相应,表示正则系 ...

  6. 金山开源安全卫士全套代码编译指南–湘勇整理版

    金山开源安全卫士全套代码编译指南–湘勇整理版 要从金山开源安全卫士的代码里学习,首先当然是最好能把全套代码编译出来进行调试.在开发湘勇网络医生的过程中,我一直关注金山开源安全卫士代码的更新动态,第一时 ...

  7. VC++ 查看C++代码的汇编代码列表

    VS2010 Express版本:非Express版本操作略有不同: 新建一个控制台工程: 工程属性:如下图位置:默认是没有汇编代码输出: 选中其中一个有汇编代码输出的选项: 然后构建一下:除了生成e ...

  8. python爬虫背景_利用Python代码实现一键抠背景功能

    前言 又是一个逛csdn发现的一个有趣的小项目,可以一键抠背景,需要用到removebg模块及其API,API可从其官网免费获取,网址如下https://www.remove.bg/zh ps:加上/ ...

  9. 如何用HTML语言设计进度条,html5代码如何实现进度条功能?(示例)

    本篇文章主要介绍html5代码如何实现进度条功能,希望对大家有所帮助. html5代码实现进度条功能具体代码示例如下:/*实现进度条的功能*/ 下载进度: /*js代码*/ var pg=docume ...

最新文章

  1. Linux学习整理(一)
  2. AI理论知识整理(2)-对称矩阵-特征值与特征向量
  3. ARMV8 datasheet学习笔记3:AArch64应用级体系结构
  4. Mysql显示创建表的sql语句
  5. Phoenix 关联映射 Hbase表 获取不到数据,upsert hbase 列名为16进制字符
  6. JUnit4 中@AfterClass @BeforeClass @after @before的区别
  7. AI空谈情怀,也是要输的 | 人机辩论大战
  8. Mongodb高级查询【二】
  9. 数据库知识点总结归纳
  10. 概率论基础 - 5 - 马尔可夫不等式
  11. 56ip数字标牌软件
  12. 深度学习的图片统一设置大小
  13. Bugku之秋名山老司机
  14. 收藏一些非常不错的学习资源
  15. 艺赛旗(RPA)word 文本差异比较
  16. Vim中如何全选复制粘贴
  17. layui tree 对节点进行搜索
  18. 读入一个整数,如果是1~5之间则分别输出5个福娃的名字否则输出“北京欢迎你
  19. TabLayout 选择标题改变颜色及大小
  20. python 学习快速入门

热门文章

  1. domino文件拆离数据库,放入指定目录
  2. ps2021神经网络AI滤镜在哪,ps2021神经滤镜不能下载
  3. 迪拜能否在2020年成为第一个区块链动力城市?
  4. 机会总是留给有准备的人--韦东山【转】
  5. IBM 2022年关于安全的五大预测;美通社推出2022年巴塞罗那世界移动通信大会整合传播方案 | 全球TMT...
  6. 示波器基础系列之三:关于示波器的触发功能(上篇)(转载自360doc个人图书馆)
  7. 【HTML+CSS】简历表格
  8. Android 天气APP(三十二)快捷切换常用城市
  9. 建筑设计与施工VS软件设计与编程
  10. C# 如何遍历一个实体的所有字段并给另外一个实体赋值,包含子实体也可以