我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片
好消息是我有C++代码,但任务是在C#中完成
C++
//Read the first values of the packet received
DWORD image[200 * 64] = {0}; //used for algoritm(width always = 200 and height always == 64)
int imgIndex = 0; //used for algoritm
unsigned char rawbytes_[131072] = {0}; //read below
unsigned char * rawbytes = rawbytes_; //destrination parameter for decompression(ptr)
compressed = r.Read<WORD>(); //the length of the compressed bytes(picture)
uncompressed = r.Read<WORD>(); //the length that should be after decompression
width = r.Read<WORD>(); //the width of the picture
height …Run Code Online (Sandbox Code Playgroud) 我需要做一个反向计算,它包括按位AND运算,我该怎么做?
我尝试了异或,但它没有帮助.
int i = 254 & 2;
Console.Write("254 & 2 ={0}", i + "\n");
Console.Write("{0} ^ 2 ={1}",i, (i ^ 2) + "\n");
Run Code Online (Sandbox Code Playgroud)
不行.我该如何计算?
让我们假设我已经分配了我的编解码器使用VirtualAllocEx的地址(它返回地址),并使用我的代码将代码写入该地址WriteProcessMemory().
这是问题:
如何写一个跳转到我的编解码器?我知道跳转以" E9" 开头,但是如何将返回的地址VirtualAllocEx转换为正确的UInt32(dword),以便调试器/编译器能够理解指令?
例如:
我在地址00402020(原生应用程序的OEP).我写了一个跳转到004028CF(空地方)" JMP 004028CF".以字节为单位的指令如下所示:
CPU Disasm
Address Hex dump Command Comments
00402020 E9 AA080000 JMP 004028CF
Run Code Online (Sandbox Code Playgroud)
" E9"是我们如何表明JMP.怎么样" AA080000",我该如何生成呢?
我需要做类似的事情,所以我可以将JMP初始化为我的codecave,它将位于返回的地址VirtualAllocEx().
任何帮助将不胜感激!
提前致谢.
我用谷歌搜索,我说,我已经看到了其他的"重复",但它们都没有在Delphi 2009中更新到更新4.
就像在C#中一样,我希望在线或尽可能短地创建一个静态变量.最后它就像一个全局变量,但它的排序.
在delphi 2009中最简单的方法是什么?
编辑
我按照你的一些答案,但它不起作用.
类型:
type
TmyClass = class(TObject)
var staticVar:integer;
end;
Run Code Online (Sandbox Code Playgroud)
码:
procedure TForm1.Button1Click(Sender: TObject);
var a:integer;
begin
TMyClass.staticVar := 5; // Line 31
a := TMyClass.staticVar; // Line 32
MessageBox(0,IntToStr(a),'',0);
end;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[DCC Error] Unit1.pas(31): E2096 Method identifier expected
[DCC Error] Unit1.pas(32): E2096 Method identifier expected
Run Code Online (Sandbox Code Playgroud) 通过使用谷歌,我发现了一些在Delphi中使用TDictionary的示例代码的一些不错的片段,但是无法编译它们中的任何一个.
我使用Delphi 2009 Update 1,2,3,4.
当我这样写:
var Dic: TDictionary<Integer,string>;
Run Code Online (Sandbox Code Playgroud)
我得到"Unknown idenitifier TDictionary <,>"
怎么用?
我想将message.WParam转换为Socket.
protected override void WndProc(ref Message m)
{
if (m.Msg == Values.MESSAGE_ASYNC)
{
switch (m.LParam.ToInt32())
{
case Values.FD_READ:
WS2.Receive(m.WParam);
case Values.FD_WRITE: break;
default: break;
}
}
else
{
base.WndProc(ref m);
}
}
public class WS2
{
public static void Receive(IntPtr sock)
{
Socket socket = sock;
}
}
Run Code Online (Sandbox Code Playgroud)
如何将IntrPtr(sock)转换为Socket,以便我可以调用Receive()?
在C++中,它是这样完成的:
tPacket * packet = (tPacket *)data; //data is byte[] array; tPacket is a structure
Run Code Online (Sandbox Code Playgroud)
在C#中:
tPacket t = new tPacket();
GCHandle pin = GCHandle.Alloc(data, GCHandleType.Pinned);
t = (tPacket)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(tPacket));
pin.free();
Run Code Online (Sandbox Code Playgroud)
数据是在通过TCP接收数据包后用作接收缓冲区的字节数组.该代码将数据放入tPacket(结构)的实例中,以便稍后可以访问该结构.
如何在Delphi中完成?
我正在尝试在面板上绘制文本(面板有背景图片).
它工作得很好,但是当我最小化然后最大化应用程序时,文本就消失了.
我的代码:
using (Graphics gfx = Panel1.CreateGraphics())
{
gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
Run Code Online (Sandbox Code Playgroud)
如何保持静态,以免丢失?
如何在没有可停靠窗体的缓慢冻结运动的情况下执行IDE方法或最终制作基本停靠方法?
当我在Delphi中搜索可停靠的表格并在程序员天堂上找到Zibadian的帖子时:
首先:Delphi IDE中的窗口不是MDI格式,而是SDI格式.
现在创建一个可停靠的窗口.
Form2将是可停靠的,Form1将是停靠它的地方.在Form1上放置一个控件(如TPanel)来为DockSite提供服务.确保为该控件将DockSite和UseDockManager属性设置为true.
对于Form2,将DragKind设置为dkDrop,将DragMode设置为dmAutomatic,将UseDockManager设置为true.
那是基本的码头功能.如果您运行程序,显示Form2并将该表单拖到停靠站点上,它应该停靠在该站点上.你甚至可以通过抓住你在IDE中看到的"标题"来取消它.
对我来说,该方法非常缓慢地移动可停靠的形式.然而,Zibadian的答案继续描述IDE如何做到:
IDE的dock方法稍微复杂一些,因为您没有看到docksite.我想,你需要编写一个Form1.OnDockOver或Form1.OnDockDrop来执行它.那些(那些)事件需要在适当的位置显示码头站点.
如何检查我的鼠标左键当前是否按下/拖动某些东西(我预先设置了第一种可能性).
我试过Mouse.IsDraging,但没有结果.
注意:我在我的应用程序中处理鼠标消息,所以如果它是一个WM,它没有问题,只是分享一种方法来完成我的任务.