调用CMD遇到的诡异问题

在Win下通过代码调用CMD执行批处理不是什么新技术了,主要是有一下三种方式,这里粗略提下.我实现过C版 C++版,汇编版,AS版的调用执行批处理命令.下面是C++版本的做法:

直接调用函数system

最简单的方式可如下调用system函数执行命令

system("echo Hello CMD");

缺点:会显示CMG控制台窗口,无回显数据,优点:简单直接

使用ShellExecuteEx

其次简单的方式是使用ShellExecuteEx函数

SHELLEXECUTEINFO sei; 
memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); 
sei.cbSize = sizeof(SHELLEXECUTEINFO); 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
sei.lpVerb = _T("open"); 
sei.lpFile = _T(strToolName); 
sei.lpParameters = "echo Hello CMD";
// SW_HIDE SW_SHOWNORMAL 参数决定是否显示控制台
sei.nShow = SW_HIDE;//; SW_SHOWNORMAL
ShellExecuteEx(&sei); 
// 等待进程结束再往下执行
WaitForSingleObject(sei.hProcess, INFINITE); 
CloseHandle(sei.hProcess); 

缺点:无回显数据,优点:可隐藏控制台

继续阅读“调用CMD遇到的诡异问题”

CrackMe#40:Static

这是一个非常有意思的CrackMe!

首先查壳 又是UPX 直接手脱 脱壳毫无技术含量不值一提.

然后载入OD直接找到算法部分~

发现这个CM比较特别 其中的两个静态变量作为标志更是亮点中的亮点~

这意味着要输入两次Key验证,第一次使得第一个STATIC a==1,b==1;

第二次使得STAIC b++;

要当a==1,b==2的时候才算CONS~

在验证过程会发现算法只取前8位注册码 不够8位用0x20补全~

而且这个算法也是这个CM的非常漂亮的地方之一,特别是第一轮的~:

第一轮:

/*************************************************/

004568FC  /$  55            push    ebp
004568FD  |.  31C9          xor     ecx, ecx
004568FF  |.  8D30          lea     esi, dword ptr [eax]
00456901  |.  83C6 04       add     esi, 4
00456904  |.  BB 998F3337   mov     ebx, 37338F99
00456909  |.  AD            lods    dword ptr [esi]                  ;  后四位
0045690A  |.  31C3          xor     ebx, eax
0045690C  |.  C1C3 30       rol     ebx, 30
0045690F  |.  81F3 00009999 xor     ebx, 99990000
00456915  |.  C1CB 50       ror     ebx, 50
00456918  |.  83EE 08       sub     esi, 8
0045691B  |.  AD            lods    dword ptr [esi]                  ;  前四位
0045691C  |.  01C3          add     ebx, eax
0045691E  |.  81F3 99999999 xor     ebx, 99999999
00456924  |.  C1C3 70       rol     ebx, 70
00456927  |.  81FB 75533D53 cmp     ebx, 533D5375
0045692D      75 1C         jnz     short 0045694B
0045692F  |.  41            inc     ecx/*标志*/
00456930  |.  83EE 04       sub     esi, 4
00456933  |.  AD            lods    dword ptr [esi]                  ;  前四位
00456934  |.  89C3          mov     ebx, eax
00456936  |.  AD            lods    dword ptr [esi]                  ;  后四位
00456937  |.  C1CB 80       ror     ebx, 80
0045693A  |.  81F3 99990000 xor     ebx, 9999
00456940  |.  31C3          xor     ebx, eax
00456942  |.  81FB 998F3337 cmp     ebx, 37338F99
00456948      75 01         jnz     short 0045694B
0045694A  |.  41            inc     ecx/*标志*/
0045694B  |>  5D            pop     ebp
0045694C  \.  C3            retn
/******************************************************/
分析算法之前我们设两个变量:
L4==后四位注册码
F4==前四位注册码
把上面第一轮的算法翻译成数学公式就是:
(I)
(((((L4 xor 0x37338F99)rol 0x10)xor 0x99990000)rol 0x10+F4)xor 0x99999999)rol 0x10 ==0x533D5375
(II)
(F4 xor 0x00009999) xor L4==0x37338F99
由上面的(I)(II)可得:
(III)
L4==0x37338F99 xor (F4 xor 0x00009999)
再由(I)(III)可得:
(IIII)
(((((F4 xor 0x00009999)rol 0x10)xor 0x99990000)rol 0x10+F4) xor 0x99999999)rol 0x10==0x533D5375
由(IIII)可以看出 F4在第一轮中高低位互相不影响~也就是说 在这里L4 高低位是独立的~
然后我们由(IIII)推出L4  F4的计算公式:
F4=((0x533D5375 rol 0x10)xor 0x99999999)/2
L4=(F4 xor 0x9999)xor 0x37338F99
然后 第一个注册码就是:F4+L4 ==ReveRsER
第二轮的算法相对于第一轮来说没啥好说的~
/******************************************************/

一组Key:

FirstTime:ReveRsER

SecondTime:CraCkiNG

DownMe:KeyGen

逆向反汇编基础之三十一:新手级别,弄完上班啊还~

这个CM就像题目一样,这都是新手入门的CM,但是要从每个CM中学到东西,是发现BUG还是发现其中算法的妙处 抑或是发现其中’稀有”ASM指令的使用~

这都是非常有意思的事情~

YOUS  上班去~

一组可以的Key:

ShadowKong

0536861646F774B6F6E67

http://dl.dbank.com/c085aep17a

小白管理器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:内存状态子功能改写到书本例子~只不过加入了线程调用运行~

浅谈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