游戏逆向——找call练习 汇编实现

简介

主要练习找到功能 call 后如何写成程序,使用 win32汇编实现,大家可以选择自己喜欢的语言实现(c++、e语言、python等),如果对 win32汇编不感兴趣就可以退出了
用汇编去实现这些功能非常方便,几乎就是复制粘贴。

任务

在这里插入图片描述
实现这 4 个功能 call

找 call

  1. ollydbg 附加这个程序
  2. 下断点(bp send)
  3. 执行任意功能(普攻)
  4. ctrl+F9 回到程序地址
  5. 跟踪代码

由于比较简单,就不演示了,以下列出功能 call 的地址

  • 普攻
    在这里插入图片描述

  • 魔法
    在这里插入图片描述

  • 群攻
    在这里插入图片描述

  • 死亡
    在这里插入图片描述

代码实现

实现方法:

  1. 代码注入(使用更方便)
  2. dll 注入(写代码更方便)

本次使用 dll 注入
mfc dll 模板见上一篇文章 https://blog.csdn.net/weixin_44018458/article/details/108935929

test.asm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff test.asm
; Link  /subsystem:windows /Dll test.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.386
		.model flat, stdcall
		option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN	equ	1000h		;图标


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?
hInstance	dd	?
hWinMain	dd	?

IDC_ATTACK1	dd	?	;普攻
IDC_ATTACK2	dd	?	;魔法
IDC_ATTACK3	dd	?	;群攻
IDC_DEAD	dd	?	;死亡



		.const
szClassName	db	'RemoteClass',0
szCaptionMain	db	'练习找CALL_1 BY:程序_原',0
szButton	db	'Button',0
szAttack1	db	"普攻",0
szAttack2	db	"魔法",0
szAttack3	db	"群攻",0
szDead		db	"死亡",0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain	proc	uses ebx edi esi,hWnd,uMsg,wParam,lParam
		local	i
		
		mov	eax,uMsg
		.if	eax ==	WM_CLOSE
			invoke	DestroyWindow,hWnd
			invoke	PostQuitMessage,NULL


		.elseif	eax ==	WM_COMMAND
			mov	eax,wParam
			.if	eax == IDC_ATTACK1
				; 普攻
				;****************************************************
				push	80000004h
				push	0
				push	00486085h
				push	10005h
				push	16010CC1h
				push	52010CBDh
				push	2
				mov	ebx,004063B0h
				mov	edi,00405C2Fh
				call	edi
				;*****************************************************

			.elseif	eax == IDC_ATTACK2
				; 魔法
				;****************************************************
				push    80000004h
				push    0
				push    485DECh
				push    10005h
				push    16010CC1h
				push    52010CBDh
				push    2
				mov     ebx, 4063B0h
				mov	edi,00405C2Fh
				call    edi
				;*****************************************************
		
			.elseif	eax == IDC_ATTACK3
				; 群攻
				;****************************************************
				push    80000004h
				push    0
				push    485D5Ah
				push    10005h
				push    16010CC1h
				push    52010CBDh
				push    2
				mov     ebx, 4063B0h
				mov	edi,00405C2Fh
				call    edi
				;****************************************************


			.elseif	eax == IDC_DEAD
				; 死亡
				;****************************************************
				push    80000004h
				push    0
				push    486055h
				push    10005h
				push    16010CC1h
				push    52010CBDh
				push    2
				mov     ebx, 4063B0h
				mov	edi,00405C2Fh
				call    edi
				;****************************************************

			.endif
			
		.else
			invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
			ret
		.endif
;********************************************************************
		xor	eax,eax
		ret

_ProcWinMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain	proc	uses ebx esi edi _lParam
		local	@stWndClass:WNDCLASSEX
		local	@stMsg:MSG

		invoke	RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************
		invoke	LoadCursor,0,IDC_ARROW
		mov	@stWndClass.hCursor,eax
		push	hInstance
		pop	@stWndClass.hInstance
		mov	@stWndClass.cbSize,sizeof WNDCLASSEX
		mov	@stWndClass.style,CS_HREDRAW or CS_VREDRAW
		mov	@stWndClass.lpfnWndProc,offset _ProcWinMain
		mov	@stWndClass.hbrBackground,COLOR_WINDOW + 1
		mov	@stWndClass.lpszClassName,offset szClassName
		invoke	RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
		invoke	CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
			WS_OVERLAPPEDWINDOW,\
			100, 100,450, 250,\
			NULL,NULL,hInstance,NULL
		mov	hWinMain,eax
		
		;****************************************************
		;	创建按钮
		;****************************************************
		invoke	CreateWindowEx,NULL,offset szButton,offset szAttack1,\		;普攻
			WS_CHILD or WS_VISIBLE,\					
			50,40,80,40,\
			hWinMain,1,hInstance,NULL
		invoke	GetDlgCtrlID,eax
		mov	IDC_ATTACK1,eax

		invoke	CreateWindowEx,NULL,offset szButton,offset szAttack2,\		;魔法
			WS_CHILD or WS_VISIBLE,\					
			300,40,80,40,\
			hWinMain,2,hInstance,NULL
		invoke	GetDlgCtrlID,eax
		mov	IDC_ATTACK2,eax
		
		invoke	CreateWindowEx,NULL,offset szButton,offset szAttack3,\		;群攻
			WS_CHILD or WS_VISIBLE,\					
			50,140,80,40,\
			hWinMain,3,hInstance,NULL
		invoke	GetDlgCtrlID,eax
		mov	IDC_ATTACK3,eax

		invoke	CreateWindowEx,NULL,offset szButton,offset szDead,\		;死亡
			WS_CHILD or WS_VISIBLE,\					
			300,140,80,40,\
			hWinMain,4,hInstance,NULL
		invoke	GetDlgCtrlID,eax
		mov	IDC_DEAD,eax
		
		;****************************************************
		;	加载图标
		;****************************************************
		invoke	LoadIcon,hInstance,ICO_MAIN
		invoke	SendMessage,hWinMain,WM_SETICON,ICON_BIG,eax

		invoke	ShowWindow,hWinMain,SW_SHOWNORMAL
		invoke	UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
		.while	TRUE
			invoke	GetMessage,addr @stMsg,NULL,0,0
			.break	.if eax	== 0
			invoke	TranslateMessage,addr @stMsg
			invoke	DispatchMessage,addr @stMsg
		.endw
		ret

_WinMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry	proc	_hInstance,_dwReason,_dwReserved
		local	@dwThreadID

		.if	_dwReason == DLL_PROCESS_ATTACH
			push	_hInstance
			pop	hInstance
			invoke	CreateThread,NULL,0,offset _WinMain,NULL,\
				NULL,addr @dwThreadID
			invoke	CloseHandle,eax
		.endif
		mov	eax,TRUE
		ret

DllEntry	Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		End	DllEntry

test.rc

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include		<resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define		ICO_MAIN	0x1000
ICO_MAIN	ICON		"Main.ico"

test.def

EXPORTS

Makefile

DLL = test
RES = $(DLL).res

ML_FLAG = /c /coff
LINK_FLAG = /subsystem:windows /Dll

####################################################
# 创建共享数据段的DLL时使用的连接选项
# LINK_FLAG = /subsystem:windows /Dll /section:.bss,S
####################################################

$(DLL).dll: $(DLL).obj $(DLL).def $(DLL).res
	Link  $(LINK_FLAG) /Def:$(DLL).def $(DLL).obj $(DLL).res

.asm.obj:
	ml $(ML_FLAG) $<
.rc.res:
	rc $<

clean:
	del *.obj
	del *.exp
	del *.lib
	del *.res

效果

  1. 打开任务管理器,找到程序的 pid
  2. 以超级管理员权限打开 dll注入工具
  3. 选中要注入的 dll,注入

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嗨!对于逆向学习汇编语言的学习笔记,我可以给你一些基本的指导。首先,汇编语言是一种低级语言,它与计算机的底层硬件密切相关。逆向工程则是通过分析和理解已编译的程序来获取程序的内部信息。 以下是一些学习汇编语言和逆向工程的建议: 1. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言和逆向工程的过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值