|
[求助]MASM32V9编译怎么不行呀?
谢谢,可以输出了,可是执行完总是出现错误,就是遇到问题需要关闭 .386 .model flat,stdcall option casemap:none includelib \masm32\lib\msvcrt.lib printf PROTO C:DWORD,:VARARG .data msg db "xxxxxxxxxxxx",0 //",0"是干嘛的? .code start: push offset msg call printf add esp,4 end start |
|
|
|
[求助]MASM32V9编译怎么不行呀?
子过程把返回值存到EAX,然后调用函数去读EAX?? |
|
|
|
[注意]新手报到
自称新人菜鸟的很大一部分是高手,让我感觉压力好大 |
|
[求助]MASM32V9编译怎么不行呀?
改成这个不出错了,可是为什么不出现printf结果呀? _main是不是已经相当于start:那里了? .386 .model flat,stdcall ;这里我们用stdcall 就是函数参数 压栈的时候从最后一个开始压,和被调用函数负责清栈 option casemap:none ;区分大小写 includelib \masm32\lib\msvcrt.lib ;这里是引入类库 相当于 #include<stdio.h>了 printf PROTO C:DWORD,:VARARG ;这个就是声明一下我们要用的函数头,到时候 汇编程序会自动到msvcrt.lib里面找的了 ;:VARARG 表后面的参数不确定 因为C就是这样的printf(const char *, ); ;这样的函数要注意 不是被调用函数负责清栈 因为它本身不知道有多少个参数 ;而是有调用者负责清栈 下面会详细说明 .data szTextFmt BYTE '%d',0 ;这个是用来类型转换的,跟C的一样,字符用字节类型 a dword 1000 ;假设 b dword 2000 ;处理数值都用双字 没有int 跟long 的区别 ;/**////////////////////////////////////////////////////////////////////////////////////////// .code _test proc A:DWORD,B:DWORD mov eax,dword ptr ss:[ebp+8] add eax,1 mov edx,dword ptr ss:[ebp+0Ch] add edx,100 add eax,edx ret _test endp _main proc push dword ptr ds:b ;反汇编我们看到的b就不是b了而是一个[*****]数字 dword ptr 就是我们在ds(数据段)把[*****] ;开始的一个双字长数值取出来 push dword ptr ds:a ;跟她对应的还有 byte ptr ****就是取一个字节出来 比如这样 mov al,byte ptr ds:szTextFmt ;就把 % 取出来 而不包括 d call _test push eax ;假设push eax的地址是××××× push offset szTextFmt call printf add esp,8 ret _main endp end _main start: call _main ret end start |
|
[求助]MASM32V9编译怎么不行呀?
我改成了下面的,可是运行时怎么出错呀 .386 .model flat,stdcall ;这里我们用stdcall 就是函数参数 压栈的时候从最后一个开始压,和被调用函数负责清栈 option casemap:none ;区分大小写 includelib \masm32\lib\msvcrt.lib ;这里是引入类库 相当于 #include<stdio.h>了 printf PROTO C:DWORD,:VARARG ;这个就是声明一下我们要用的函数头,到时候 汇编程序会自动到msvcrt.lib里面找的了 ;:VARARG 表后面的参数不确定 因为C就是这样的printf(const char *, ); ;这样的函数要注意 不是被调用函数负责清栈 因为它本身不知道有多少个参数 ;而是有调用者负责清栈 下面会详细说明 .data szTextFmt BYTE '%d',0 ;这个是用来类型转换的,跟C的一样,字符用字节类型 a dword 1000 ;假设 b dword 2000 ;处理数值都用双字 没有int 跟long 的区别 ;/**////////////////////////////////////////////////////////////////////////////////////////// .code _test proc A:DWORD,B:DWORD push ebp mov ebp,esp mov eax,dword ptr ss:[ebp+8] add eax,1 mov edx,dword ptr ss:[ebp+0Ch] add edx,100 add eax,edx pop ebp retn 8 _test endp _main proc push dword ptr ds:b ;反汇编我们看到的b就不是b了而是一个[*****]数字 dword ptr 就是我们在ds(数据段)把[*****] ;开始的一个双字长数值取出来 push dword ptr ds:a ;跟她对应的还有 byte ptr ****就是取一个字节出来 比如这样 mov al,byte ptr ds:szTextFmt ;就把 % 取出来 而不包括 d call _test push eax ;假设push eax的地址是××××× push offset szTextFmt call printf add esp,8 ret _main endp end _main start: call _main end start |
|
|
|
[分享]OD断点插件更新
能否问一下咋装了,怎么用呀? |
|
[求助]OD跟踪不到软件如何取得输入的用户名和密码,大家来看看
VC是怎么得到自己的文本框内容的 |
|
[求助]APIHOOK的问题
就是那样做的呀 |
|
[求助]APIHOOK的问题
这几句就是 填充上自己的api函数address ProcessHandle := GetCurrentProcess(); DLLModule := LoadLibrary('kernel32.dll'); { 系统函数入口点地址 } BaseAddress := GetProcAddress(DLLModule, 'CreateProcessW'); Dat := DWORD(@MyCreatePW); Move(Dat, Tmp, 4); //这个不知道是为什么 NewPorc[0] := $B8; NewPorc[1] := Tmp[0]; NewPorc[2] := Tmp[1]; NewPorc[3] := Tmp[2]; NewPorc[4] := Tmp[3]; NewPorc[5] := $FF; NewPorc[6] := $E0; NewPorc[7] := 0; WriteProcessMemory(ProcessHandle, BaseAddress, @NewPorc, 8, nSize); |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值