小白管理器V1.1版(汇编版)

用汇编写了个半成品(部分技术超越暂时..待V1.2以后版本那啥)

功能有:

(1)获取内存状态

(2)端口占用状态

(3)进程列表+进程管理

(4)清理系统垃圾(非外部调用,外部调用参见https://shadowkong.com/archives/133

首先上图~

比较悲剧的是端口监听功能上实现得太没进步了~还是外部调用…..

.

.

.

.

.

.

.

.

.

详解:

<1>获取内存状态

代码:

_GetMemInfo proc  uses ecx
local @stMemInfo:MEMORYSTATUS
local @szBuffer[1024]:byte
local @szBuffer1[50]:byte
.while F_STOP
mov @stMemInfo.dwLength,sizeof @stMemInfo
invoke GlobalMemoryStatus,addr @stMemInfo
invoke wsprintf,addr @szBuffer,addr szInfo,\
@stMemInfo.dwTotalPhys,@stMemInfo.dwAvailPhys,\
@stMemInfo.dwTotalPageFile,@stMemInfo.dwAvailPageFile,\
@stMemInfo.dwMemoryLoad,\
@stMemInfo.dwTotalVirtual,@stMemInfo.dwAvailVirtual
invoke SetDlgItemText,hWinMain,IDM_INFO,addr @szBuffer
invoke wsprintf,addr @szBuffer1,addr szInfo1,@stMemInfo.dwMemoryLoad
invoke SendMessage,hWinStatus,SB_SETTEXT,3,addr @szBuffer1
invoke Sleep,1000
.endw
ret
_GetMemInfo endp
;————————————————————————–
参考罗老师的子程序,创建线程把这个作为回调给它~这样获取内存就能自己一个人在那里工作了~
经过修改的回调函数具有更人性化的功能~
首先看红色代码句,判定停止工作的条件是一个全局变量
也就是通常人们所说的全局标志~
只要F_STOP不是ZERO 线程就一直运行下去~
再看绯红色代码句,在循环中让线程睡觉(挂起)1秒~
这主要考虑到在对文本框发送内存状态转换后的内容替换的闪烁问题…
经过挂起1秒 发现效果不明显..就像叫你工作然后只给你每次休息一秒你还是觉得累一样~
举个更贴切的例子就像我叫清风去捕鱼,然后没给他打电话不准停止捕鱼一样~但是他每打一次鱼都能休息1秒~
可是悲剧的是每次休息完他都喊累…哎
<2>清理垃圾
前面说到了外部调用.BAT文件..通过管道把文件运行返回的信息返回到程序缓存区..
今天在这里改进下,不需要外部调用直接…内部…原理是找到特征文件..然后invoke DeleteFile…
这里要知道几种特殊文件夹的路径等…例如怎么获取本机的临时文件夹拉 等等~
<3>进程列表+进程管理
遍历原理:
主要是调用CreateToolhelp32Snapshot
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
再通过
Process32First Process32Nex 遍历进程 +进程IP~
然后再写到列表框上…
结束进程原理:
通过OpenProcess获得选定进程的ID
然后调用TerminateProcess强制结束…这种方法虽然可以实现结束 但是..不是最好的方法..万一进程没保存啥重要东西那不是悲剧??
除此之外还在程序上加了各种控件和绘图等小技巧…算是对之前学习的一个总结归纳吧~
附上PE文件下载连接….
PS:内存状态子功能改写到书本例子~只不过加入了线程调用运行~

汇编GDI绘图晋级篇:屏幕重绘并实现简单的左键控制

前面说到汇编仅仅用一个API就实现窗口重绘..

https://shadowkong.com/archives/104

今天再次用汇编尝试屏幕重绘 虽然效果一样 但是用到的API大有不同~

整个屏幕重绘的关键代码:

invoke GetDC,hWin2
mov @hDc2,eax;
invoke CreateDC,addr szDriver,NULL,NULL,NULL
mov @hDc1,eax;
invoke GetClientRect,hWin2,addr @stRect
invoke BitBlt,@hDc2,0,0,@stRect.right,@stRect.bottom,\
@hDc1,0,0,SRCCOPY
invoke ReleaseDC,hWin2,@hDc2
invoke DeleteDC,@hDc1

窗口重绘和屏幕重绘分别用到不同的API配对~

说实话屏幕重绘其实就是那么简单~

但是我额外给它加了个功能:

屏幕响应窗口按键~

也就是相当于QQ远程协助中的远程控制…

当然这里只实现了简单的 鼠标键键和鼠标指针移动…

上图上图..

原理在于:

用特别的API获取屏幕句柄~

.elseif eax== WM_CREATE

invoke GetDesktopWindow

mov WindowHwnd,eax

然后通过处理窗口按键时候的坐标在屏幕相应坐标响应事件~

mov eax,@stPoint.y

shl eax,16

add eax,@stPoint.x

invoke PostMessage,WindowHwnd,WM_LBUTTONDOWN,MK_LBUTTON,eax

invoke PostMessage,WindowHwnd,WM_LBUTTONUP,0,eax

呃 就是这样…

基本原理就是这样…

更深入的问题是:

如何是它能实现响应IO消息?

如何与HOOK联合起来形成屏幕监视?

如何与网编联合起来实现类似远程控制?

这涉及到TCP\IP协议族的图片传输问题..(暂时不能解决)

浅谈WIN32汇编下捕获远程消息

最近闲来无事去搞了下网编 不如直接说看了下教程比较真实,研究了下在TCP/IP协议族的汇编编程和WINDOWS远程钩子,发现其中两者联合起来用 会有意想不到的效果,(所谓的最简单的监视病毒应该就是这样子的吧)。

简单的说:

原理

通过TCP协议 建立连接 建立套接字 绑定IP  建立监听  路由器映射 等一系列的措施后

A:在服务端上建立远程日记钩子(其他钩子也成吧..)在钩子上指定捕获消息参数(例如键盘参数:WM_KEYDOWN)

B:在客户端建立接收器 分析数据包和接收消息

代码实现:(网站空间有限 只给出具体API不详细解说用法)

建立连接服务端部分:

A:调用 WSAStartup 和socket建立套接字(具体逻辑过程)

B:调用WSAAsyncSelect,htons,bind绑定和监听..

C:调用RECV函数来接受数据

别忘记在关闭程序的时候调用closesocket关闭套接字

建立连接客户端部分:

A:socket,WSAAsyncSelect建立套接字

B:连接到服务器中监听的套接字inet_addr,htons,connect

C:recv调用RECV函数来接受数据

别忘记在关闭程序的时候调用closesocket关闭套接字

钩子部分:(在服务端)

A:在初始化消息处建立钩子,调用SetWindowsHookEx

B:编写钩子回调函数,调用CallNextHookEx(防止钩子不止一个,若同类钩子多个需要调用这个函数传递消息),如果是捕获对方WM_KEYDOWN消息的话则调用GetKeyboardState,GetKeyState处理按键消息

C:向客户端(远程监视方)发生消息send

贴点代码比较好看?

钩子回调函数部分…

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

HookProc proc _dwCode,_wParam,_lParam
local @szKeyState[256]:byte
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN
invoke GetKeyboardState,addr @szKeyState
invoke GetKeyState,VK_SHIFT
mov @szKeyState + VK_SHIFT,al
mov ecx,[ebx].paramH
shr ecx,16
invoke ToAscii,[ebx].paramL,ecx,addr @szKeyState,addr szAscii,0
mov byte ptr szAscii [eax],0
.if szAscii == 0dh
mov word ptr szAscii+1,0ah
.endif
invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_REPLACESEL,0,addr szAscii
.endif
assume ebx:nothing
.endif
popad
xor eax,eax
ret
HookProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

以下是效果图…

结果被清风美其名曰..键盘记录器..

只上传PE文件..源码就那啥了..毕竟不是啥好东西

http://dl.dbank.com/c0fb6y7fyk

汇编实现扫描+清理垃圾

最近清理系统垃圾,发现三年前清风给了个文件…

是清风给的一个批处理…代码如下:(保存为.BAT文件即可)
[code lang=”java”]

@echo off
echo 正在清除系统垃圾文件,请稍等……
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q “%userprofile%\Local Settings\Temporary Internet Files\*.*”
del /f /s /q “%userprofile%\Local Settings\Temp\*.*”
del /f /s /q “%userprofile%\recent\*.*”
echo 清除系统垃圾完成!
echo. & pause

[/code]

代码没什么问题..问题在于执行批处理后CMD跳出的不兼容UNICODE,而导致少部分返回的信息根本就是乱码…(当然在VS2008的命令提示下支持)
于是用汇编写了个类似的…接下来看下返回信息的效果:
执行中:
顺便提下..执行的过程中是虚化的 因为..删除文件过程中涉及内存优化的问题..暂时解决不了~这个技术难题也导致我在用自己的程序全盘扫描完毕的时候和用AVAST全盘扫描完毕后机子的速度天差地别…
虚化主要实现首先是给窗口WS_EXD_LAYERED属性…
;code>>>
invoke    GetWindowLong,hwnd,GWL_EXSTYLE
or             eax,WS_EXD_LAYERED
invoke    SetWindowLong,hwnd,GWL_EXSTYLE,eax
invoke     SetLayeredWindowAttributes,hwnd,0,bAlpha,LWA_ALPHA
;end>>>至于放在什么位置随意拉~
执行完毕后看效果:
完全没有UNICODE乱码的问题….
窗口下方还有扫描硬盘文件的功能  功能的实现主要是参照教程什么的~
一下是各个功能实现用到的技巧点:
虚化:指定窗口WS_EXD_LAYERED,调用SetLayeredWindowAttributes
清理垃圾:创建管道,调用clean.bat并把信息写入窗口文本
;CODE>>>
push eax
mov    eax,100
mov    bAlpha,eax
invoke     SetLayeredWindowAttributes,hWnd,0,bAlpha,LWA_ALPHA
pop   eax;虚化
.while TRUE
invoke RtlZeroMemory,addr buffer,1024
invoke ReadFile,hRead,addr buffer,1023,addr bytesRead,NULL
.if eax==NULL
.break
.endif
invoke SendMessage,hwndEdit,EM_SETSEL,-1,0
invoke SendMessage,hwndEdit,EM_REPLACESEL,FALSE,addr buffer
.endw
push eax
mov    eax,255
mov    bAlpha,eax
invoke     SetLayeredWindowAttributes,hWnd,0,bAlpha,LWA_ALPHA     ;ÉèÖÃ͸Ã÷
pop eax;实化
;END>>
清理垃圾:其实还可以用筛选扫描直接DELDETEFILE…这样估计就不会卡机0.0
扫描:定义COM接口 调用FindFirstFile FindNextFile等..
硬盘文件大小的计算这个就没啥好说了..分析WIN32_FIND_DATA结构
存在的问题:(1)扫描返回信息的时候输出的信息处理不完善.
(2)扫描完后的收尾工作不会 例如整理内存
(3)清理垃圾的时候会卡机..(虚化的作用是防止在这个时候给窗口发送其他消息)
(4)筛选扫描上有问题…分析 WIN32_FIND_DATA结构逻辑出问题了
但是清理垃圾的功能还是没问题的…
有个问题强调下..本人业余 (防吐槽)
以下是EXE+源码:

汇编书籍整合

最近有朋友说搞汇编不知道看什么书,哎 当初我也遇到这个问题很困惑了很久~走了许多弯路(什么?看书都走弯路..呃 由于咱实在小白 所以一开始看<C专家编程>果然天书呢..兴许你不会)

此处用来整合我许久以来在互联网上多处寻得的关于学习汇编各个方面的书籍,由于可能对于初学者来说,从什么地方开始都是一个难题..(呵呵 有点自大了呢)..PPS:自己没看过的我不会贴上来..

本来这贴在那啥博客上的,但是后来发现一个问题所以贴回这里了..果然自己的网站里啥都方便啊~但是认为太SB的东西又不敢挂上来 (现在的情况是,偶尔会认为自己昨天之前很SB)..因为只有可怜的300MB啊~而且两个邮箱都好贵好贵了..

(1)16位入门经典书籍 王爽汇编语言 经典中的经典(给朋友的建议:如果你真的想学汇编,这本书就必须完成其中的各个任务,否则浪费了王爽老师的一片苦心)

作者:王爽

这本书没找到清晰版 不过这个版本也不错 你可以去其他地方找找看..

汇编语言:http://dl.dbank.com/c02witsx3z

答案:http://dl.dbank.com/c0in8om672

(2)Win32入门经典书籍 高清版 INTEL汇编语言程序设计

作者:Kip Irvine

作者网站:http://kipirvine.com/asm/

网上很多模糊版本 唯独这个是高清版 花了我不少时间去找呢…(源代码随便G.CN上都有 这里就不放上来了)

我曾致电作者,不过作者似乎一直忙着另外一本书的写作 无暇顾及读者呢..呵呵 当然也可能是由于我魅力不够..抑或ZG人在国际形象不好。。。人家懒得理

A卷:http://dl.dbank.com/c01i0vqwk5#

B卷:http://dl.dbank.com/c089t7nqw4

(3)Win32汇编编程技巧介绍书:Iczelion的Win32汇编教程

作者:Iczelion

着本书总的来说是相对于有一定Win32汇编基础的或者是有高级编程语言基础的人,总的来说就是API,API,API 几个经典的API调用,但是的却非常精简 全是必要的技术部分 值得一看!

书籍:http://dl.dbank.com/c0ltkvv7te

(4)从DOW到WIN32汇编书 出自AOGO论坛的 DOS2WIN32

整合:AOGO坛友

这资料总的来说是不错的,因为整合了AOGO汇编论坛的精华部分,但是看个人喜欢不喜欢咯..

AOGO论坛虽然现在人气下降,但确是我最喜欢的论坛之一..感觉一下回到了90年代的..清新自然

DOS2Win:http://dl.dbank.com/c0hypuzhfn

(5)Win32位汇编最经典书籍:Windows环境下32位汇编语言程序设计 第一版 第二版

作者:罗云彬

这本书一直被汇编界奉为经典中的经典 等级和王爽老师的同级 一个16位 一个32位 撑起整个汇编语言学习界,由于汇编本来研究的人就不多 学的人也不多,这就造就了关于汇编的教程少之又少 幸亏有这这两个老师的努力编写,在这里必须给他们敬礼..以下是URL

说明:第一版不是扫描版而是完全的字体版 非常好 我找了很久才找到..

第二版是扫描版 清晰度一般..第二版在内容上和第一版差不多 但是第二版扩充了点内容…

第一版:http://dl.dbank.com/c0gn6a6lzx

第二版:http://dl.dbank.com/c0w2dh7s0b

(6)保护模式下编程:保护模式下汇编编程

作者:昌哥

这本书..不好描述 但是很受汇编学习着的欢迎..当然也许我说错了..

书籍:http://dl.dbank.com/c0oe8t9igy

PS:暂时就那么多,以后再更新

汇编实现简单的关机软件

最近很多朋友老纠结于怎么定时关机..所以用汇编做了个~

当然只是实现 没去完善…有兴趣的朋友可以拿去完善下~

功能有重启关机注销等…定时是定到规定时间的~

其实这比动态关机时间更难实现..

仅限XP…如果是WIN7要改下调用路径..

怎么改:

以下API就是WINDOWS提供的最好方法:

invoke GetCurrentDirectory,dwBufferSize,lpBuffer ;获取当前目录
invoke GetTempPath,dwBufferSize,lpBuffer ;获取临时目录
invoke GetWindowsDirectory,lpBuffer,dwBufferSize ;获取Windows目录
invoke GetSystemDirectory,lpBuffer,dwBufferSize ;获取系统目录

你要调用那个系统PE文件就..捕获它所在的..目录然后.加上你要调用的文件名..

http://dl.dbank.com/c0qxwtvgyb